PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Optionales Argument bei multicolumn



Dee
06-10-2011, 19:50
Hallo,

zuerst wieder mein Minimalbeispiel:


\documentclass{scrartcl}

\newcommand{\mcolA}[2]{\multicolumn{2}{l}{\textbf{#1}: #2}}

\newcommand{\mcolB}[2][Test]{\multicolumn{2}{l}{\textbf{#1}: #2}}

\newcommand{\mcolC}[2][Test]{%
\begin{tabular}{ll}
\multicolumn{2}{l}{\textbf{#1}: #2}
\end{tabular}
}

\begin{document}

\begin{tabular}{ll}
\mcolA{Kein Test}{Hallo}
\end{tabular}

\mcolC[Kein Test]{Hallo}

% Hier ist das Problem.
%\begin{tabular}{ll}
%\mcolB[Kein Test]{Hallo}
%\end{tabular}

\end{document}

Nun zur Frage: Wenn ich den Code für \mcolB einkommentiere und pdflatex laufen lassen, erhalte ich


! Misplaced \omit.
\multispan ->\omit
\@multispan
l.23 \mcolB[Kein Test]{Hallo}

Ich sehe leider den Fehler nicht. Eigentlich will ich für den Befehl nur ein optionales Argument angeben.

Sieht jemand, was ich falsch mache?

Gruß
Dee

LuPi
07-10-2011, 10:45
Möglicherweise liegt hier des Pudels Kern begraben:
http://newsgroups.derkeiler.com/Archive/Comp/comp.text.tex/2008-11/msg00085.html

u_fischer
07-10-2011, 14:28
Möglicherweise liegt hier des Pudels Kern begraben:

Ja, genau das ist das Problem.

Dee
07-10-2011, 16:56
Danke, so etwas hatte ich mir gedacht, aber ich habe es noch nicht ganz verstanden. Bei der Methode mit \input (siehe Link von LuPi) ist es mir ja noch klar, wieso es Probleme gibt. Aber wo ist das Problem, wenn ich aus einem festen LaTeX-Argument ein optionales mache? Wieso erkennt er die Klammern [] als Befehl für \multicolumn? Das klingt für mich ja nach einem Bug, schließlich stehen die Klammern nicht vor \multicolumn, oder?

Gruß Dee

u_fischer
07-10-2011, 17:11
\multicolumn muss am Anfang einer Zelle stehen. Es muss das erste sein, was nach dem Beginn der Zelle ausgeführt wird. Da darf sich weder ein Buchstabe, noch ein \input-Befehl, noch - wie bei dir hier - ein \mcolB-Befehl dazwischen mogeln.

Denn nun lautet der Ablauf: "Anfang der Zelle, führe \mcolB aus, \multicolumn" und prompt bekommst du einen "hier kein \multicolumn (\omit)-Befehl"-Fehler.

Es kommt nicht darauf an, dass die Befehl vor dem \multicolumn-Befehl nichts "richtiges" tun. Nicht einmal ein \relax-Befehl ist möglich:


\documentclass{article}
\begin{document}
\begin{tabular}{ll}
\relax\multicolumn{2}{c}{abc}\\
\end{tabular}

\end{document}

Dee
07-10-2011, 17:14
Hallo Ulrike, wieso geht dann \mcolA? Weil dort stände nach Deiner Aussage ja auch "Anfang der Zelle, führe \mcolA aus, \multicolumn".

Ich vermute, dass Du meinst, dass bei \mcolB durch das optionale Argument vor dem \multicolumn-Befehl noch irgendwas LaTeX-internes gemacht wird (wie z.B. schauen, ob das optionale Argument existiert und falls, entsprechend übernehmen). Das würde die Fehlermeldung erklären. Sehe ich das richtig?

Gruß Dee

Schweinebacke
07-10-2011, 17:32
Ja. Optionale Argumente sind keine echten Argumente. Stattdessen testet LaTeX bei Befehlen mit optionalen Argumenten erst einmal, ob noch ein [ folgt und interpretiert dann alles bis zum ersten ] auf gleicher Ebene als optionales Argument. Während also Dein \mcolA zu etwas expandiert, das direkt mit \multicolumn beginnt, expandiert Dein \mcolB zu etwas, das erst auf eine nachfolgende [ testet, bevor es dann irgendwann auch noch zu \multicolumn expandiert.

Befehle mit optionalem Argument verhalten sich auch in manch anderer Hinsicht anders als Befehle nur mit nicht optionalen Argumenten.

Dee
07-10-2011, 17:35
Danke für die Erklärung. Dann baue ich mir mal einen Workaround ohne multicolumn. :)

Gruß Dee