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}

並且得到一個錯誤: !額外的\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,也就是說,需要一個大括號參數;此類說明符用於執行條件分支的函數。

其他參數說明符包括coVvefx它們只能出現在透過 定義的簽名中\cs_generate_variant:Nn

  • c指定將形成控制序列名稱的大括號參數;

  • o指定一個大括號參數,其內容在傳遞給主函數之前將被擴展一次;

  • V指定單一標記(無括號)參數,該參數應該是變數名浮點);變數的值將作為花括號參數傳遞給主函數;

  • v就像V,但論證應該被支持;將形成一個變數名稱,之後的行為將與V;相同

  • efx指定在傳遞給主函數之前將展開的花括號參數。

所以在你的情況下\str_case:nnF函數期望論據。 TeX 將尋找第三個,結果可能是任意垃圾,這取決於主輸入流中接下來的內容。純屬偶然,呼叫\test巨集\BeforeBeginEnvironment不會破壞任何東西。

相關內容