我正在尝试构建一个使用 xstring 包中的 IfSubStr 的命令“TEST”。使用该命令时,我需要传递另一个包含 figure* 环境的命令“ARGUMENT”。
当使用 LaTex (MikTeX) 编译以下代码时,出现以下错误:
! \reserved@a 的参数有一个额外的 }。
如果命令 ARGUMENT 中没有 figure* 环境,则没有问题。我不知道如何解决这个问题。有人能帮我吗?
\documentclass{article}
\usepackage{xstring}
\begin{document}
\newcommand{\TEST}[1]{
\IfSubStr{#1}{find me} {
found it
}{
didn't find it
}
}
\newcommand{\ARGUMENT}{
\begin{figure*}
find me
\end{figure*}
}
\TEST{
some text
\ARGUMENT
}
\end{document}
答案1
默认情况下,xstring
执行命令参数的完整扩展,但诸如\begin
完全扩展后无法继续存在。
在我看来,xstring
应该提供一个“受保护的”完整扩展模式,但由于它是为普通 TeX 编写的,所以作者甚至没有尝试过。
不过,您可以添加它。
\documentclass{article}
\usepackage{xstring}
\makeatletter
\newcommand{\protectedIfSubStr}[5][1]{%
\saveexpandmode\noexpandarg
\begingroup\protected@edef\x{%
\endgroup\noexpand\IfSubStr[#1]{#2}{#3}}\x{#4}{#5}%
\restoreexpandmode
}
\makeatletter
\begin{document}
\newcommand{\TEST}[1]{%
\protectedIfSubStr{#1}{find me}{%
found it%
}{%
didn't find it%
}%
}
\newcommand{\ARGUMENT}{%
\begin{figure*}
find me
\end{figure*}
}
\TEST{some text\ARGUMENT}
\end{document}
请注意 TeX 不是 C 或派生语言:空格、空行和尾行是重要的。