PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : mehrere cmidrule durch Macro in Tabelle einfügen



bz-mof
11-06-2012, 20:02
Hallo!

Da dies mein erstes Posting in diesem Forum ist, zunächst ein großes Dankeschön an alle beteiligten für die Hilfe, die ich hier bisher (als passiver Forennutzer) gefunden habe!

Nun zu meinem Problem: Da ich oft viele Tabellen mit booktabs und den damit möglichen kürzeren Linien erstelle, wollte ich mir eine Abkürzung für

\cmidrule(lr){1-1}\cmidrule(lr){2-2}\cmidrule(lr){3-3}...
erstellen, die auf den Aufruf

\cmidrules{Anz. Spalten}
hört. Leider hat das nicht ganz funktioniert. Ich habe wohl Probleme mit einem \noalign, welches nicht direkt am Zeilenanfang steht, wenn ich meinen Befehl verwende.

Hier ist erstmal mein Minimalbeispiel:

\documentclass{article}
\usepackage{booktabs}

\def\addMyToks#1{\MyToks=\expandafter{\the\MyToks\ cmidrule(lr){#1-#1}}}
\newcommand{\cmidrules}[1]{%
\newtoks\MyToks%
\newcount\spaltenzaehler%
\MyToks={\tabularnewline}% Warum geht's nicht ohne dieses tabularnewline?
\spaltenzaehler=0\relax%
\loop%
\advance\spaltenzaehler 1\relax%
\expandafter\addMyToks\expandafter{\the\spaltenzae hler}%
\ifnum\spaltenzaehler<#1%
\repeat%
\the\MyToks%
}%

\begin{document}
\begin{tabular}{ccc}
\toprule
foo & foo & foo \tabularnewline %soll so bleiben
\cmidrules{3}
1 & 11 & 1111111 \tabularnewline
2 & 22 & 2222222 \tabularnewline
\bottomrule
\end{tabular}
\end{document}

Mein Problem ist, daß ich eigentlich das \tabularynewline in Zeile 8 nicht haben möchte, ohne aber massig "! Misplaced \noalign."-Fehler kommen. Die anscheined einfache Lösung, die entsprechenden \tabularnewline in den Tabellen (hier z.B. nach "foo & foo & foo") wegzulassen, möchte ich nicht nutzen.

Kann mir jemand erklären, was das genaue Problem ist bzw. warum mein Kommando nach dem Expandieren KEIN \noalign (aus dem expandierten \cmidrule) an erster Stelle hat?

Vielen Dank im Voraus!

strolch
12-06-2012, 23:01
hmm, so wird es auch nicht besser - eher schlimmer :-(



\documentclass{article}
\usepackage{booktabs}
\usepackage{xparse}

\NewDocumentCommand\cmidrules {> { \SplitList {,} } m }
{\ProcessList{#1}{\cmidruleBody}}

\NewDocumentCommand{\cmidruleBody}{m}{\tabularnewl ine\cmidrule(lr){#1-#1}}

\begin{document}
\begin{tabular}{ccc}
\toprule
foo & foo & foo \tabularnewline %soll so bleiben
\cmidrules{1,2,3}
1 & 11 & 1111111 \tabularnewline
2 & 22 & 2222222 \tabularnewline
\bottomrule
\end{tabular}
\end{document}


ohne das \tabularnewline in zeile 8 bekomme ich auch "! Misplaced \noalign." fehler. mit hingegen erhalte ich natuerlich vor jedem cmidrule ein tabularnewline, das zu entsprechenden unschoenen zeilenumbruechen fuerhrt.

strolch

strolch
13-06-2012, 10:41
noch mal um einiges kuerzer - funktionieren tut es aber immer noch nicht :-(



\documentclass{article}
\usepackage{booktabs}
\usepackage{tikz}

\newcommand{\cmidrules}[1]{
\foreach \i in {1,...,#1}{\cmidrule(lr){\i-\i}}
}

\begin{document}
\begin{tabular}{ccc}
\toprule
foo & foo & foo \tabularnewline %soll so bleiben
\cmidrules{3}
1 & 11 & 1111111 \tabularnewline
2 & 22 & 2222222 \tabularnewline
\bottomrule
\end{tabular}
\end{document}


es endet in einem "! Misplaced \noalign." fehler.

vielleicht lässt sich das problem mit \expandafter und \noexpand beheben, zumindest könnte man es damit mal versuchen.

strolch

u_fischer
13-06-2012, 11:19
\noalign ist innerhalb einer Zelle nicht erlaubt. "12\noalign{..}23" gibt den gleichen Fehler.

Der Code mit dem du die Spalten berechnest startet die Zelle und damit sind die \noalign innerhalb von \cmidrule falsch. Du kannst deinen Code selbst in einem \noalign verstecken. Du musst dann das toks-Register global füllen.

Außerdem solltest du das toks-Register und den Zähler außerhalb deines Zählers initialisieren. Du willst ja nicht bei jedem Aufruf ein neues Register erzeugen:


\documentclass{article}
\usepackage{booktabs}
\newtoks\MyToks%
\newcount\spaltenzaehler%

\def\addMyToks#1{\global\MyToks=\expandafter{\the\ MyToks\cmidrule(lr){#1-#1}}}

\newcommand{\cmidrules}[1]{%
\noalign{\spaltenzaehler=0\relax%
\global\MyToks={}% leeren
\loop%
\advance\spaltenzaehler 1\relax%
\expandafter\addMyToks\expandafter{\the\spaltenzae hler}%
\ifnum\spaltenzaehler<#1%
\repeat%
}%
\the\MyToks%
}%

\begin{document}
\begin{tabular}{ccc}
\toprule
foo & foo & foo \tabularnewline %soll so bleiben
\cmidrules{3}
1 & 11 & 1111111 \tabularnewline
2 & 22 & 2222222 \tabularnewline
\bottomrule
\end{tabular}
\end{document}

bz-mof
13-06-2012, 17:41
Hallo Ulrike,

vielen Dank für die Tipps, ich hab verstanden und gelernt (-:

Daß das Ganze irgendwie in ein \noalign{} verpackt werden musste, hatte ich schon raus, allerdings war davon dann im pdf gar nichts mehr zu sehen. Daß \noalign eine group einleitet(?) und man daher \global benutzen muss, war mir nicht klar. (Hoffe meine Deutung/Erklärung ist so richtig.)

Danke auch für den Tipp mit der Register- und Zähler-Deklaration, ich ging bisher davon aus, daß die am Command-Ende automatisch wieder entfernt werden.

Ich dachte schon, ich müsste mit meiner

\ifcase#1
\or\cmidrule(lr){1-1}
\or\cmidrule(lr){1-1}\cmidrule(lr){2-2}
...
-Krücke leben...