
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 expl3
linguagem é que cada função possui uma assinatura que explica quantos argumentos ela espera e também sua natureza. Bem, existe o w
especificador, 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 N
e 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 T
and 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
, o
que V
só v
podem e
aparecer em assinaturas definidas por meio de :f
x
\cs_generate_variant:Nn
c
especifica um argumento entre chaves a partir do qual um nome de sequência de controle será formado;o
especifica um argumento entre chaves cujo conteúdo será expandido uma vez antes de ser passado para a função principal;V
especifica 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
é comoV
, mas o argumento deve ser reforçado; um nome de variável será formado e depois disso o comportamento será o mesmo deV
;e
e especifique argumentos entre colchetesf
quex
serão expandidos antes de serem passados para a função principal.
Então, no seu caso, a \str_case:nnF
funçã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 \test
macro \BeforeBeginEnvironment
não quebra as coisas.