
這可能是 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
說明符,但這通常屬於內部程式碼,而不是更高層級的程式碼。
兩個主要參數說明符是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
不會破壞任何東西。