\fi error en el gancho \afterenvironment en el paquete etoolbox

\fi error en el gancho \afterenvironment en el paquete etoolbox

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 expl3lenguaje es que cada función tiene una firma que explica cuántos argumentos espera y también su naturaleza. Bueno, está el wespecificador, pero generalmente está relegado al código interno, no al código de nivel superior.

Los dos especificadores de argumentos principales son Ny 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 Ty 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, oque Vsolo vpueden eaparecer en firmas definidas mediante :fx\cs_generate_variant:Nn

  • cespecifica un argumento entre llaves a partir del cual se formará un nombre de secuencia de control;

  • oespecifica un argumento entre llaves cuyo contenido se expandirá una vez antes de pasarse a la función principal;

  • Vespecifica 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;

  • ves como V, pero el argumento debe ir reforzado; se formará un nombre de variable y luego el comportamiento será el mismo que V;

  • ey especifique los argumentos entre llaves que fse xexpandirán antes de pasar a la función principal.

Entonces en tu caso la \str_case:nnFfunció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 \testmacro \BeforeBeginEnvironmentno rompe las cosas.

información relacionada