\fi erro no gancho \afterenvironment no pacote etoolbox

\fi erro no gancho \afterenvironment no pacote etoolbox

Provavelmente é um problema de etoolbox ou expl3 e não sei como resolvê-lo. Eu compilo o 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}

e recebo um erro: ! Extra \fi. \end ...if@ignore @ignorefalse \ignorespaces \fi

l.15 \end{equation} Ajude-me a resolver este problema. Obrigado a todos por qualquer ajuda.

Responder1

A resposta estava errada. Use a resposta de @egreg.

Responder2

O problema é que você usa \str_case:nnF, mas só fornecedoisargumentos para ele em vez dos três são necessários, então mais um é procurado.

\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}

Com codificação mais limpa e 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}

Um dos pontos fortes da expl3linguagem é que cada função possui uma assinatura que explica quantos argumentos ela espera e também sua natureza. Bem, existe o wespecificador, mas isso geralmente é relegado ao código interno, não ao código de nível superior.

Os dois especificadores de argumento principais são Ne n: o primeiro denota que a função espera um argumento que consiste em um único token, o último especifica um argumento entre colchetes.

Em seguida vêm os especificadores Tand F, que são muito semelhantes a n, ou seja, espera-se um argumento entre chaves; tais especificadores são usados ​​para funções que fazem ramificação condicional.

Outros especificadores de argumento são , , , , e c, oque Vvpodem eaparecer em assinaturas definidas por meio de :fx\cs_generate_variant:Nn

  • cespecifica um argumento entre chaves a partir do qual um nome de sequência de controle será formado;

  • oespecifica um argumento entre chaves cujo conteúdo será expandido uma vez antes de ser passado para a função principal;

  • Vespecifica um argumento de token único (sem chaves) que deve ser um ponto flutuante de nome de variável); o valor da variável será passado como um argumento entre chaves para a função principal;

  • vé como V, mas o argumento deve ser reforçado; um nome de variável será formado e depois disso o comportamento será o mesmo de V;

  • ee especifique argumentos entre colchetes fque xserão expandidos antes de serem passados ​​para a função principal.

Então, no seu caso, a \str_case:nnFfunção esperatrêsargumentos. O TeX estará procurando o terceiro e o resultado pode ser um lixo arbitrário, dependendo do que segue no fluxo de entrada principal. Por puro acaso, chamar sua \testmacro \BeforeBeginEnvironmentnão quebra as coisas.

informação relacionada