\fi ошибка в хуке \afterenvironment в пакете etoolbox

\fi ошибка в хуке \afterenvironment в пакете etoolbox

Вероятно, это проблема 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ничего не сломает.

Связанный контент