PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem mit \@ifnextchar



froggygoggy
18-03-2012, 20:31
Hallo Leute,
ich tüftel schon eine ganze Weile an folgendem Problem und habe dazu nirgendwo etwas gefunden. Ich hoffe ihr könnt mir helfen.

Ich möchte LaTeX prüfen lassen, ob an einer Stelle der \label{..} Befehl oder der \begin{..} Befehl oder beide (erst \label dann \begin) oder keiner von beiden folgt. Tritt nur einer von beiden oder keiner auf, so stimmt alles. Treten aber beide nacheinander auf, so handelt LaTeX als stünde da nur der \label Befehl.
Hier mein Minimalbeispiel:



\documentclass{scrreprt}
\makeatletter
\newcommand{\test}{\ignorespaces\@ifnextchar\label \@AltI\@AltII}%checks if next command is \label
\def\@AltI{\ignorespaces\@ifnextchar\begin\@labelA NDbegin\@labelOnly}%if so, then check if command \begin follows
\def\@AltII{\ignorespaces\@ifnextchar\begin\@begin Only\@nothing}%if not, then check if next command is \begin
\def\@labelANDbegin{A}%if there are \label AND \begin, print A
\def\@labelOnly{B}%if there is only \label, print B
\def\@beginOnly{C}%if there is only \begin, print C
\def\@nothing{D}%if there is none of them, print D
\makeatother

\begin{document}
\test
\label{hallo}
\begin{center} I expected A instead of B here! \end{center}
\test
\label{hallo2}
dummy text\\
\test
\begin{center} dummy text \end{center}
\test
dummy text
\end{document}


Es sollten jetzt nacheinander die Buchstaben A B C D erscheinen, aber es kommen statt dessen B B C D.
Ich vermute, das liegt daran, dass auf \label noch das Argument folgt?! Aber wie bringe ich LaTeX dazu, das zu ignorieren und den nächsten Befehl zu überprüfen?

Lg, froggygoggy

cgnieder
18-03-2012, 23:03
Du hast recht, dass da das \label mit seinem Argument im Weg steht. Eine schnelle Lösung wäre das hier:


\documentclass{scrreprt}
\makeatletter
\newcommand{\test}{\ignorespaces\@ifnextchar\label \@AltI\@AltII}%checks if next command is \label
\def\@AltI\label#1{\label{#1}\ignorespaces\@AltIau x}%
\def\@AltIaux{\@ifnextchar\begin\@labelANDbegin\@l abelOnly}%if so, then check if command \begin follows
\def\@AltII{\ignorespaces\@ifnextchar\begin\@begin Only\@nothing}%if not, then check if next command is \begin
\def\@labelANDbegin{A}%if there are \label AND \begin, print A
\def\@labelOnly{B}%if there is only \label, print B
\def\@beginOnly{C}%if there is only \begin, print C
\def\@nothing{D}%if there is none of them, print D
\makeatother

\begin{document}
\section{test}
\test
\label{hallo}
\begin{center} I expected A instead of B here! \end{center}
\test
\label{hallo2}
dummy text\\
\test
\begin{center} dummy text \end{center}
\test
dummy text \ref{hallo} und \ref{hallo2}
\end{document}

Gruß

froggygoggy
19-03-2012, 07:20
Großartig, dankeschön!!!
Das erspart mir viel Arbeit :):)