PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : "Misplaced omit" in Tabellenmakro



coenig
18-10-2012, 00:45
Hallo,

ich versuche mir gerade ein Makro zu schreiben, das Dreieckstabellen erzeugt (also Tabellen mit zwei Spalten in der ersten Zeile, in der zweiten drei usw.). Die letzte Zeile hat gleich viele Spalten wie die vorletzte, weil da die Überschriften drinstehen (ebenso in der ersten Spalte).

Als Parameter werden dem Makro die einzelnen Tabellenzeilen übergeben, bspw. eine ganz kleine mit nur zwei Zeilen:



\dreieckstabelle
{$s_1$ & $A_1$}
{ & $s_2$}
{}
{}
{}
{}
{}
{}
{}


Mein Code sieht wie folgt aus (nicht ganz ein Minimalbeispiel, aber so versteht man die Struktur besser):



\newcommand{\dreieckstabelle}[9]{
\ifthenelse{\equal{#3}{}}{\begin{tabular}{|r|*{2}{ c|}}}
{\ifthenelse{\equal{#4}{}}{\begin{tabular}{|r|*{3} {c|}}}
{\ifthenelse{\equal{#5}{}}{\begin{tabular}{|r|*{4} {c|}}}
{\ifthenelse{\equal{#6}{}}{\begin{tabular}{|r|*{5} {c|}}}
{\ifthenelse{\equal{#7}{}}{\begin{tabular}{|r|*{6} {c|}}}
{\ifthenelse{\equal{#8}{}}{\begin{tabular}{|r|*{7} {c|}}}
{\ifthenelse{\equal{#9}{}}{\begin{tabular}{|r|*{8} {c|}}}
{\begin{tabular}{|r|*{9}{c|}}}}}}}}}
%
\ifthenelse{\equal{#3}{}}{\cline{1-2} #1 \\ \cline{1-2} \multicolumn{1}{c|}{~} #2 \\ \cline{2-2}}{}
\end{tabular}
}


Die oberen IF-Blöcke erzeugen eine Tabular-Umgebung mit unterschiedlich vielen Spalten, je nachdem, wie viele Parameter (nichtleer) übergeben wurden.

Ganz unten wird die Umgebung beendet.

Dazwischen möchte ich den Tabelleninhalt einfügen, also die übergebenen Zeilen, stoße dabei aber auf ein Problem, das ich absolut nicht verstehe.

Der einzufügende Inhalt ist (für die ganz kleine Tabelle von oben) der \cline... - Block, der in dem untersten IF-Block steht (größere Tabellen sollen später mit weiteren IFs eingebaut werden). Wenn ich den \cline... - Block ohne IF hinschreibe funktioniert es. Wenn ich es aber so lasse wie oben, dann kommt ein "Misplaced omit"-Fehler.

Ich wäre wirklich sehr dankbar, wenn jemand da eine hilfreiche Idee hätte; ich komme gerade echt nicht weiter.

Vielen Dank und Grüße

Lukas König

coenig
18-10-2012, 10:22
Hier noch ein kompilierfähiges Minimalbeispiel, das den Fehler wirft (ich hatte gestern Nacht einfach keinen mehr Nerv dazu):



\documentclass{article}

\usepackage{ifthen}

\newcommand{\dreieckstabelle}[9]{
\begin{tabular}{|r|*{2}{c|}}
\ifthenelse{\equal{#3}{}}{\cline{1-2} #1 \\ \cline{1-2} \multicolumn{1}{c|}{~} #2 \\ \cline{2-2}}{}
\end{tabular}
}

\begin{document}

\dreieckstabelle
{$s_1$ & $A_1$}
{ & $s_2$}
{}
{}
{}
{}
{}
{}
{}

\end{document}


Danke nochmal!

coenig
18-10-2012, 10:47
Okay, es sieht so aus, als hätte ich eine Lösung gefunden - obwohl ich immer noch nicht die Fehlermeldung verstehe (vielleicht kann dazu ja nochmal jemand etwas schreiben).

Ich benutze jetzt das Paket etoolbox statt ifthen (das, wie ich gelesen habe, inzwischen als obsolet angesehen wird). Mit etoolbox hatte ich das Problem zunächst auch, als ich mit


\ifstrequal{#3}{}{\cline...}{}

gearbeitet habe, um zu testen, ob der Parameter leer ist. Als ich es aber mit \ifstrempty versucht habe, hat es funktioniert - warum auch immer.



\documentclass{article}

\usepackage{etoolbox}

\newcommand{\dreieckstabelle}[9]{
\begin{tabular}{|r|*{2}{c|}}
\ifstrempty{#3}{\cline{1-2} #1 \\ \cline{1-2} \multicolumn{1}{c|}{~} #2 \\ \cline{2-2}}{false}
\end{tabular}
}

\begin{document}

\dreieckstabelle
{$s_1$ & $A_1$}
{ & $s_2$}
{}
{}
{}
{}
{}
{}
{}

\end{document}



Viele Grüße

Lukas

u_fischer
18-10-2012, 11:20
obwohl ich immer noch nicht die Fehlermeldung verstehe

\cline darf nur direkt nach \\ kommen. Wobei "direkt nach" meint, dass zwischen \\ und \cline nur solche Befehle sein dürfen, die komplett verschwinden (und u.a. "expandierbar sind"). \ifthenelse ist nicht expandierbar.


\documentclass{article}
\begin{document}

\def\test{}

\begin{tabular}{l}
a \\\cline{1-1} %ok
a \\\test \cline{1-1} %ok
%b \\ b \cline{1-1} %Fehler
%a \\\relax\cline{1-1} %Fehler

\end{tabular}
\end{document}

coenig
18-10-2012, 11:24
Okay, besten Dank! Und dieser andere Befehl aus der etoolbox ist also komplett expandierbar? (Es ist schon krass, wie komplex TeX ist... Ich bin ja nun wirklich kein kompletter Neuling, aber es gibt immer noch so viel, was ich nicht verstehe! Wenn man sich so intensiv bspw. mit Java auseinandersetzt, wie ich es schon mit TeX getan habe, dann ist man ein Super-Vollprofi! :-) )

coenig
18-10-2012, 11:25
Ach so, falls jemand Dreieckstabellen zeichnen will - hier ist das komplette funktionierende Makro:



\newcommand{\dreieckstabelle}[9]{
\ifstrempty{#3}{\begin{mytabular}{|r|*{2}{c|}}} % Starte Tabelle.
{\ifstrempty{#4}{\begin{tabular}{|r|*{3}{c|}}}
{\ifstrempty{#5}{\begin{tabular}{|r|*{4}{c|}}}
{\ifstrempty{#6}{\begin{tabular}{|r|*{5}{c|}}}
{\ifstrempty{#7}{\begin{tabular}{|r|*{6}{c|}}}
{\ifstrempty{#8}{\begin{tabular}{|r|*{7}{c|}}}
{\ifstrempty{#9}{\begin{tabular}{|r|*{8}{c|}}}
{\begin{tabular}{|r|*{9}{c|}}}}}}}}}

\cline{1-2} #1 \\ \ifstrempty{#3}{\cline{1-2} \multicolumn{1}{c|}{~} #2 \\ \cline{2-2}} % Inhaltszeilen.
{\cline{1-3} #2 \\ \ifstrempty{#4}{\cline{1-3} \multicolumn{1}{c|}{~} #3 \\ \cline{2-3}}
{\cline{1-4} #3 \\ \ifstrempty{#5}{\cline{1-4} \multicolumn{1}{c|}{~} #4 \\ \cline{2-4}}
{\cline{1-5} #4 \\ \ifstrempty{#6}{\cline{1-5} \multicolumn{1}{c|}{~} #5 \\ \cline{2-5}}
{\cline{1-6} #5 \\ \ifstrempty{#7}{\cline{1-6} \multicolumn{1}{c|}{~} #6 \\ \cline{2-6}}
{\cline{1-7} #6 \\ \ifstrempty{#8}{\cline{1-7} \multicolumn{1}{c|}{~} #7 \\ \cline{2-7}}
{\cline{1-8} #7 \\ \ifstrempty{#9}{\cline{1-8} \multicolumn{1}{c|}{~} #8 \\ \cline{2-8}}
{\cline{1-9} #8 \\ \cline{1-9} \multicolumn{1}{c|}{~} #9 \\ \cline{2-9}}}}}}}}

\end{tabular} % Beende Tabelle.
}


Zu benutzen bspw. mit:



\dreieckstabelle
{$s_1$ & $A_1$}
{$s_2$ & $A_2$ & $B_2$}
{$s_3$ & $A_3$ & $B_3$ & $C_3$}
{$s_4$ & $A_4$ & $B_4$ & $C_4$ & $D_4$}
{$s_5$ & $A_5$ & $B_5$ & $C_5$ & $D_5$ & $E_5$}
{ & $A_5$ & $B_5$ & $C_5$ & $D_5$ & $E_5$}
{}
{}
{}