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が、供給のみであることです3 つの引数の代わりに引数が必要なので、もう 1 つが求められます。

\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}

この言語の長所の 1 つexpl3は、すべての関数に、必要な引数の数とその性質を説明するシグネチャがあることです。指定子はありますwが、これは通常、上位レベルのコードではなく、内部コードに委ねられます。

2 つの主な引数指定子はNとですn。前者は関数が単一のトークンで構成される引数を期待することを示し、後者は中括弧で囲まれた引数を指定します。

次に、TおよびF指定子が続きます。これらは と非常によく似ておりn、中括弧で囲まれた引数が期待されます。このような指定子は、条件分岐を行う関数に使用されます。

その他の引数指定子はc、、、、、およびであり、これらはo、を通じて定義されVたシグネチャでのみ使用できます。vefx\cs_generate_variant:Nn

  • c制御シーケンス名が形成される中括弧付き引数を指定します。

  • oメイン関数に渡される前に内容が一度展開される中括弧付き引数を指定します。

  • V変数名浮動小数点となる単一のトークン(中括弧なし)引数を指定します。変数の値は、中括弧付き引数としてメイン関数に渡されます。

  • vは と似ていますVが、引数は中括弧で囲む必要があります。変数名が形成され、その後の動作は と同じになりますV

  • e、メイン関数に渡される前に展開される中括弧で囲まれた引数を指定しますfx

つまり、あなたの場合、\str_case:nnF関数は三つ引数。TeX は 3 番目の引数を探しますが、メインの入力ストリームに何が続くかによって、結果は任意のゴミになる可能性があります。まったくの偶然ですが、\testマクロを呼び出しても\BeforeBeginEnvironment何も起こりません。

関連情報