\fi-Fehler im \afterenvironment-Hook im etoolbox-Paket

\fi-Fehler im \afterenvironment-Hook im etoolbox-Paket

Es ist wahrscheinlich ein Problem mit etoolbox oder expl3 und ich weiß nicht, wie ich es lösen soll. Ich kompiliere das Dokument:

\documentclass{article}
\usepackage{expl3,etoolbox}
\begin{document}
\ExplSyntaxOn
\newcommand{\test}[1][true]{
\str_case:nnF {#1}{
{true}
{\message{true}
}
}
}
\AfterEndEnvironment{equation}{\test}
\begin{equation}
0
\end{equation}
\ExplSyntaxOff
\end{document}

und erhalte eine Fehlermeldung: ! Extra \fi. \end ...if@ignore @ignorefalse \ignorespaces \fi

l.15 \end{equation} Helfen Sie mir bitte, dieses Problem zu lösen. Vielen Dank an alle für jede Hilfe.

Antwort1

Die Antwort war falsch. Verwenden Sie stattdessen die Antwort von @egreg.

Antwort2

Das Problem ist, dass Sie verwenden \str_case:nnF, aber nur liefernzweiArgumente statt der drei erforderlichen, also wird nach einem weiteren gesucht.

\documentclass{article}
\usepackage{expl3,etoolbox}
\begin{document}
\ExplSyntaxOn
\newcommand{\test}[1][true]{
\str_case:nn {#1}{
{true}
{\message{true}
}
}
}
\AfterEndEnvironment{equation}{\test}
\begin{equation}
0
\end{equation}
\ExplSyntaxOff
\end{document}

Mit saubererer Codierung und xparse:

\documentclass{article}
\usepackage{xparse,etoolbox}

\ExplSyntaxOn
\NewDocumentCommand{\test}{O{true}}
 {
  \str_case:nn {#1}
   {
    {true}{\message{true}}
   }
 }
\ExplSyntaxOff

\AfterEndEnvironment{equation}{\test}

\begin{document}

\begin{equation}
0
\end{equation}

\end{document}

Eine der Stärken der expl3Sprache besteht darin, dass jede Funktion eine Signatur hat, die erklärt, wie viele Argumente sie erwartet und welche Art von Argumenten sie hat. Es gibt zwar den wSpezifizierer, dieser wird jedoch normalerweise in den internen Code und nicht in den Code höherer Ebene verbannt.

Die beiden wichtigsten Argumentspezifizierer sind Nund n: Ersterer gibt an, dass die Funktion ein Argument erwartet, das aus einem einzelnen Token besteht, letzterer gibt ein Argument in Klammern an.

Als nächstes kommen die Tund FSpezifizierer, die sehr ähnlich sind n, d. h., es wird ein geschweiftes Argument erwartet; solche Spezifizierer werden für Funktionen verwendet, die bedingte Verzweigungen durchführen.

Andere Argumentspezifizierer sind c, o, V, v, e, fund x, die nur in Signaturen erscheinen können, die wie folgt definiert sind \cs_generate_variant:Nn:

  • cgibt ein geschweiftes Argument an, aus dem ein Steuersequenzname gebildet wird;

  • ogibt ein geschweiftes Argument an, dessen Inhalt einmal erweitert wird, bevor es an die Hauptfunktion übergeben wird;

  • Vgibt ein einzelnes Token-Argument (ohne Klammern) an, das ein Variablenname (Gleitkommazahl) sein sollte; der Wert der Variablen wird als Argument in Klammern an die Hauptfunktion übergeben;

  • vist wie V, aber das Argument sollte in Klammern stehen; es wird ein Variablenname gebildet und danach ist das Verhalten dasselbe wie bei V;

  • e, fund xgeben Sie geschweifte Argumente an, die erweitert werden, bevor sie an die Hauptfunktion übergeben werden.

In Ihrem Fall \str_case:nnFerwartet die Funktion alsodreiArgumente. TeX sucht nach dem dritten und das Ergebnis kann beliebiger Müll sein, je nachdem, was im Haupteingabestrom folgt. Durch reinen Zufall wird nichts kaputt gemacht , wenn Sie Ihr \testMakro aufrufen.\BeforeBeginEnvironment

verwandte Informationen