
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 expl3
Sprache 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 w
Spezifizierer, dieser wird jedoch normalerweise in den internen Code und nicht in den Code höherer Ebene verbannt.
Die beiden wichtigsten Argumentspezifizierer sind N
und 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 T
und F
Spezifizierer, 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
, f
und x
, die nur in Signaturen erscheinen können, die wie folgt definiert sind \cs_generate_variant:Nn
:
c
gibt ein geschweiftes Argument an, aus dem ein Steuersequenzname gebildet wird;o
gibt ein geschweiftes Argument an, dessen Inhalt einmal erweitert wird, bevor es an die Hauptfunktion übergeben wird;V
gibt 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;v
ist wieV
, aber das Argument sollte in Klammern stehen; es wird ein Variablenname gebildet und danach ist das Verhalten dasselbe wie beiV
;e
,f
undx
geben Sie geschweifte Argumente an, die erweitert werden, bevor sie an die Hauptfunktion übergeben werden.
In Ihrem Fall \str_case:nnF
erwartet 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 \test
Makro aufrufen.\BeforeBeginEnvironment