% \iffalse (meta-comment) % ----------------------------------------------------------------- % File: booktabs-de.dtx % Author: Simon Fear % Maintainer: Danie Els (dnjels@sun.ac.za) % Modifiziert von: Christine R"omer and Thomas Manderla % % This file is part of the booktabs package for publication % quality tables for LaTeX % % Copyright (C) 1995--2005 Simon Fear % % This program is free software; you can redistribute it and/or % modify it under the terms of the GNU General Public License as % published by the Free Software Foundation; either version 2 of % the License, or (at your option) any later version. % % This program is distributed in the hope that it will be useful, % but WITHOUT ANY WARRANTY; without even the implied warranty of % MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the % GNU General Public License for more details. % % You should have received a copy of the GNU General Public % License along with this program; if not, write to the Free % Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, % MA 02111-1307 USA % % ----------------------------------------------------------------- % This file contains the documentations and source code for the % booktabs-de package for use with LaTeX2e. See the file 'README-DE' % for a list of all the files as well as directions for the % installation of this package. % ----------------------------------------------------------------- % \fi % % \iffalse %<*driver> \ProvidesFile{booktabs-de.dtx} % %\NeedsTeXFormat{LaTeX2e}[1999/12/01] %\ProvidesPackage{booktabs-de} %<*package> [2005/04/14 v1.61803 publication quality tables] % % %<*driver> \documentclass{ltxdoc} \usepackage{booktabs}[2005/04/14] \usepackage[latin1]{inputenc} \usepackage[T1]{fontenc} \usepackage[ngerman]{babel} %\usepackage[marginal]{footmisc} \usepackage{charter} \setlength{\parindent}{0pt} \setlength{\parskip}{1ex plus 0.2ex minus 0.1ex} \EnableCrossrefs \CodelineIndex \RecordChanges \setlength\hfuzz{15pt} \hbadness=7000 \MakeShortVerb{\=} \MakeShortVerb{\"} \PageIndex \begin{document} \DocInput{booktabs-de.dtx} \end{document} % % \fi % % \CheckSum{484} % \CharacterTable % {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z % Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z % Digits \0\1\2\3\4\5\6\7\8\9 % Exclamation \! Double quote \" Hash (number) \# % Dollar \$ Percent \% Ampersand \& % Acute accent \' Left paren \( Right paren \) % Asterisk \* Plus \+ Comma \, % Minus \- Point \. Solidus \/ % Colon \: Semicolon \; Less than \< % Equals \= Greater than \> Question mark \? % Commercial at \@ Left bracket \[ Backslash \\ % Right bracket \] Circumflex \^ Underscore \_ % Grave accent \` Left brace \{ Vertical bar \| % Right brace \} Tilde \~} % % % % \DeleteShortVerb{\|} % \GetFileInfo{booktabs-de.dtx} % %\title{Anfertigen von hochwertigen Tabellen mit \LaTeX \thanks{Diese Datei %basiert auf der booktabs-Version vl.61803 und der Revision von %2005/04/14.}} %\author{\Large{Simon Fear}\\300A route de Meyrin Meyrin\\Switzerland.\\\\ %"Uberf"uhrt ins Deutsche\\ von Thomas Manderla und\\ Christine %R"omer\footnote{christine\_roemer@t-online.de}} %\date{Printed \today} % % \maketitle % % \begin{abstract} % \noindent Dieser Artikel beschreibt einige zus"atzliche Befehle in % =booktabs=, geschaffen f"ur die Verbesserung der Qualit"at von % Tabellen in \LaTeX{}. Richtlinien, was eine gute Tabelle % ausmacht, werden in diesem Zusammenhang auch angegeben. Die Ausf"uhrungen % sind zum =booktabs=-Paket aus dem Jahr 2000 (Version 1.61), das % der Ausgabe von 1995 (Version 1.00) einige Verbesserungen hinzugef"ugt % hatte, vor allem =longtable=-Kompatibilit"at. % Weitere Ausgaben (Versionen 1.618, 1.6180 und 1.61803) sind % blo"s \emph{bug patches} und Unterst"utzung f"ur das =colortbl=-Paket\footnote{Von Danie Els % (\texttt{dnjels@sun.ac.za}) in Abwesenheit des Autors.}. % \end{abstract} % % \bigskip % % \section{Einf"uhrung} % % Die unten beschriebenen Routinen sollten das einfache Erstellen von % Tabellen, wie sie in wissenschaftlichen B"uchern und Zeitschriften erscheinen, % erm"oglichen. Was sie von gew"ohnlichen \LaTeX -Tabellen unterscheidet, % ist die vorgegebene Nutzung von Abstand "uber- und unterhalb von Linien, % sowie Linien unterschiedlicher `Dicke'. Was sie weiterhin von Tabellen, wie sie % von vielen Leuten, die \LaTeX{} nutzen, erstellt werden, unterscheidet, ist % das Fehlen vertikaler und doppelter Linien. % % Es muss eine deutliche Unterscheidung zwischen dem, was man hier eine % {\em formale Tabelle} nennt, was ein Set an Werten in beschrifteten Spalten ist, % und dem, was man {\em Tableau} nennen werde, vornehmen. Letzteres ist das, was im % \LaTeX -Handbuch dargestellt ist, und zunehmend auch als Ausgabe vieler % Datenbankverwaltungssysteme zu finden ist. Solche Tableaus haben wahrscheinlich % Icons im "Uberfluss und verwenden sicherlich auch Farben. Das Layout solche eines % {em Tableaus} ist (hoffentlich) etwas Einmaliges, wenn man das Durcheinander an % Material, % das der Designer zu einer sinnvollen Kombination zusammenzustellen versucht, % bedenkt. Das Layout einer {\em Tabelle} hingegen hat sich durch Jahrhunderte an % Erfahrung etabliert und sollte nur in au"sergew"ohnlichen Umst"anden ge"andert % werden. % % Zur Illustration kann dieses Tableau aus dem \LaTeX -Handbuch % herangezogen werden (S.\,64 alte Edition): % % \begin{center} % \begin{tabular}{||l|lr||} \hline % M"ucken & Gramm & \$13.65 \\ \cline{2-3} % & je & .01 \\ \hline % Gnu & ausgestopft & 92.50 \\ \cline{1-1} \cline{3-3} % Emu & & 33.33 \\ \hline % G"urteltier & gefroren & 8.99 \\ \hline % \end{tabular} % \end{center} % % Das ist ein Mischmasch an Informationen, das zwar wahrscheinlich, % so wie es ist, vern"unftig dargestellt ist (Aber ist der Emu nun ausgestopft % oder nicht?). Jedoch sollte es als ver"offentlichte Tabelle viel eher % gem"a"s der Richtlinien, die weiter unten auf der Seite im Handbuch empfohlen % werden, erscheinen: % % \begin{center} % \begin{tabular}{@{}llr@{}} \toprule % \multicolumn{2}{c}{Artikel} \\ \cmidrule(r){1-2} % Tier & Beschreibung & Preis (\$)\\ \midrule % M"ucke & pro Gramm & 13.65 \\ % & pro St"uck & 0.01 \\ % Gnu & ausgestopft & 92.50 \\ % Emu & ausgestopft & 33.33 \\ % G"urtetier & gefroren & 8.99 \\ \bottomrule % \end{tabular} % \end{center} % % Es bedarf viel weniger M"uhe, das als formale Tabelle zu setzen. % Es muss kein neues Layout f"ur alles, was gemacht wird, ausgearbeitet werden. % Zudem kann fast gewiss sein, dass die Daten nicht falsch gelesen werden, weil % der Leser nicht lernen muss, wie er irgendeine neuartige Pr"asentation zu % lesen hat. % % Ungl"ucklicherweise kann die obige Tabelle nicht in reinem \LaTeX , % erzeugt werden. Sie kann so gesetzt werden, aber trotz % bester Bem"uhungen erzeugt das Nutzen simpler =\hline=-Befehle das % Nachfolgende: % % \begin{center} % \begin{tabular}{@{}llr@{}} \hline % \multicolumn{2}{c}{Artikel} \\ \cline{1-2} % Tier & Beschreibung & Preis (\$)\\ \hline % M"ucke & pro Gramm & 13.65 \\ % & pro St"uck & 0.01 \\ % Gnu & ausgestopft & 92.50 \\ % Emu & ausgestopft & 33.33 \\ % G"urteltier & gefroren & 8.99 \\ \hline % \end{tabular} % \end{center} % % Zu beachten ist (wenn es nicht schon offensichtlich ist), dass nicht genug % Abstand zwischen der obersten Linie und dem großen `A' von `Artikel' ist. % "Ahnliches gilt f"ur die anderen Linien: Ein direkter Vergleich zeigt dies % deutlich. % Au"serdem sind in der ersten Version die oberen und unteren Linien % st"arker als die mittlere, die wiederum st"arker als die Teillinie % unterhalb von % `Artikel' ist. Nat"urlich \emph{k"onnte} man =\doublerulesep= neu definieren % und dann =\hline\hline= nutzen, um einen "ahnlichen Effekt zu erzielen. Und man % k"onnte \emph{struts} nutzen, um die Abst"ande zu verbessern. Aber es ist nicht n"otig, % an solche Sachen denken zu m"ussen. % Der =booktabs=-Style definiert seine Befehle so, % dass sich um solche Dinge automatisch gek"ummert wird. % % Allgemein w"urde ich sagen, dass dieses Paket von keinem Interesse f"ur % diejenigen % ist, die nach einer Alternative zu Pic\TeX{} suchen, um schicke Tableaus zu % zaubern. Eher ist es eine Gestaltungsrichtlinie im Bereich Tabellenlayout % f"ur Autoren von wissenschaftlichen Artikeln und B"uchern. % Es geht nicht zu weit, zu sagen, dass, wenn Sie mit den Befehlen dieses Pakets % keine Tabelle erstellen können, es neu entwerfen sollten. % % \subsection{Eine Anmerkung zur Terminologie\label{notation}} % % Im Britischen Setzen wird eine `line' stets `rule' genannt. Vielleicht % verwirrenderweise (jedenfalls aus historischen Gr"unden) wird die `thickness' % einer Linie oft als `width' bezeichnet. (wobei nahezu jeder andere dies % `depth' oder `height' nennen w"urde, wenn sie sich auf eine horizontale % Linie bezieht). Eine `thick black line' wird `heavy % rule' genannt. Ich habe diese Terminologie in den meisten der neuen Befehle % beibehalten. Wenn es f"ur nichts anderes gut ist, dann zumindest, um % Verwirrung mit =\hline= auszuschlie"sen. In der Deutschen "Ubersetzung wird an % der Stelle von `St"arke' gesprochen. % % \section{Das Layout formaler Tabellen} % % Man geht nicht sehr weit fehl, wenn man zwei einfache Regeln % im Hinterkopf behält: % \begin{enumerate} % \item Nie vertikale Linien benutzen. % \item Nie doppelte Linien benutzen. % \end{enumerate} % Diese Richtlinien wirken extrem, aber mir ist noch kein gutes Argument, % warum man sie brechen sollte, untergekommen. Zum Beispiel, wenn man das % Gef"uhl hat, % dass die Information in der linken H"alfte der Tabelle von der rechten % Seite so verschieden ist, dass sie durch eine vertikale Linie getrennt % werden muss, so sollte man stattdessen lieber zwei Tabellen verwenden. % Nicht jeder h"alt sich an die zweite Regel: Ich habe f"ur einen Verleger % gearbeitet, der auf doppelte Linien "uber Summen bestand. Meine Wahl % w"are das nicht gewesen. % % Es gibt drei weitere Regeln, die es wert sind, hier erw"ahnt zu werden, weil % sie normalerweise au"serhalb der Kreise von professionellen Setzern % und Redakteuren unbekannt sind: % \begin{enumerate}\setcounter{enumi}{2} % \item St"uckzahlen sollten in den Spaltenkopf (nicht in den K"orper der % Tabelle) gesetzt werden. % \item Einem Dezimalpunkt sollte stets eine Ziffer vorangehen; also 0.1 % {\em nicht} blo\ss .1. % \item `Ditozeichen', wie G"ansef"'u"schen, sollten nicht benutzt werden, % um einen Wert zu wiederholen. Unter vielen Umst"anden macht eine freie % Zelle das Ganze genauso gut. Falls nicht, sollte der Wert wiederholt % werden. % \end{enumerate} % % Ob Sie den kleinen Penibilit"aten folgen wollen oder nicht, wenn Sie nur die % folgenden Befehle in Ihren formalen Tabellen benutzen, werden Ihnen Ihre Leser % dankbar sein. Ich möchte betonen, dass die Richtlinien nicht nur dazu da sind, % die Pedanten gl"ucklich zu machen. Das Prinzip ist, dass eine verst"arkte Struktur % in der Pr"asentation bereits von Beginn an die Gedanken strukturiert. % % \section{Verwenden der neuen Befehle} % % \DescribeMacro\toprule % \DescribeMacro\midrule % \DescribeMacro\bottomrule % Im einfachsten aller F"alle beginnt eine Tabelle mit =\toprule=, hat % eine einzelne Reihe von Spaltenk"opfen und dann eine trennende Linie, die % =\midrule=. Nach den Datenspalten wird mit =\bottomrule= abgeschlossen. % Die meisten Buchverleger setzen =\toprule= und % =\bottomrule= st"arker (also dicker, siehe Punkt 1.1\ref{notation}) als die % zwischenliegende =\midrule=. Wenn die Tabellen jedoch in sehr kleinen % Schriftgr"o"sen erscheinen, ist es manchmal unm"oglich, diese Unterscheidung zu % treffen und zudem setzen manche Journals routinem"a"sig alle Linien in der % gleichen St"arke. % % Die Linienbefehle hier verwenden alle eine Voreinstellung, der im Dokument % (vorzugs- aber nicht notwendigerweise in der Pr"aambel) nachjustiert werden % kann. F"ur die oberste und die unterste Linie ist diese Voreinstellung % =\heavyrulewidth= und f"ur mittlere Linien ist er =\lightrulewidth= (eine % genauere Beschreibung folgt). In sehr seltenen F"allen, wenn etwas besonderes % getan werden muss, k"onnen die optionalen Argumente in die Linienbefehle % eingesetzt werden, welche folgende formale Syntax haben: % % \begin{quote} % =\toprule=[\meta{wd}] \\ % =\midrule=[\meta{wd}] \\ % =\bottomrule=[\meta{wd}] % \end{quote} % % Hierbei ist \meta{wd} eine \TeX dimension (zum Beispiel 1pt, .5em, % etc.). % % Alle hier beschriebenen Linienbefehle stehen nach dem Abschluss =\\= % der vorigen Reihe (au"ser =\toprule=, der % gleich nach dem =\tabular{}=befehl kommt). In anderen Worten, sie stehen % genau da, wo simples \LaTeX{} =\hline= oder =\cline= erlaubt. % % \DescribeMacro\cmidrule % H"aufig wird eine Teillinie ben"otigt, die sich nur "uber einige der Spalten % erstreckt, wof"ur ein =\cmidrule= (Der Pendant vom \LaTeX =\cline= % Befehl) ben"otigt wird. F"ur gew"ohnlich sollte diese Linie nicht "uber die % gesamte Breite der Spalten reichen. Dies ist insbesondere der Fall, wenn ein % =\cmidrule= direkt nach dem Ende eines anderen begonnen werden muss (\LaTeX % =\cline=n sto"sen hier zusammen, wenn man nicht ganz besonders vorsichtig mit % =\extracolsep= ist). Von daher wird man f"ur gew"ohnlich die optionalen % `Trimm'befehle nutzen wollen. % % Die Trimmbefehle stehen, wenn sie "uberhaupt genutzt werden, in % Klammern (wie diese hier), ohne trennende Leerzeichen. Die m"oglichen % Festlegungen sind =r=, =r{=\meta{wd}=}=, =l= und % =l{=\meta{wd}=}=, oder jede Kombination davon, wobei \meta{wd} eine % Abmessung ist, und =r= und =l= anzeigen, ob das rechte und/oder linke Ende % der Linie beschnitten werden soll. Die Form ohne explizites Argument entspricht % =r{\cmidrulekern}=, wobei =\cmidrulekern= voreingestellt % $0.5$\,em enth"alt, aber es kann vom Nutzer in der Pr"aambel % festgelegt werden.\footnote{Nutzerr"uckmeldungen ergaben, dass die Vorgabe der % Version 1.00, 0.25\,em, zu klein war. Entschuldigung f"ur alle Verluste an % R"uckw"artskompatibilit"at. Zu beachten ist, dass das urspr"ungliche % Verhalten einfach durch \texttt{\textbackslash cmidrulekern} in der Pr"aambel % wiederhergestellt werden kann, oder einfach \texttt{(r\{.25\,em\})} % verwendet werden kann.} % % Hier ist ein erl"auterndes Beispiel: =(lr{.75em})= macht einen vorgegebenes % linkes Beschneiden und genau $0.75$\,em auf der rechten Seite. =(r{.75em}l)= % ist hier genauso g"ultig.\footnote{\texttt{(lrrlr\{.75em\})} macht "ubrigens das % gleiche: Nur die zuletzt angetroffenen linken und rechten Festlegungen werden % angewandt.} % % Die vollst"andige Syntax des Befehls lautet % \begin{quote} % =\cmidrule=[\meta{wd}](\meta{trim})\{$a$--$b$\} % \end{quote} % wobei \meta{wd} ein optionaler Linienst"arkenbefehl ist, in eckigen % Klammern [wie diese hier] (die % Voreinstellung hierbei ist =\cmidrulewidth=) und das letzte Argument, % \emph{das nicht optional ist}, gibt die Zahlen der Spalten an, die "uberspannt % werden sollen. % % Als Beispiel einer Anwendung dieser Befehle kann der Code, der die % Beispieltabelle oben erzeugte, dienen: % \begin{verbatim} % \begin{tabular}{@{}llr@{}} \toprule % \multicolumn{2}{c}{Artikel} \\ \cmidrule(r){1-2} % Tier & Beschreibung & Preis (\$)\\ \midrule % Mücke & pro Gramm & 13.65 \\ % & pro Stück & 0.01 \\ % Gnu & ausgestopft & 92.50 \\ % Emu & ausgestopft & 33.33 \\ % Gürteltier & gefroren & 8.99 \\ \bottomrule % \end{tabular} % \end{verbatim} % % \DescribeMacro\addlinespace % Gelegentlich m"ochte man ein wenig zus"atzlichen Abstand zwischen manchen Reihen % der Tabelle einzuf"ugen; zum Beispiel vor der letzten Reihe, wenn sie eine Summe % angibt. Dazu bedarf es blo"s des Einf"ugens von % \begin{quote} % =\addlinespace=[\meta{wd}] % \end{quote} % nach den =\\= Abschlusszeichen. Zwischen normalen Textreihen ist der Effekt % genau wie bei herk"ommlichem \LaTeX verwendung von % =\\[\defaultaddspace]=, was ich eher klobig finde. Au"serdem ist es besser % als =\\ \\=, was zu viel Abstand einf"ugt. Zudem kann % =\addlinespace= vor, nach oder zwischen Zeilen verwendet werden, wenn man das % genaue Ausma"s an Abstand, der eingef"ugt werden soll, kontrollieren will. Der % voreingestellte Abstand vor oder nach einer angrenzenden Linie wird entweder % durch genau =\defaultaddspace= oder die Gr"o"se des Abstands, die im optionalen % Argument angegeben wird, ersetzt.\footnote{Das ist eine "Anderung zur Version % 1.00, % wo der Abstand manchmal \emph{zus"atzlich} zum voreingestellten Abstand um die % Linie berechnet wurde.} % % \section{Missbrauch der neuen Befehle} % % F"ur ein Zusammenarbeiten der neuen Linienbefehle mit =\hline= oder % =\cline= kann nicht garantiert werden, auch wenn diese verf"ugbar und % unver"andert bleiben. Man kann sich aber auch keinen Grund vorstellen, % warum man sie vermischen wollte. % % Viel wichtiger ist, dass die Linien, die durch neue Befehle erstellt % werden, unter keiner Garantie mit Vertikalen verbunden werden, die durch ={|}= % -Buchstaben in der Pr"aambel gebaut werden. Das ist ein Feature (siehe oben). Man % sollte in Tabellen einfach keine vertikalen Linien verwenden, Punkt. % % \DescribeMacro\morecmidrules % Wenn man sich vom Benutzen einer Doppellinie beim besten Willen nicht abhalten % kann, wird selbst eine so bizarre Konstruktion wie =\toprule\bottomrule\midrule= % ohne eine Fehlermeldung funktionieren (genauso wie man =\hline= verdoppeln % kann). Diese Linien werden vom normalen \LaTeX separator =\doublerulesep= % getrennt. Wenn die Perversion, doppelte Linien zu setzen, soweit geht, % doppelte =\cmidrule=s einzubauen, so wird man den zus"atzlichen Befehl % =\morecmidrules= ben"otigen, um das ordentlich zu machen, denn normalerweise sind % zwei =\cmidrule=s in einer Reihe eine vern"unftige Konstruktion, die nach zwei % Linien in derselben `Linienreihe' ruft. Daher schreibt der zweite Befehl bei % \begin{quote} % =\cmidrule=\{1-2\}=\cmidrule{1-2}= % \end{quote} % eine Linie, die die erste genau "uberschreibt. % Ich nehme an, man m"ochte dann eher % \begin{quote} % =\cmidrule=\{1-2\}=\morecmidrules==\cmidrule=\{1-2\} % \end{quote} % was eine doppelte Linie zwischen den Spalten eins und zwei ergibt und durch % =\cmidrulesep= getrennt wird (Hinweis: Da eine =\cmidrule= normalerweise % sehr d"unn ist, richtet das normale =\doublerulesep= hier wahrscheinlich % zu viel Abstand ein). Eine ganze neue Reihe an Linien sollte abgeschlossen % werden, bevor der Befehl =\morecmidrules= eingegeben wird. Zu beachten ist, dass % =\morecmidrules= keinerlei Effekt hat, wenn er nicht unmittelbar einer % =\cmidrule= folgt. (d.\,h. es ist kein allgemeiner abstandschaffender Befehl). % % \DescribeMacro\specialrule % Falls man das au"sergew"ohnliche Bed"urfnis hat, genau $0.5$\,em, zwischen zwei % Linien festzulegen, so lie"se sich eine Konstruktion wie =\midrule = % =\addlinespace[.5em] \midrule= verwenden. In einem seltenen Anfall von Toleranz % habe ich dann doch den Befehl % \begin{quote} % =\specialrule=\{\meta{wd}\}\{\meta{abovespace}\}\{\meta{belowspace}\} % \end{quote} % erstellt, bei dem alle drei Argumente obligatorisch sind. Aber, wer den h"aufig % verwendet, hat Zweck und Inhalt der obigen Richtlinien falsch verstanden. Eine % vorangehende Linie f"ugt ihren voreingestellten Abstand nicht unter sich und % eine nachstehende Linie f"ugt keinen Abstand "uber sich hinzu, folglich bekommt % man \emph{genau} den Abstand, der in den Argumenten angegeben wird.\footnote{Das % ist eine "Anderung zur Version 1.00, die vielmehr einen extra % \texttt{\textbackslash doublerulesep}, wo immer sie konnte, hinzuf"ugte.} % % % \section{Booktabs und longtables} % % Wenn man sowohl das =booktabs=- als auch das =longtable=-Paket geladen hat, % k"onnen die =booktabs= Linienbefehle ganz genau wie oben beschrieben in einer % =longtable= verwendet werden. % % Es gibt eine Neuheit, die es wert ist, erw"ahnt zu werden: Innerhalb % einer =longtable= k"onnen die optionalen linken und rechten Trimmbefehle % verwendet werden, die normalerweise nur f"ur =\cmidrule=s, mit =\toprule=, % =\midrule= und =\bottomrule= (und wenn es sein muss auch mit=\specialrule=) % funktionieren. Nutzer, die die vorherige Ausgabe wegen longtable-Kompatibilit"at % gehackt haben,\footnote{Jim Service war der Erste.} schienen alle Linien auf der % rechten Seite um 0.5\,em beschneiden zu wollen. Ich denke, dasselbe l"asst sich % durch =@{}= als Spezifikation der letzten Spalte erreichen. % Dennoch, nach dem Ausarbeiten des restlichen Codes war es ein % leichtes, Parsing f"ur die optionalen Argumente hinzuzuf"ugen, also hab % ich es gemacht. (Ich habe es aber nicht durchgezogen, noch das optionale Beschneiden der % Linien \emph{au"serhalb} einer =longtable= zu erm"oglichen. Das w"are eine % Riesenarbeit gewesen. Wenn man unbedingt beschnittene Linien haben muss, dann % sollte man =longtable=s verwenden!) % % Ein Hinweis etwas technischer Natur: Innerhalb einer =longtable= ergeben % =\hline= und % =\hline\hline= beide eine \emph{doppelte} Linie (um Seitenumbr"uche an % dieser Stelle zu erm"oglichen). Die =booktabs=-Linie tut das hingegen % \emph{nicht}. Die automatische Doppelung von =\hline= in der =longtable= ist % fragw"urdig, sogar nach Aussage der Dokumentation zu dem Paket. % Aber doppelte =booktabs=Linien ergeben auch beinahe gar keinen Sinn. Im % ungl"ucklichen Fall, dass eine =booktabs=linie an einem Seitenumbruch % erscheinen sollte, muss man die notwendigen Anpassungen per Hand machen. % (Im Allgemeinen heißt das, die st"orende Linie zu l"oschen.) % % % \section{Booktabs und das colortbl-Paket} % % =Booktabs= ist jetzt mit dem =colortbl=-Paket kompatibel.\footnote{Seit v1.6180} % Der Befehl \cmd{\arrayrulecolor}\\ % wird farbige Linien hervorrufen, wenn das =colortbl=-Paket geladen ist. % % % \section{Technische Zusammenfassung der Befehle} % % Die neuen Linienbefehle sind innerhalb der voreingestellten =tabular=- (und % =array=-) Umgebungen g"ultig, im modifizierten =tabular= und =array= von % =\usepackage{array}=, und innerhalb der voreingestellten Tabellen und % =longtables= nach\\ % =\usepackage{longtable}=. % % Die Befehle folgen der Standardplatzierungssyntax von =\hline=. % Es kann Platz (sogar ein, aber nicht zwei Enter) % zwischen aufeinanderfolgenden Linienbefehlen sein. % \footnote{Eine willkommene Ver"anderung gegen"uber Version 1.00, % bei der Abstand zwischen Linienbefehlen f"ur r"atselhafte Fehlermeldungen sorgte.} % % Was sich als gro"se Ver"anderung zu vorherigen Ausgaben zeigt, ist, dass % ich innerhalb des Macrocodes jetzt drei Linienklassen definiere. (Im % normalen Gebrauch ben"otigt man diese Definitionen nicht, deshalb habe ich sie % oben nicht erw"ahnt. % Eine Linie der Klasse 1 (ansonsten eine `normale' Linie genannt) ist jede % =\toprule=, =\midrule=, =\bottomrule=, oder =\cmidrule=. Die Linien der Klasse 2 % sind =\specialrule= und =\addlinespace=. Schlie"slich ist eine Linie der Klasse % 0 keine der vorhergehenden -- oder in anderen Worten, "uberhaupt keine % Linie.\footnote{Mit der Ausnahme, dass \texttt{\textbackslash hline} und % \texttt{\textbackslash cline} Klasse 0 sind. Doch es gibt keinen Grund, dar"uber % schlaflose N"achte zu verbringen, da man die beiden Linienziehsysteme nicht % durcheinander bringen m"ochte.} Zu beachten ist, dass =\addlinespace= als % eine Klasse-2-Regel gilt, nicht als Klasse-0-Text. % % Im Folgenden, wird jeder Befehl im `normalen Gebrauch', beschrieben, also % die Linie wird zwischen zwei Textzeilen verwendet. (Oder technischer, % ihr geht eine Klasse-0-Linie vorher und eine schlie"st sich ihr an). Danach % wird ein Blick auf die Ausnahmen geworfen. % \begin{quote} % =\toprule=[\meta{wd}] % \end{quote} % Eine Linie von der St"arke \meta{wd} (default =\heavyrulewidth=) mit % =\abovetopsep= Abstand dar"uber und % =\belowrulesep= zus"atzlichen vertikalen darunter eingef"ugten Abstand. Als % Voreinstellung ist =\abovetopsep= null, was f"ur eine Linie, die ganz oben % stehen soll, % recht vern"unftig scheint. Wenn die Tabellen jedoch Beschriftungen haben, % kann es sinnvoller sein, =\abovetopsep= zu verwenden, um eine angemessene Menge % an Abstand zwischen Beschriftung und Tabelle einf"ugen, als im Eifer des Gefechts % daran zu denken, einen =\vspace{}=-Befehl einzusetzen. % \begin{quote} % =\midrule=[\meta{wd}] % \end{quote} % Eine \meta{wd} (default =\lightrulewidth=) Linie mit % =\aboverulesep= Abstand dar"uber und % mit =\belowrulesep= Abstand darunter. % \begin{quote} % =\bottomrule=[\meta{wd}] % \end{quote} % Eine \meta{wd} (default =\heavyrulewidth=) Linie mit =\aboverulesep= % Abstand dar"uber und mit =\belowbottomsep= Abstand darunter. Voreingestellt ist % =\belowbottomsep= null\footnote{Das ist eine Ver"anderung zur Version 1.00, % bei der stets ein \texttt{\textbackslash belowrulesep}} war. % Es gibt einen h"aufig vorkommenden und legitimen Grund, warum man Platz unter % der untersten Linie schaffen möchte: n"amlich, wenn es um Fu"snoten in Tabellen % geht. % Wenn man nicht die Voreinstellung "uberschreibt, kann man % =\bottomrule \addlinespace[\belowrulesep]= verwenden % oder einen passend gestalteten \emph{strut} in den Fu"snotentext setzen. % Aber damit es sich sinnvoll in einer =longtable=-Fu"szeile verh"alt, % muss die Voreinstellung null sein. % \begin{quote} % =\cmidrule=[\meta{wd}](\meta{trim})\{$a$--$b$\} % \end{quote} % Eine \meta{wd} (default =\cmidrulewidth=) Linie mit % =\aboverulesep= Abstand dar"uber (au"ser sie folgt einer anderen % =\cmidrule=, in welchem Fall sie der gleichen vertikalen Anordnung folgt. Das % gleiche passiert, wenn sie auf eine =\morecmidrules= folgt, getrennt von einer % vorhergehenden =\cmidrule= um =\cmidrulesep=). % Eine =\cmidrule= hat % =\belowrulesep= unter sich (au"ser ihr folgt eine andere % =\cmidrule=, in welchem Fall die folgende Linie der gleichen vertikalen % Anordnung folgt; oder wenn nach ihr eine =\morecmdirules= kommt, in welchem Fall % =\cmidrulesep= unter ihr Platz gelassen wird). % % Die =\cmidrule= "uberspannt Spalten $a$ bis $b$ genauso, wie es im obligatorischen % Argument angegeben wurde. Das optionale Argument \meta{trim}, das wenn % "uberhaupt in Klammern steht, kann jede Sequenz der Zeichen =r=, =l= % und ={=\meta{wd}=}= beinhalten, wobei letzteres das Kerning auf die Seite % anwendet, die das direkt vorhergehende Zeichen angab. % (Momentan wird hier noch nicht auf Fehler "uberpr"uft, es gilt also darauf zu % achten, die Syntax richtig zu setzen.) % \begin{quote} % =\morecmidrules= % \end{quote} % Instruiert \LaTeX\ damit, eine neue Reihe von =\cmidrules= zu beginnen, % die von der letzten durch =\cmidrulesep= getrennt wird. Hat in einem anderen % Kontext keine Bedeutung. % \begin{quote} % =\specialrule=\{\meta{wd}\}\{\meta{abovespace}\}\{\meta{belowspace}\} % \end{quote} % Eine \meta{wd} Linie -- zu beachten ist, dass das hier ein obligatorisches % Argument ist -- mit % \meta{abovespace} dar"uber und \meta{belowspace} darunter. % \begin{quote} % =\addlinespace=[\meta{wd}] % \end{quote} % Technisch gesehen hat das denselben Effekt wie % =\specialrule{0pt}{0pt}{=\meta{wd}=}=, d.\,h. eine Linie ohne St"arke und ohne % Abstand dar"uber und mit \meta{wd} (default =\defaultaddspace=) Abstand % darunter. Dieser Befehl wurde in erster Linie designed , um im Tabellenk"orper % Abst"ande hinzuzuf"ugen, kann aber auch genutzt werden, um eine genaues % Ma"s an Abstand "uber oder unter einer Klasse-1-Linie festzulegen. % % \vspace{1em} % Nun zu den Ausnahmen zu den oberen Befehlen. Es wurde bereits in den % Definitionen gezeigt, dass vor und nach den Klasse-2-Linien genauso viel % Abstand gelassen wird, wie in den Argumenten angegeben. % Das hat zur Folge, dass eine Klasse-2-Linie den Abstand, der normalerweise % durch eine Klasse-1-Linie erzeugt w"urde, unterdr"uckt (Z.\,B. % =\belowrulesep= nach einer =\toprule=) und ihn mit dem Argument % der Klasse-2-Linie ersetzt. Analog dazu wird bei der Kombination % \{Klasse-2-Linie\}\{Klasse-1-Linie\} der "ubliche Abstand oberhalb % der Klasse-1-Linie (z.\,B. =\aboverulesep=) unterdr"uckt. Allerdings wird bei % der Kombination \{Klasse-2-Linie\}\{Klasse-2-Linie\} kein Abstand unterdr"uckt: % die Linien werden sowohl durch ={=\meta{belowspace}=}= der ersten Linie % als auch durch ={=\meta{abovespace}=}= der zweiten Linie getrennt. % Nicht zuletzt ergibt die Kombination \{Klasse-1-Linie\}\{Klasse-1-Linie\} % immer Linien, die durch =\doublerulesep= getrennt sind und sie unterdr"uckt % allen normalen Abstand, der zwischen den Linien erzeugt worden ist (aber % l"asst "uber der ersten und unter der zweiten normale Abst"ande). % % Als eine Ausnahme zu dieser Ausnahme schlie"st `Klasse-1-Linie' % =\cmidrule= aus. Derartige Linien lassen sich mit anderen =\cmidrule=s und % =\morecmidrules= ganz normal wie oben beschrieben kombinieren. Ich wei"s % nicht, und es ist mir auch egal, was die Kombination % =\toprule\cmidrule{1-2}\midrule= erg"abe. Ich sehe keine Entschuldigung % f"ur eine derartige Anwendung. % %\vspace{1em} % Die voreingestellten Ausma"se werden zu Beginn der Makrobeschreibung % (Section \ref{code}) definiert. Der Nutzer kann diese Voreinstellungen % in der Pr"aambel "andern oder auch au"serhalb einer Tabellenumgebung, % ganz einfach, indem er einen Befehl in genau demselben Format wie in % Sektion \ref{code} einf"ugt. Eine Neudefinition wird bis zum Ende des Dokuments, % oder bis sie wieder neu definiert wird, wirken. % \emph{Innerhalb einer Tabelle} m"usste man die "Anderung global in einer % =noalign=-Gruppe machen: % z.\,B. \verb|\noalign\{\global\abovetopsep=1em\toprule}|. Ich hoffe, % wird nie n"otig sein. % % \section{Danksagungen} % Bin nat"urlich dem DEK und Lamport riesig zu Dank verpflichtet; das optionale % Argument und das =\cmidrule=zeug % insbesondere wurde von =latex.sty= geklaut. % Das Dokumentationtreiberzeug wurde von der tools-Paketbeschreibung % =dcolumn.dtx= von David Carlisle geklaut. % % F"ur das beta-Testen und die Unterstützung \ldots % % \StopEventually % % \section{Der code\label{code}} % % Die aktuelle Version wird am Anfang der Datei definiert, was in etwa so % aussieht % \begin{macrocode} %<*package> %\NeedsTeXFormat{LaTeX2e} %\ProvidesPackage{booktabs} % [\filedate\space version\fileversion] % \end{macrocode} % % Zuerst werden die oben beschriebenen neuen Dimensionen eingerichtet: % \begin{macrocode} \newdimen\heavyrulewidth \newdimen\lightrulewidth \newdimen\cmidrulewidth \newdimen\belowrulesep \newdimen\belowbottomsep \newdimen\aboverulesep \newdimen\abovetopsep \newdimen\cmidrulesep \newdimen\cmidrulekern \newdimen\defaultaddspace \heavyrulewidth=.08em \lightrulewidth=.05em \cmidrulewidth=.03em \belowrulesep=.65ex \belowbottomsep=0pt \aboverulesep=.4ex \abovetopsep=0pt \cmidrulesep=\doublerulesep \cmidrulekern=.5em \defaultaddspace=.5em % \end{macrocode} % Und einige interne Z"ahler, die f"ur den Endnutzer von keinem Interesse % sind, die unten beschrieben werden, sobald es n"otig sein sollte: % % \changes{v1.618}{2003/03/28}{Remove \cs{@cmidrulewidth} } % \begin{macrocode} \newcount\@cmidla \newcount\@cmidlb \newdimen\@aboverulesep \newdimen\@belowrulesep \newcount\@thisruleclass \newcount\@lastruleclass \@lastruleclass=0 \newdimen\@thisrulewidth % \end{macrocode} % \DescribeMacro\futurenonspacelet % % Als n"achstes wird ein n"utzliches Makro definiert % (mehr oder weniger direkt aus dem % Kapitel Dirty Tricks aus dem \TeX book; dort verzeichnet). Man sollte % =\futurenonspacelet= anstelle von =\futurelet= verwenden, wenn man nach dem % n"achsten (non-space) Zeichen, nach einem Makro mit einem Argument sucht. % (Nach einem Makro % ohne ein Argument wird ein Leerzeichen ohnehin ignoriert, also w"urde % =\futurenonspacelet= nicht gebraucht werden.) Dieser Kniff erlaubt es dem % Nutzer, wei"se Leerzeichen zwischen aufeinanderfolgenden Linienbefehlen zu % setzen (was in Version 1.00 nicht klappte). % \begin{macrocode} \def\futurenonspacelet#1{\def\@BTcs{#1}% \afterassignment\@BTfnslone\let\nexttoken= } \def\@BTfnslone{\expandafter\futurelet\@BTcs\@BTfnsltwo} \def\@BTfnsltwo{\expandafter\ifx\@BTcs\@sptoken\let\next=\@BTfnslthree \else\let\next=\nexttoken\fi \next} \def\@BTfnslthree{\afterassignment\@BTfnslone\let\next= } % \end{macrocode} % % % \subsection{Linien von ganzer St\"arke} % % Wenn man nicht in einer =longtable=Umgebung ist, kann man einfach % Linien von ganzer St"arke als =\hrule= in einer =\noalign{}=-Gruppe % bearbeiten. Innerhalb einer =longtable= jedoch muss die Linie wie eine % =\cmidrule{1-\LT@cols}= gezogen werden (Die Begr"undung daf"ur ist in der % =longtable=-Dokumentation erkl"art). % % Um beides zu erlauben, m"ussen alle Linienmakros sofort eine % =\noalign=-Gruppe "offnen, w"ahrend sie ausarbeiten, ob sie innerhalb % einer =longtable= aufgerufen wurden; wenn das nicht gemacht wird, bekommt, % der \TeX zu Grunde liegender =\halign=-Prozess Schluckauf. % Ich verwende den kleinen Trick von \LaTeX{} % (\verb?\ifnum=0`}?), um dem Parser vorzumachen, dass die % Klammerzahl in Ordnung ist. Die Klammer wird nach dem ganzen "Uberspringen % am Ende des =\@BTendrule=-Makros dann tats"achlich geschlossen. % % Die Klasse-1-Linien und =\specialrule= unterscheiden sich in den Voreinstellungen % nur im Abstand dar"uber und darunter und in der St"arke, die durch eine normale % Routine erlassen wird, =\@BTrule=, % siehe unten. Die Abst"ande, =\@aboverulesep= und =\@belowrulesep=, % werden innerhalb der =\noalign=gruppe festgelegt, werden also von % =\@BTrule= "ubernommen. Genauso wei"s =\@BTrule= alles, was es "uber die % Routine, die es aufgerufen hat, wissen muss, durch das Untersuchen der % "ubernommenen =\@thisruleclass=. Das optionale St"arkenargument wird von % =\@BTrule= analysiert, nachdem es auf die Voreinstellung gesetzt wurde, falls % es fehlt. % %\begin{macro}{\toprule} % \changes{v1.61803}{2005/04/14}{Change \cmd{\@belowrulesep} to \cmd{\belowrulesep}} % \begin{macro}{\midrule} % \begin{macro}{\bottomrule} % \begin{macro}{\specialrule} % \begin{macrocode} \def\toprule{\noalign{\ifnum0=`}\fi \@aboverulesep=\abovetopsep \global\@belowrulesep=\belowrulesep \global\@thisruleclass=\@ne \@ifnextchar[{\@BTrule}{\@BTrule[\heavyrulewidth]}} \def\midrule{\noalign{\ifnum0=`}\fi \@aboverulesep=\aboverulesep \global\@belowrulesep=\belowrulesep \global\@thisruleclass=\@ne \@ifnextchar[{\@BTrule}{\@BTrule[\lightrulewidth]}} \def\bottomrule{\noalign{\ifnum0=`}\fi \@aboverulesep=\aboverulesep \global\@belowrulesep=\belowbottomsep \global\@thisruleclass=\@ne \@ifnextchar[{\@BTrule}{\@BTrule[\heavyrulewidth]}} \def\specialrule#1#2#3{\noalign{\ifnum0=`}\fi \@aboverulesep=#2\global\@belowrulesep=#3\global\@thisruleclass=\tw@ \@BTrule[#1]} % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \begin{macro}{\addlinespace} % Ein =\addlinespace= ist im Wesentlichen eine Linie ohne Breite, keinem Abstand % dar"uber und angegebem (oder voreingestelltem) Abstand darunter. Aber weil die % Linie nicht wirklich gezogen wird, sondern blo\ss ein =\vskip= ist, ist es nicht % n"otig, zu schauen, ob man in einer longtable ist. Also muss man % =\@BTrule= nicht als `echte' Linie bezeichnen. Aber wir teilen den =\@BTendrule= % Vorausschau- und flagsetting -Code (sieh unten), und der =\vskip= wir dort % gemacht. % \begin{macrocode} \def\addlinespace{\noalign{\ifnum0=`}\fi \@ifnextchar[{\@addspace}{\@addspace[\defaultaddspace]}} \def\@addspace[#1]{\global\@belowrulesep=#1\global\@thisruleclass=\tw@ \futurelet\@tempa\@BTendrule} % \end{macrocode} % \end{macro} % % % \begin{macro}{\@BTrule} % Alle Linien (au"ser =\addlinespace=) teilen diesen Code. % \begin{macrocode} \def\@BTrule[#1]{% \global\@thisrulewidth=#1\relax % \end{macrocode} % Das St"arkenargument (wenn der Nutzer keines angibt, dann wird % die Aufrufroutine =\@BTrule= mit der Voreinstellung aufgerufen haben) sollte f"ur % sp"atere Verwendung in einer globalen Variable gespeichert werden. % \begin{macrocode} \ifnum\@thisruleclass=\tw@\vskip\@aboverulesep\else % \end{macrocode} % Speziallinien f"ugen immer angegebenen Abstand dar"uber ein. (Es ist % zu beachten, dass =addlinespaces= hier nicht gehen). % \begin{macrocode} \ifnum\@lastruleclass=\z@\vskip\@aboverulesep\else \ifnum\@lastruleclass=\@ne\vskip\doublerulesep\fi\fi\fi % \end{macrocode} % Nach Text (der letzten Klasse-1-Linie) sollte der Linie =\aboverulesep= % vorangehen; doch falls es direkt nach einer vorhergehenden Linie kommt, % sollte ein =\doublerulesep= eingef"ugt werden. % % Nun wird durch einen sehr fiesen Hack herausbekommen, ob man sich in einer % =longtable= befindet. Das ist leicht, wenn =\longtable= nicht mal definiert % ist: Dann ist man nicht drin. % Aber es reicht nicht einfach nur zu gucken, ob =longtable= geladen % ist -- man k"onnte ja auch innerhalb einer normalen Tabelle anstatt einer % =longtable= sein. Also wird geguckt, ob =\hline= von seiner % \LaTeX definition umgemodelt wurde, um genauso wie % =\LT@hline= zu sein. (Momentan macht =longtable= diese Umdefinition, wenn es % eine =longtable=-Umgebung "offnet, aber nicht global, also ist es gel"oscht, % sobald sich die Umgebung schlie"st.) Ein weiteres Paket k"onnte % das m"oglicherweise tun! Und =longtable= k"onnte sich ver"andern, insofern % es das einf"uhrt! Bisher ist es nicht v"ollig sicher, aber ich habe noch % keine bessere Methode gefunden. % % Wir richten =\@BTswitch= ein, um =\@BTnormal= oder =\@BLTrule= aufzurufen, % je nachdem was passt, und rufen es dann auf. % \begin{macrocode} \ifx\longtable\undefined \let\@BTswitch\@BTnormal \else\ifx\hline\LT@hline \let\@BTswitch\@BLTrule \else \let\@BTswitch\@BTnormal \fi\fi \@BTswitch} % \end{macrocode} % \end{macro} % % % \begin{macro}{\CT@arc@} % \changes{v1.6180}{2005/03/16}{add colortbl command for color support} % Das ist Unterst"utzung f"ur das =colortbl=-Paket f"ur farbige % Linien. \cmd{\CT@arc@} h"alt das \cmd{\arrayrulecolor} Setting. % \begin{macrocode} \AtBeginDocument{% \providecommand*\CT@arc@{}}%% colortbl support % \end{macrocode} % \end{macro} % % % \begin{macro}{\@BTnormal} % \changes{v1.6180}{2005/03/16}{add colortbl \cmd{\CT@arc@} command for color support} % Das ist f"ur den Fall, dass wir \emph{nicht} in einer =longtable= sind. % Wir sind bereits in einer % =\noalign=-Gruppe, alles, was getan werden muss, ist eine =\hrule= zu ziehen % und alle zur"uckliegenden Abst"ande zu verschlingen, um dann % die Abschlussroutine mit =\@tempa= mit dem n"achsten Zeichen im Dokument % gleichzusetzen. % % \begin{macrocode} \def\@BTnormal{% {\CT@arc@\hrule\@height\@thisrulewidth}% \futurenonspacelet\@tempa\@BTendrule} % \end{macrocode} % \end{macro} % % \begin{macro}{\@BLTrule} % Das ist f"ur eine Linie voller St"arke in einer =longtable=. Zuerst wird geguckt, % ob ein Kerningargument verwendet wurde; falls das so ist, soll =\@@BLTrule= % es auslesen, % ansonsten kann =\@@BLTrule= mit einem leeren String aufgerufen werden: % \begin{macrocode} \def\@BLTrule{\@ifnextchar({\@@BLTrule}{\@@BLTrule()}} % \end{macrocode} % \end{macro} % \begin{macro}{\@@BLTrule} % \begin{macrocode} \def\@@BLTrule(#1){\@setrulekerning{#1}% \global\@cmidlb\LT@cols % \end{macrocode} % Die Routine =\@setrulekerning= analysiert die Zeichen des Kerningarguments % und setzt die globalen Kerningst"arken entsprechend (oder zur Voreinstellung, % wenn der Nutzer % sie nicht explizit angegeben hat). Die globale Anweisung an =\@cmidlb= % legt die Spaltenzahl f"ur die =\@cmidruleb=makro fest, die mit % =cmidrules= geteilt wird. % \begin{macrocode} \ifnum0=`{\fi}% % \end{macrocode} % Schlie"st die momentan ge"offnete =\noalign=-Gruppe. Innerhalb einer =longtable= % werden Linien als Bezugsstriche in einer Textbox, die % =\LT@cols= Spalten breit ist, gezogen. % \begin{macrocode} \@cmidruleb % \end{macrocode} % Zeichnet die Linie. Der =\@cmidruleb=-Code wird mit gew"ohnlichen =\cmidrule=s % geteilt. % \begin{macrocode} \noalign{\ifnum0=`}\fi % \end{macrocode} % Ein neues =noalign= muss aber sofort ge"offnet werden, da \TeX{} sonst eine % neue Textbox beginnen wird, wo wir keine wollen. Dann, nach dem Löschen % des nicht gewollten wei"sen Platzes, kann die Abschlussroutine aufgerufen % werden. % \begin{macrocode} \futurenonspacelet\@tempa\@BTendrule} % \end{macrocode} % \end{macro} % \begin{macro}{\@BTendrule} % Wir schauen einen Schritt weiter; das Zeichen ist in =\@tempa=), um zu sehen, ob % eine andere Linie folgt (Der Nutzer sollte sich sch"amen!). Wenn dem so ist, % wird =\@lastruleclass= =\@thisruleclass= gleichgesetzt % (und damit f"ur die folgende Linie festgelegt). Wenn es keine darauffolgende % Linie gibt, wird =\@lastruleclass= freigelassen (d.\,h. auf Null % gesetzt), was technisch gesehen, nicht wahr ist, da gerade eine Linie gezogen % wurde. Aber es stellt es korrekt f"ur die n"achste Linie, der begegnet wird, % ein; die muss auf dazwischenliegenden Text folgen. % \begin{macrocode} \def\@BTendrule{\ifx\@tempa\toprule\global\@lastruleclass=\@thisruleclass \else\ifx\@tempa\midrule\global\@lastruleclass=\@thisruleclass \else\ifx\@tempa\bottomrule\global\@lastruleclass=\@thisruleclass \else\ifx\@tempa\cmidrule\global\@lastruleclass=\@thisruleclass \else\ifx\@tempa\specialrule\global\@lastruleclass=\@thisruleclass \else\ifx\@tempa\addlinespace\global\@lastruleclass=\@thisruleclass \else\global\@lastruleclass=\z@\fi\fi\fi\fi\fi\fi \ifnum\@lastruleclass=\@ne\relax\else\vskip\@belowrulesep\fi \ifnum0=`{\fi}} % \end{macrocode} % \end{macro} % % % \subsection{Spezielle Unterlinien} % % \begin{macro}{\@setrulekerning} % Der folgende Code analysiert die Trimmingargumente (wenn es welche gibt) % f"ur =\cmidrule= oder eine =\BLTrule=. Die Linie % wird links und rechts durch =\cmrkern@l= und =\cmrkern@l= beschnitten, % die beide als Voreinstellung Null haben, auf =\cmidrulekern= durch die % einfachen Argumente % =(lr)= gesetzt werden oder durch den Nutzer wie bei =(r{.5em})= eingestellt % werden. Es wird Zeichen f"ur Zeichen durch die Argumente gest"obert. % Die Zeichen =r= und =l= bewirken, dass =\cmrkern@r= oder =\cmrkern@l= auf % =\cmidrulekern= gesetzt werden. Es gibt keine Vorschau, um zu sehen, ob % eine St"arke das n"achste Zeichen ist. Diese Strategie ist f"ur die % einfachen Befehle effizient, wohingegen es f"ur die bedingten Befehle % ineffizient ist. Viel wichtiger ist jedoch, dass es viel einfacher % zu programmieren ist. Die Zeichen =r= und =l= legen auch % =\cmrswitch= fest, sodass, wenn sich das n"achste Zeichen als % ={=\meta{wd}=}= herausstellt, das Kerning auf der Seite, die gerade % festgelegt ist, gemacht wird. Ich war zu faul, um eine Fehlermeldung zu % zu programmieren, falls anderen Zeichen als =r=, =l= oder % ={=\meta{wd}=}= begegnet wird. % \changes{v1.6180}{2005/03/16}{Refine option testing in \cmd{\@setrulekerning}} % \begin{macrocode} \def\@setrulekerning#1{% \global\let\cmrkern@l\z@ \global\let\cmrkern@r\z@ \@tfor\@tempa :=#1\do {\def\@tempb{r}% \ifx\@tempa\@tempb \global\let\cmrkern@r\cmidrulekern \def\cmrsideswitch{\cmrkern@r}% \else \def\@tempb{l}% \ifx\@tempa\@tempb \global\let\cmrkern@l\cmidrulekern \def\cmrsideswitch{\cmrkern@l}% \else \global\expandafter\let\cmrsideswitch\@tempa \fi \fi}} % \end{macrocode} % \end{macro} % \begin{macro}{\cmidrule} % \begin{macro}{\@cmidrule} % \begin{macro}{\@@cmidrule} % \begin{macro}{\@@@cmidrule} % =\cmidrule= nutzt =\@lastruleclass= auf eine v"ollig andere Weise % als die Linien von ganzer St"arke. (Vielleicht h"atte ich ein anderes % Flag nutzen sollen; es erschien mir zu der Zeit effizient \ldots). Das % wird (links) auf eins gesetzt, wenn man sich in der Mitte einer Reihe von % =\cmidrules= befindet oder eine neue (mit =\morecmidrules=) anf"angt. % Ansonsten, f"ur den Fall, dass =\@lastruleclass= null ist, wird vor die Linie % ein =\aboverulesep= gesetzt. % \begin{macrocode} \def\cmidrule{\noalign{\ifnum0=`}\fi \@ifnextchar[{\@cmidrule}{\@cmidrule[\cmidrulewidth]}} \def\@cmidrule[#1]{\@ifnextchar({\@@cmidrule[#1]}{\@@cmidrule[#1]()}} \def\@@cmidrule[#1](#2)#3{\@@@cmidrule[#3]{#1}{#2}} % \end{macrocode} % Das hier ist ein Herumt"ufteln, um die Voreinstellungen f"ur fehlende % optionale Argumente einzustellen. % Es wird au"serdem in einer anderen Reihenfolge zu =\@@@cmidrule= "ubergegangen, % n"amlich =[a-b]=={width required}= ={kerning commands}= (das ist % die Reihenfolge, in der die Argumente wirklich abgehandelt werden): % \begin{macrocode} \def\@@@cmidrule[#1-#2]#3#4{\global\@cmidla#1\relax \global\advance\@cmidla\m@ne \ifnum\@cmidla>0\global\let\@gtempa\@cmidrulea\else \global\let\@gtempa\@cmidruleb\fi \global\@cmidlb#2\relax \global\advance\@cmidlb-\@cmidla % \end{macrocode} % Das erstellt einen Schalter (=\@gtempa=), um die relvanten Routinen % =\@cmidrulea= oder =\@cmidruleb= aufzurufen, abh"angig davon, ob man von % Spalte anf"angt oder nicht. % \begin{macrocode} \global\@thisrulewidth=#3 % \end{macrocode} % Das wird durch Voreinstellung oder eingesetztes Argument eingestellt. Dann % werden alle Trimmingargumente analysiert, um dementsprechend % =\cmrkern@r= und =\cmrkern@l= einzustellen: % \begin{macrocode} \@setrulekerning{#4} % \end{macrocode} % Nun kann dar"uber, falls gew"unscht, Platz einf"ugen, das =\noalign= % geschlossen % und dann zur angemessenen Linienziehroutine, wie oben beschrieben, gewechselt % werden (=\let= bis =\@gtempa=): % \begin{macrocode} \ifnum\@lastruleclass=\z@\vskip \aboverulesep\fi \ifnum0=`{\fi}\@gtempa % \end{macrocode} % Nach gezogener Linie kann nun % ein anderes =\noalign= ge"offnet und die Abschlussroutine aufgerufen werden: % \begin{macrocode} \noalign{\ifnum0=`}\fi\futurenonspacelet\@tempa\@xcmidrule} % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % % \begin{macro}{\@xcmidrule} % In dieser Abschlussroutine ist zu rp"ufen, ob ein anderes =\cmidrule= folgt; % wenn ja, sollte vertikal zur"uckgeschritten werden, damit es sich mit der gerade % gezeichneten Linie f"ugt. % Das Setzen von =\@lastruleclass= auf 1 wird verhindern, dass "uber dem n"achsten % wieder ein Abstand eingef"ugt wird. Wenn eine =\morecimdrules= folgt, % wird ein (positives) =\cmidrulesep= eingef"ugt (und wieder einmal % =\@lastruleclass= auf 1 gesetzt). % Ansonsten ist das die letzte Linie der momentanen Gruppe und es l"asst sich ganz % einfach =\belowrulesep= dahintersetzen. Abschlie"send wird das =\noalign= % geschlossen. % \changes{v1.618}{2003/03/28}{Change to \cmd{\@xcmidrule}: % replace \cmd{\@cmidrulewidth} with \cmd{\@thisrulewidth }} % \begin{macrocode} \def\@xcmidrule{% \ifx\@tempa\cmidrule \vskip-\@thisrulewidth \global\@lastruleclass=\@ne \else \ifx\@tempa\morecmidrules \vskip \cmidrulesep \global\@lastruleclass=\@ne\else \vskip \belowrulesep \global\@lastruleclass=\z@ \fi\fi \ifnum0=`{\fi}} % \end{macrocode} % \end{macro} % \begin{macro}{\@cmidrulea} % Dieser Code (wird unter diesem Text aufgerufen) zeichnet die % Linien. Sie werden als Boxen % im Text gezeichnet, anstatt in einer =\noalign=gruppe, was das Kerning % links und rechts gestattet. % \changes{v1.6180}{2005/03/16}{add colortbl \cmd{\CT@arc@} command for color support} % \begin{macrocode} \def\@cmidrulea{% \multispan\@cmidla&\multispan\@cmidlb \unskip\hskip\cmrkern@l% {\CT@arc@\leaders\hrule \@height\@thisrulewidth\hfill}% \hskip\cmrkern@r\cr}% % \end{macrocode} % \end{macro} % \begin{macro}{\@cmidruleb} % \changes{v1.6180}{2005/03/16}{add colortbl \cmd{\CT@arc@} command for color support} % \begin{macrocode} \def\@cmidruleb{% \multispan\@cmidlb \unskip\hskip \cmrkern@l% {\CT@arc@\leaders\hrule \@height\@thisrulewidth\hfill}% \hskip\cmrkern@r\cr}% % \end{macrocode} % \end{macro} % % \begin{macro}{\morecmidrules} % Das ist wirklich ein hohler Befehl; die ganze Arbeit ist davor bereits % in der =\cmidrule=routine gemacht worden. Es l"asst sich einen Schritt voraus % schauen, um zu gucken, ob ein =\morecmidrules= der aktuellen =\cmidrule= folgt, % und k"onnen das Flag setzen, falls ja. Ansonsten macht =\morecmidrules= an sich % "uberhaupt nichts. % \begin{macrocode} \def\morecmidrules{\noalign{\relax}} % \end{macrocode} % \end{macro} % % \begin{macrocode} % % \end{macrocode} % % %\PrintChanges %\PrintIndex %\end{document}