使用 IfSubStr 时将命令传递给命令时出错

使用 IfSubStr 时将命令传递给命令时出错

我正在尝试构建一个使用 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 或派生语言:空格、空行和尾行重要的。

相关内容