Anzeige:
Ergebnis 1 bis 3 von 3

Thema: Problem mit \@ifnextchar

  1. #1
    Registrierter Benutzer
    Registriert seit
    06.08.2011
    Beiträge
    7

    Question Problem mit \@ifnextchar

    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:

    Code:
    \documentclass{scrreprt}
    \makeatletter
    \newcommand{\test}{\ignorespaces\@ifnextchar\label\@AltI\@AltII}%checks if next command is \label
    		\def\@AltI{\ignorespaces\@ifnextchar\begin\@labelANDbegin\@labelOnly}%if so, then check if command \begin follows
    		\def\@AltII{\ignorespaces\@ifnextchar\begin\@beginOnly\@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

  2. #2
    Registrierter Benutzer Avatar von cgnieder
    Registriert seit
    06.04.2011
    Ort
    Herrenberg
    Beiträge
    254
    Du hast recht, dass da das \label mit seinem Argument im Weg steht. Eine schnelle Lösung wäre das hier:

    Code:
    \documentclass{scrreprt}
    \makeatletter
    \newcommand{\test}{\ignorespaces\@ifnextchar\label\@AltI\@AltII}%checks if next command is \label
    		\def\@AltI\label#1{\label{#1}\ignorespaces\@AltIaux}%
    		\def\@AltIaux{\@ifnextchar\begin\@labelANDbegin\@labelOnly}%if so, then check if command \begin follows
    		\def\@AltII{\ignorespaces\@ifnextchar\begin\@beginOnly\@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ß
    Clemens

  3. #3
    Registrierter Benutzer
    Registriert seit
    06.08.2011
    Beiträge
    7
    Großartig, dankeschön!!!
    Das erspart mir viel Arbeit

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •