etoolbox 包中的 \afterenvironment 钩子中存在 \fi 错误

etoolbox 包中的 \afterenvironment 钩子中存在 \fi 错误

这可能是 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说明符,但这通常被归入内部代码,而不是更高级别的代码。

两个主要的参数说明符是Nn:前者表示该函数需要一个由单个标记组成的参数,后者在括号中指定一个参数。

接下来是TF说明符,它们与非常相似n,也就是说,需要一个带括号的参数;这样的说明符用于执行条件分支的函数。

其他参数说明符有、 、co和,它们只能出现在通过以下方式定义的签名中:Vvefx\cs_generate_variant:Nn

  • c指定一个括号参数,由此形成控制序列名称;

  • o指定一个括号参数,其内容将在传递给主函数之前扩展一次;

  • V指定一个单个标记(无括号)参数,该参数应为变量名浮点数);该变量的值将作为括号参数传递给主函数;

  • v类似于V,但参数应该用括号括起来;将形成一个变量名,之后的行为将与相同V

  • efx指定在传递给主函数之前将被扩展的括号参数。

因此,在你的情况下,该\str_case:nnF函数需要参数。TeX 将寻找第三个参数,结果可能是任意垃圾,具体取决于主输入流中接下来的内容。纯属偶然,调用\test\BeforeBeginEnvironment不会破坏任何东西。

相关内容