PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : LaTeX-Standardklassen: Fragen zur Umgebung theindex



lockstep
11-12-2009, 18:53
In der Standardklasse article.cls ist die Umgebung theindex folgendermaßen definiert:



\newenvironment{theindex}
{\if@twocolumn
\@restonecolfalse
\else
\@restonecoltrue
\fi
\twocolumn[\section*{\indexname}]%
\@mkboth{\MakeUppercase\indexname}%
{\MakeUppercase\indexname}%
\thispagestyle{plain}\parindent\z@
\parskip\z@ \@plus .3\p@\relax
\columnseprule \z@
\columnsep 35\p@
\let\item\@idxitem}
{\if@restonecol\onecolumn\else\clearpage\fi}


Die Definition in den Klassen book und report unterscheidet sich hiervon nur durch eine einzige Codezeile (statt \section* wird \@makeschapterhead verwendet).

Die Dokumentation zu den Standardklassen (Version 1.4h, 2007/10/19) hält auf S. 44 zur Umgebung theindex folgendes fest: "Parameter changes to \columnseprule and \columnsep have to be done after \twocolumn has acted. Otherwise they can a ffect the last page before the index." Diese Aussage wirft für mich folgende Fragen auf:

1. Wodurch genau droht eine Beeinflussung früherer Seiten? Die Änderungen der beiden Parameter sollten doch nur lokal (innerhalb der Umgebung theindex) wirksam werden.

2. Die Definition von theindex in den KOMA-Script-Klassen ähnelt grundsätzlich der der Standardklassen; die Parameter von \columnsep und \columnseprule werden jedoch gesetzt, bevor \twocolumn aufgerufen wird. Die theindex-Definition der Klasse memoir ändert die beiden Parameter ebenfalls vor dem (in dieser Klasse optionalen) Aufruf von \twocolumn. Ein Irrtum des KOMA-Script-Autors und des Autors von memoir?

3. Definiert man testhalber eine Umgebung, in der (ähnlich wie in theindex) auf \twocolumn geschaltet wird, so wird eine Änderung von \columnsep nur berücksichtigt, wenn sie vor \twocolumn erfolgt. Änderungen des Spaltenabstands nach dem Befehl \twocolumn werden dagegen ignoriert. Deutet dies auf einen Bug in der theindex-Definition der Standardklassen hin? Minimalbeispiel:



\documentclass{article}

\usepackage[latin9]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[ngerman]{babel}

\usepackage{blindtext,microtype}

\makeatletter
\newenvironment{colseptest}{%
\if@twocolumn
\@restonecolfalse
\else
\@restonecoltrue
\fi
% \columnsep 35pt% Diese Änderung des Spaltenabstands wird erkannt
\twocolumn[\section*{Versuch über den Spaltenabstand}]
\columnsep 35pt% Diese Änderung des Spaltenabstands wird ignoriert
}{%
\if@restonecol\onecolumn\else\clearpage\fi
}
\makeatother

\begin{document}

\begin{colseptest}

\blindtext[3]

\end{colseptest}

\showthe\columnsep%Der Wert außerhalb der Umgebung colseptest
% bleibt jedenfalls unverändert

\end{document}


Über Hinweise von einem der LaTeX-Kundigen dieses Forums wäre ich sehr dankbar.

lockstep

lockstep
11-12-2009, 19:16
Ergänzung zu Punkt 2: In den Klassen scrbook, scrreprt und memoir wird zumindest mittels \clearpage (bzw. verwandten Befehlen) ein Seitenumbruch durchgeführt, bevor der Spaltenabstand für theindex gesetzt wird. In der Klasse scrartcl ist dies nicht der Fall; der Seitenumbruch erfolgt erst mittels \twocolumn.

lockstep

lockstep
12-12-2009, 19:04
Habe noch weiter recherchiert und bin zu zwei Erkenntnissen gekommen:

1. Das Setzen von \columnseprule und \columnsep wurden 2004 bewusst nach hinten verschoben - offenbar, um einen Bug zu beseitigen. (Welchen, ist nicht klar - ich fand in der LaTeX-Bugliste unter der entsprechenden Nummer keinen Eintrag mehr.) Ausschnitt aus classes.dtx:



% \changes{ v1.4f}{2004/02/16}{Moved setting of \cs{columnsep} and
% \cs{columnseprule} later to avoid affecting the wrong page (pr/3616)}


2. Dabei wurde jedoch ein neuer Bug erzeugt: Zumindest die Einstellung des Spaltenabstands wird von \twocolumn nicht mehr erkannt. Dieser Bug wurde im Mai 2005 gemeldet (http://groups.google.com/group/comp.text.tex/browse_thread/thread/937744003315b784/) und war die Grundlage für eine Korrektur in der deutschen Übersetzung der 2. Auflage des LaTeX-Companions. Dieser enthält auf S. 702 f Codebeispiele zur Neuimplementierung von theindex; die beiden Längen \columnseprule und \columnsep werden dabei vor \twocolumn gesetzt.

Diese Korrektur wurde zwar in die memoir-Klasse übernommen, die Standardklassen blieben jedoch (wohl aus Versehen) unverändert.

lockstep

voss
12-12-2009, 23:34
3. Definiert man testhalber eine Umgebung, in der (ähnlich wie in theindex) auf \twocolumn geschaltet wird, so wird eine Änderung von \columnsep nur berücksichtigt, wenn sie vor \twocolumn erfolgt. Änderungen des Spaltenabstands nach dem Befehl \twocolumn werden dagegen ignoriert. Deutet dies auf einen Bug in der theindex-Definition der Standardklassen hin? Minimalbeispiel:



\documentclass{article}

\usepackage[latin9]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[ngerman]{babel}

\usepackage{blindtext,microtype}

\makeatletter
\newenvironment{colseptest}{%
\if@twocolumn
\@restonecolfalse
\else
\@restonecoltrue
\fi
% \columnsep 35pt% Diese Änderung des Spaltenabstands wird erkannt
\twocolumn[\section*{Versuch über den Spaltenabstand}]
\global\columnsep 35pt% Diese Änderung des Spaltenabstands wird ignoriert
}{%
\if@restonecol\onecolumn\else\clearpage\fi
}
\makeatother

\begin{document}

\begin{colseptest}

\blindtext[3]

\end{colseptest}

\showthe\columnsep%Der Wert außerhalb der Umgebung colseptest
% bleibt jedenfalls unverändert

\end{document}


Über Hinweise von einem der LaTeX-Kundigen dieses Forums wäre ich sehr dankbar.


Mit dem Aufruf von \twocolumn wird der Abstand gesetzt. _Danach_ werden
erst die Parameter ausgewertet. Deshalb haben sie keinen Einfluss mehr, selbst wenn man \global verwendet.

Herbert

lockstep
12-12-2009, 23:44
Danke für die zusätzliche Erklärung! Das bestätigt, dass die aktuelle Version (v1.4h) der Standardklassen in dieser Hinsicht fehlerhaft ist.

lockstep