
Probablemente sea un problema de etoolbox o expl3 y no sé cómo solucionarlo. Recopilo documento:
\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}
y aparece un error: ! \fi adicional. \end ...if@ignore @ignorefalse \ignorespaces \fi
l.15 \end{equation} Ayúdame por favor a resolver este problema. Gracias a todos por cualquier ayuda.
Respuesta1
La respuesta fue incorrecta. Utilice la respuesta de @egreg en su lugar.
Respuesta2
El problema es que usas \str_case:nnF
, pero solo suministras.dosargumentos para ello en lugar de los tres que se requieren, por lo que se busca uno más.
\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}
Con codificación más limpia y 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}
Uno de los puntos fuertes del expl3
lenguaje es que cada función tiene una firma que explica cuántos argumentos espera y también su naturaleza. Bueno, está el w
especificador, pero generalmente está relegado al código interno, no al código de nivel superior.
Los dos especificadores de argumentos principales son N
y n
: el primero indica que la función espera un argumento que consta de un único token, el segundo especifica un argumento entre llaves.
Luego vienen los especificadores T
y F
, que son muy similares a n
, es decir, se espera un argumento entre llaves; Estos especificadores se utilizan para funciones que realizan bifurcaciones condicionales.
Otros especificadores de argumentos son , , , , y c
, o
que V
solo v
pueden e
aparecer en firmas definidas mediante :f
x
\cs_generate_variant:Nn
c
especifica un argumento entre llaves a partir del cual se formará un nombre de secuencia de control;o
especifica un argumento entre llaves cuyo contenido se expandirá una vez antes de pasarse a la función principal;V
especifica un argumento de token único (sin refuerzos) que debe ser un nombre de variable en punto flotante); el valor de la variable se pasará como argumento entre llaves a la función principal;v
es comoV
, pero el argumento debe ir reforzado; se formará un nombre de variable y luego el comportamiento será el mismo queV
;e
y especifique los argumentos entre llaves quef
sex
expandirán antes de pasar a la función principal.
Entonces en tu caso la \str_case:nnF
función esperatresargumentos. TeX buscará el tercero y el resultado puede ser basura arbitraria, dependiendo de lo que siga en el flujo de entrada principal. Por pura casualidad, llamar a tu \test
macro \BeforeBeginEnvironment
no rompe las cosas.