PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Getrennte Einträge für Kapitel, Kopfzeile und toc



stax
25-05-2011, 13:49
Hallo,

ich versuche gerade, mir einen Befehl zu basteln, dem ich drei Argumente übergeben kann, die jeweils den Kapitelnamen, die Kopfzeile bei den entsprechenden Kapiteln und den Eintrag im Inhaltsverzeichnis getrennt regeln kann. Durch Suchen habe ich folgende Möglichkeit gefunden:

Im Header definiere ich:


\newcommand{\nocontentsline}[3]{}
\newcommand{\mychapter}[2]{\chapter[#1]{#1\chaptermark{#2}}\chaptermark{#2}}


und dort, wo ich es dann einsetzen will, kommt folgendes:


{\bgroup \let\addcontentsline=\nocontentsline\mychapter{Cha pter Title}{Page Headers} \egroup}

\addcontentsline{toc}{chapter}{\protect\numberline {\thechapter}{toc-entry}}


Das funktioniert. Jetzt würde ich daraus gerne einen Befehl basteln, was ich folgendermaßen versucht habe (diesmal für \section, aber sollte ja keinen Unterschied machen):


\newcommand{\nocontentslin}[0]{}
\newcommand{\mysec}[3]{{\bgroup \let\addcontentsline=\nocontentslin \section[#1]{#1\sectionmark{#2}}\sectionmark{#2} \egroup} \addcontentsline{toc}{section}{\protect\numberline {\thesection}{#3}}}


Das gibt mir auch die richtigen Einträge beim Sektionsnamen, in der Seitenkopfzeile und im Inhaltsverzeichnis. Allerdings taucht gleichzeitig ein kleineres und ein größeres Problem auf:

1. Das kleinere Problem ist, dass ich eine Meldung overfull hbox für die Zeile bekomme, in der \mysec steht, obwohl es nirgendwo im generierten Dokument eine zu lange Zeile erzeugt.

2. Das zweite und gravierende Problem, auf das ich mir hauptsächlich Antwort erhoffe ist, dass es unter dem Sektionsnamen nicht sofort mit dem Text weitergeht, der eigentlich kommen sollte, sondern dass die ersten beiden Zeilen so Aussehen:
tocsection3.3
sectionname
Offensichtlich werden also die Argumente zu \addcontentsline gleichzeitig als Fließtext interpretiert, mir ist leider vollkommen schleierhaft warum. Weiß jemand wiesodas passiert und wie ich das verhindern kann, bzw. hat einen Alternativvorschlag für die Befehlsdefinition?

Schweinebacke
25-05-2011, 14:34
Falls Du KOMA-Script verwendest, gibt es bereits eine fertige Lösung (http://www.komascript.de/screxperimental) dafür.

stax
25-05-2011, 14:48
Hm, ich bin in den absolut letzten Zügen meiner Doktorarbeit (Abgabe diese Woche), und möchte mich nicht jetzt noch auf experimentelle Pakete einlassen, die mir vielleicht an anderer Stelle wieder etwas kaputt machen, da hätte ich auch gar nicht die Zeit, den ganzen Text nochmal durchzuschauen. Auch habe ich bis jetzt kein KOMA-Script verwendet, was ich alles dafür ändern müsste (falls überhaupt).

Ich bin ja (zumindest gefühlt) schon ziemlich nah an einer gut funktionierenden Lösung. Da würde ich gerne Verstehen, warum sie nicht ganz so funktioniert, wie sie soll und das entsprechend verbessern. Falls das nicht möglich ist, würde ich auf meine etwas weniger elegante, aber sicher funktionierende Möglichkeit zurückgreifen.

rais
25-05-2011, 21:11
Moin moin,

Jetzt würde ich daraus gerne einen Befehl basteln, was ich folgendermaßen versucht habe (diesmal für \section, aber sollte ja keinen Unterschied machen):


\newcommand{\nocontentslin}[0]{}
\newcommand{\mysec}[3]{{\bgroup \let\addcontentsline=\nocontentslin \section[#1]{#1\sectionmark{#2}}\sectionmark{#2} \egroup} \addcontentsline{toc}{section}{\protect\numberline {\thesection}{#3}}}

[...]
2. Das zweite und gravierende Problem, auf das ich mir hauptsächlich Antwort erhoffe ist, dass es unter dem Sektionsnamen nicht sofort mit dem Text weitergeht, der eigentlich kommen sollte, sondern dass die ersten beiden Zeilen so Aussehen:
tocsection3.3
sectionname
Offensichtlich werden also die Argumente zu \addcontentsline gleichzeitig als Fließtext interpretiert, mir ist leider vollkommen schleierhaft warum. Weiß jemand wiesodas passiert und wie ich das verhindern kann, bzw. hat einen Alternativvorschlag für die Befehlsdefinition?
Du definierst Deinen \nocontentslin mit Parameteranzahl=0 und setzt \addcontentsline -- der ein paar Parameter erwartet -- innerhalb \mysec auf diesen parameterlosen \nocontentslin, damit wird ein von \section intern (über ein, zwei Umwege) aufgerufener \addcontentsline eben auch parameterlos -- was soll nun mit den Parametern geschehen, die der originale \addcontentsline-Befehl noch kannte?
Das wäre in etwa vergleichbar mit so etwas wie


\newcommand*\foo{}
\foo{a}{b}{c}

-- weder `a', noch `b', noch `c' wird hier in irgend einer Form von `\foo' verwertet.

Anders ausgedrückt: vergleiche mal Deine Definition von `\nocontentslin' mit der von `\nocontentsline' (etwas nördlicher in Deinem Beitrag).;)

MfG

stax
27-05-2011, 11:59
Danke, das war die Lösung!

Ich hatte mit der Anzahl der Parameter auch selbst schon rumgespielt. Allerdings hatte ich zu dem Zeitpunkt noch ein anderes Problem (Referenzen im Kapitelnamen wurden nicht aufgelöst, weil ich \chapter{Name\chaptermark{AltName}\chaptermark{\Al tName}} statt \chapter{Name\chaptermark{AltName}}\chaptermark{\A ltName} definiert hatte und deswegen die Referenzen in Großbuchstaben umgewandelt wurden, bevor er versucht hat, sie im .bib-file zu finden, was dann natürlich nicht mehr möglich war. Seltsamerweise war zu dem Zeitpunkt das Problem, dass \addcontentsline nicht funktioniert hat soweit ich mich erinnere noch nicht gegeben.

Da das Problem außerhalb der Klammer auftritt, in der ich \addcontentsline neu definiere, wundert es mich auch, dass die Anzahl der Parameter im neu definierten \addcontentsline-Befehl wichtig ist...

Egal, jetzt habe ich eine funktionierende Lösung, die bei mir problemlos läuft. Falls mal jemand über den Thread hier stolpern sollte auf der Suche nach einer Lösung wie man Kapitelnamen, Seitenheader und Inhaltsverzeichniseintrag getrennt steuern kann, so funktionierts:



\newcommand{\nocontentsline}[3]{}
\newcommand{\mych}[3]{{\bgroup \let\addcontentsline=\nocontentsline \chapter[#1]{#1\chaptermark{#2}}\chaptermark{#2} \egroup} \addcontentsline{toc}{chapter}{\protect\numberline {\thechapter}{#3}}}


Für \section und \subsection natürlich analog.

stax
10-06-2011, 20:56
Leider ist doch noch etwas kaputt gegangen, und zwar die Zählung, bzw. die Verweise auf die entsprechenden Kapitel.



\mych{bla}{blub}{bum}
\label{my_label}
...
\ref{my_label}

gibt mir nicht die Kapitelnummer des entsprechenden Kapitels aus, sondern die Nummer des letzten Unterkapitels, das vor dem \chapter-Aufruf aktuell war. Woher kommt das, das label befindet sich doch schon im neuen Kapitel, und sonst funktioniert ja auch alles (z.B. Kapitelnummer selbst, \section-Nummerierung)?

rais
10-06-2011, 21:16
Moin moin,

Leider ist doch noch etwas kaputt gegangen, und zwar die Zählung, bzw. die Verweise auf die entsprechenden Kapitel.



\mych{bla}{blub}{bum}
\label{my_label}
...
\ref{my_label}

gibt mir nicht die Kapitelnummer des entsprechenden Kapitels aus, sondern die Nummer des letzten Unterkapitels, das vor dem \chapter-Aufruf aktuell war.
evtl hängt es damit zusammen, daß Dein \mych den \chapter-Aufruf in \bgroup...\egroup klammert?

Genaueres ließe sich vermutlich anhand eines Minimalbeispiels (http://www.mrunix.de/forums/showthread.php?t=66921) Deinerseits sagen...

MfG

stax
10-06-2011, 21:38
Hier ein Minimalbeispiel in dem das Problem auftritt



\documentclass{book}

\newcommand{\nocontentsline}[3]{}

\newcommand{\mych}[3]{{\bgroup \let\addcontentsline=\nocontentsline \chapter[#1]{#1\chaptermark{#2}}\chaptermark{#2} \egroup} \addcontentsline{toc}{chapter}{\protect\numberline {\thechapter}{#3}}}
\newcommand{\mysec}[3]{{\bgroup \let\addcontentsline=\nocontentsline \section[#1]{#1\sectionmark{#2}}\sectionmark{#2} \egroup} \addcontentsline{toc}{section}{\protect\numberline {\thesection}{#3}}}

\begin{document}
\tableofcontents
\chapter{Einleitung}
Einleitung
\section{Blub}
\subsection{Blubblub}

\mych{Hauptteil}{pghdchapter}{Hauptteil-toc}
text
\label{label_mych}
\section{sub}
irgendwas
\mysec{wichtiges Unterkapitel}{pghdsection}{Sektion-toc}
\label{label_mysec}
bla

\chapter{Referenzen}
Wie in Kapitel \ref{label_mych} (Hauptteil) und Sektion \ref{label_mysec} (wichtiges Unterkapitel) dargelegt...

\end{document}


Man sieht eindeutig, dass sich die Referenzen auf das falsche Kapitel beziehen. Aber da die Kapitel selbst ja richtig durchnummeriert werden, genauso wie die Unterkapitel, Gleichungen, etc., gehe ich eigentlich davon aus, dass der Zähler chapter erhöht wird. Ich hab das \label im Beispiel sogar extra noch unterhalb von "text" gesetzt, und der erscheint ja auch schon eindeutig in Kapitel zwei. Von daher kann ich mir auch nicht vorstellen, warum er den \label-Befehl falsch zuordnet.

rais
11-06-2011, 10:09
Moin moin,


Man sieht eindeutig, dass sich die Referenzen auf das falsche Kapitel beziehen. Aber da die Kapitel selbst ja richtig durchnummeriert werden, genauso wie die Unterkapitel, Gleichungen, etc., gehe ich eigentlich davon aus, dass der Zähler chapter erhöht wird. Ich hab das \label im Beispiel sogar extra noch unterhalb von "text" gesetzt, und der erscheint ja auch schon eindeutig in Kapitel zwei. Von daher kann ich mir auch nicht vorstellen, warum er den \label-Befehl falsch zuordnet.
Der von den Gliederungsbefehlen intern aufgerufene \refstepcounter setzt \@currentlabel lokal, d.h. wenn Du einen Gliederungsbefehl in eine Gruppe packst, gilt der so gesetzte \@currentlabel nur _innerhalb_ dieser Gruppe, deshalb gilt für ein nach dieser Gruppe aufgerufenes \label \@currentlabel, wie er _vor_ dieser Gruppe definiert wurde.
Pack also das \label mit in die Gruppe oder -- noch einfacher -- verzichte auf die Gruppe;)


\documentclass{book}

\newcommand{\mych}[3]{%
\chapter[#3]{#1}%
\chaptermark{#2}%
}

\begin{document}
\tableofcontents
\chapter{Einleitung}
Einleitung
\section{Blub}
\subsection{Blubblub}

\mych{Hauptteil}{pghdchapter}{Hauptteil-toc}
\label{label_mych}%
text
\section{sub}
irgendwas

\chapter{Referenzen}
Wie in Kapitel \ref{label_mych} ...
\end{document}

MfG