Seite 1 von 1
If-Abfrage in Kopfzeile? \leftmark leer
Verfasst: Di 19. Jul 2011, 11:47
von wajo
Hallo zusammen,
ich sitz gerade an der Finalisierung meiner Thesis und habe folgendes Problem:
Die Kopfzeile bei Kapiteln ohne Sections (Inhaltsverzeichnis, Anhang, Literaturverzeichnis) haben bei meiner Kopfzeile doppelte Angaben drin.
Also es sieht so aus: Inhaltsverzeichnis (Inhaltsverzeichnis), Logik ist dabei Section (chapter) mit folgendem Code (ich möchte gerne eine if-Abfrage, um dies abzufangen):
\documentclass[12pt, oneside, a4paper]{report}
\usepackage[latin1]{inputenc}
\usepackage{bibgerm}
\usepackage{ngerman}
\usepackage{enumitem}
\usepackage{fancyhdr}
\usepackage{etoolbox}
\pagestyle{fancy}
\lhead{\nouppercase{\rightmark}
\ifstrempty{\leftmark}{(\nouppercase{\leftmark})\}}{\}}
\chead{} %leeres mittleres Feld
\rhead{} %leeres rechtes Feld
\lfoot{\today} %Für Datum links unten!
\cfoot{}
\rfoot{\thepage}
\renewcommand{\headrulewidth}{0.5pt}
\renewcommand{\footrulewidth}{0.5pt}
\renewcommand{\chaptermark}[1]{%
\markboth{#1}{}}
\begin{document}
\tableofcontents
\chapter{Einleitung}
\label{sec:einleitung}
\section{Section 1}
\label{sec:section1}
\section{Section 2}
\label{sec:section2}
\chapter{Hauptteil}
\label{sec:hauptteil}
\section{Section 1}
\label{sec:section1}
\section{Section 2}
\label{sec:section2}
\end{document}
Das Problem ist die If-Abfrage um die Klammern und das Kapitel nur anzuzeigen, falls auch \leftmark etwas enthält.
Hat jemand eine Idee? Bin Neuling und wär auch für jeden anderen Vorschlag dankbar!
Re: If-Abfrage in Kopfzeile? \leftmark leer
Verfasst: Mi 20. Jul 2011, 09:28
von KOMA
wajo hat geschrieben:Bin Neuling und wär auch für jeden anderen Vorschlag dankbar!
Einen anderen Vorschlag kann ich Dir unterbreiten:
http://www.golatex.de/wichtige-hinweise ... t4512.html (ganz besonders den Abschnitt »Wenn Du eine Frage stellst«) bzw. die erste Zeile meiner Signatur beachten.
Verfasst: So 21. Aug 2011, 18:24
von MMaa
Was für eine beschissene Antwort.
Solche Leute müßte man gleich kicken !!!
Verfasst: So 21. Aug 2011, 18:47
von bloodworks
MMaa hat geschrieben:Was für eine beschissene Antwort.
Solche Leute müßte man gleich kicken !!!
Du siehst das falsch! Einzig deine Antwort gibt Anlass zur Rüge. Bitte unterlasse in Zukunft solche kontraproduktiven Bemerkungen. Wir haben hier klare Anforderungen an Stil und Inhalt des Forums; vergl. [4] und [5]. Wenn du dich außerstande siehst diese Regeln in Zukunft zu befolgen, bitte ich Dich von diesem Forum Abstand zu nehmen.
(Sollten weitere Fragen zu Regeln oder zwischenmenschliche Probleme austreten, bitte PN an mich. Bei weiteren Beleidigungen, off-topic Gesprächen wird der Thread geschlossen.)
Verfasst: Mo 22. Aug 2011, 11:07
von KOMA
MMaa hat geschrieben:Solche Leute müßte man gleich kicken !!!
Das wäre dann doch etwas übertrieben, nur weil wajo in der ersten Fassung seines/ihres ersten Beitrags hier die Frage in einer Form gestellt hatte, die es nahezu unmöglich machte, sie zu beantworten, ist das noch lange kein Grund wajo deshalb Gewalt anzutun. Da erschien es mir doch besser, ihn/sie darauf hinzuweisen, wie man es besser macht. Das hat ja auch immerhin dazu geführt, dass er/sie seinen/ihren Beitrag nochmals editiert hat. Leider wurde dabei vergessen den Status von "Rückfrage" wieder auf "offen" anzupassen, so dass vermutlich niemand mitbekommen hat, dass die Informationen jetzt den Mindestanforderungen genügen dürften. Ich werde deshalb den Status mal ändern, damit die Frage eine bessere Chance bekommt, doch noch beantwortet zu werden.
@wajo: Danke für die Ergänzung Deines Beitrags!
Re: If-Abfrage in Kopfzeile? \leftmark leer
Verfasst: Mo 22. Aug 2011, 11:38
von KOMA
wajo hat geschrieben:Die Kopfzeile bei Kapiteln ohne Sections (Inhaltsverzeichnis, Anhang, Literaturverzeichnis) haben bei meiner Kopfzeile doppelte Angaben drin.
Deine Angabe bezüglich des Anhangs kann ich nicht nachvollziehen. Bei den Verzeichnissen ist es so, dass \@mkboth mit zwei gleichen Argumenten aufgerufen wird. Damit liefern \leftmark und \rightmark dort also gleiche Ergebnisse. Eine Test darauf, ob \leftmark leer ist, wird hier also vermutlich nicht zum Ziel führen. Vielmehr müsste man testen, ob das Ergebnis von \leftmark und \rightmark gleich ist. Alternativ könnte man dafür sorgen, dass \@mkboth das zweite Argument nicht an \markboth weiterreicht, sondern dort tatsächlich ein leeres Argument setzt. In dem Fall wäre dann aber wiederum nicht \leftmark, sondern \rightmark darauf zu testet, ob es leer ist.
wajo hat geschrieben:\lhead{\nouppercase{\rightmark}
\ifstrempty{\leftmark}{(\nouppercase{\leftmark})\}}{\}}
Hier fehlt auf jeden Fall eine schließende geschweifte Klammer für das Argument von \lhead. Außerdem ist mir nicht klar, wozu Du schließende geschweifte Klammern in der Ausgabe des Kopfes haben willst, was also die \} da sollen. Die erscheinen mir mehr als seltsam.
Wenn ich richtig verstanden habe, was Du suchst, dann müsste Dir
\documentclass[12pt, oneside, a4paper]{report}
\usepackage[ngerman]{babel}% wird im Gegensatz zu ngerman nicht gepflegt
\usepackage{blindtext}% für \blinddocument im Beispiel unten
\usepackage{fancyhdr}
\pagestyle{fancy}
\lhead{\nouppercase{\leftmark\ \rightmark}}
\chead{} %leeres mittleres Feld
\rhead{} %leeres rechtes Feld
\lfoot{\today} %Datum links unten!
\cfoot{}
\rfoot{\thepage}
\renewcommand*{\sectionmark}[1]{\markright{(\thesection~#1)}}% Eventuell auch
% ohne "\thesection~"
\makeatletter
\renewcommand*{\@mkboth}[2]{\markboth{#1}{}}
\makeatother
\renewcommand{\headrulewidth}{0.5pt}
\renewcommand{\footrulewidth}{0.5pt}
\renewcommand{\chaptermark}[1]{\markboth{#1}{}}
\begin{document}
\tableofcontents
\blinddocument\blinddocument% Damit überhaupt eine Kopfzeile sichtbar wird!
\blinddocument\blinddocument% Damit das Inhaltsverzeichnis lang genug wird
\chapter{Kapitel}
\blindtext[5]
\blindtext[5]
\section{Abschnitt}
\blindtext[10]
\end{document}
weiter helfen.
BTW: Vielleicht willst Du Dir einmal die KOMA-Script-Klassen (beispielsweise scrreprt statt report) anschauen. Damit entfällt dann beispielsweise das \nouppercase, weil die Klassen bereits in der Voreinstellung keine Versalien in den Kolumnentiteln verwenden. Bei konsequenter Verwendung von KOMA-Script schrumpft das Beispiel zusammen auf:
\documentclass[12pt,headsepline,footsepline]{scrreprt}
\usepackage[ngerman]{babel}% wird im Gegensatz zu ngerman nicht gepflegt
\usepackage{blindtext}% für \blinddocument im Beispiel unten
\usepackage[automark]{scrpage2}
\pagestyle{scrheadings}
\clearscrheadfoot
\ihead{\leftmark\ \rightmark}
\ofoot[\pagemark]{\pagemark}
\renewcommand*{\sectionmark}[1]{\markright{(\thesection~#1)}}% Eventuell auch
% ohne "\thesection~"
\makeatletter
\renewcommand*{\@mkboth}[2]{\markboth{#1}{}}
\makeatother
\renewcommand{\chaptermark}[1]{\markboth{#1}{}}
\begin{document}
\tableofcontents
\blinddocument\blinddocument% Damit überhaupt eine Kopfzeile sichtbar wird!
\blinddocument\blinddocument% Damit das Inhaltsverzeichnis lang genug wird
\chapter{Kapitel}
\blindtext[5]
\blindtext[5]
\section{Abschnitt}
\blindtext[10]
\end{document}
Re: If-Abfrage in Kopfzeile? \leftmark leer
Verfasst: Mo 22. Aug 2011, 12:00
von Xenara
KOMA hat geschrieben:Eine Test darauf, ob \leftmark leer ist, wird hier also vermutlich nicht zum Ziel führen. Vielmehr müsste man testen, ob das Ergebnis von \leftmark und \rightmark gleich ist.
Den Ansatz hatte ich mir auch überlegt, ich habs aber nicht hinbekommen. Wie würde das funktionieren?
Hier hab ichs mal probiert, mit selbstdefinierten Befehlen funktioniert es, aber mit \leftmark und \rightmark nicht mehr. Z.B. für "Contents" und "Contents" gibt es mir false aus, obwohl es imho true sein sollte?
Wo ist mein Denkfehler?
\documentclass{report}
\usepackage{fancyhdr}
\usepackage{etoolbox}
\pagestyle{fancy}
\begin{document}
% Testen, ob der Befehl mit \ifdefequal prinzipiell funktioniert:
\newcommand{\mya}{A}
\newcommand{\myb}{A}
\ifdefequal{\mya}{\myb}{True}{False}
\clearpage
\tableofcontents
\leftmark \qquad \rightmark
\ifdefequal{\rightmark}{\leftmark}{True}{False}
\chapter{Chapter}
\section{Section}
\leftmark \qquad \rightmark
\ifstrequal{\rightmark}{\leftmark}{True}{False}
\addtocontents{toc}{\newpage}
\chapter{Chapter}
\leftmark \qquad \rightmark
\ifstrequal{\rightmark}{\leftmark}{True}{False}
\end{document}
Verfasst: Mo 22. Aug 2011, 12:39
von KOMA
\rightmark und \leftmark sind ja nicht einfach nur Makros, die einen Text enthalten. Entscheidend ist hier zu was diese bis zum Vergleich expandieren. \ifstrequal macht zunächst für die beiden zu vergleichenden Argumente ein \edef\foo{\detokenize{#1}}. Dabei wird aus \leftmark und \rightmark wieder nur \leftmark und \rightmark. Als nächstes werden die beiden dann mit \ifx verglichen. Letzlich ist das also nur ein \ifx\leftmark\rightmark und das ist nun einmal immer FALSE, weil \leftmark und \rightmark auch dann unterschiedliche definiert sind, wenn sie dieselbe Expansion in der Ausgabe besitzen. Man müsste also eigentlich die \detokenize weg lassen. Das funktioniert dann aber auch wieder nicht, weil \leftmark und \rightmark nicht voll expandierbar sind (erst recht, wenn \MakeUppercase drin vor kommt!).
Übrigens würden Deine Vergleiche ohnehin nicht funktionieren, da der Inhalt der Marken zur Verarbeitungszeit (also zum Zeitpunkt des Vergleichs) und zur Ausgabezeit (innerhalb der output-Routine) unterschiedlich ist. Die ganze Marken-Geschichte ist nicht so trivial, wie sie vielleicht auf den ersten Blick erscheinen mag. Ebenso Vergleiche in TeX.
Deshalb habe ich auch eine Lösung vorgeschlagen, bei der man solche Vergleiche gar nicht erst benötigt.
Verfasst: Mo 22. Aug 2011, 12:55
von Xenara
Vielen Dank für die ausführliche Erläuterung!