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