这可能是 etoolbox 或 expl3 问题,我不知道如何解决。我编译了文档:
\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}
并出现错误: ! Extra \fi.\end ...if@ignore @ignorefalse \ignorespaces \fi
l.15 \end{equation} 请帮我解决这个问题。感谢大家的帮助。
答案1
答案是错误的。请使用@egreg 的答案。
答案2
问题是你使用\str_case:nnF
,但只供应二它的参数而不是需要的三个,因此需要再寻找一个。
\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}
具有更清晰的编码和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}
该语言的一个优点expl3
是每个函数都有一个签名,用于说明它需要多少个参数以及它们的性质。好吧,有一个w
说明符,但这通常被归入内部代码,而不是更高级别的代码。
两个主要的参数说明符是N
和n
:前者表示该函数需要一个由单个标记组成的参数,后者在括号中指定一个参数。
接下来是T
和F
说明符,它们与非常相似n
,也就是说,需要一个带括号的参数;这样的说明符用于执行条件分支的函数。
其他参数说明符有、 、c
、o
和,它们只能出现在通过以下方式定义的签名中:V
v
e
f
x
\cs_generate_variant:Nn
c
指定一个括号参数,由此形成控制序列名称;o
指定一个括号参数,其内容将在传递给主函数之前扩展一次;V
指定一个单个标记(无括号)参数,该参数应为变量名浮点数);该变量的值将作为括号参数传递给主函数;v
类似于V
,但参数应该用括号括起来;将形成一个变量名,之后的行为将与相同V
;e
,f
并x
指定在传递给主函数之前将被扩展的括号参数。
因此,在你的情况下,该\str_case:nnF
函数需要三参数。TeX 将寻找第三个参数,结果可能是任意垃圾,具体取决于主输入流中接下来的内容。纯属偶然,调用\test
宏\BeforeBeginEnvironment
不会破坏任何东西。