如何在可能包含换行符的宏参数上运行 \IfSubStr

如何在可能包含换行符的宏参数上运行 \IfSubStr

我有一个宏,其中的参数可能包含换行符,但是当其中包含换行符时,一切似乎都会中断。

我该如何避免这个问题?我还希望 \IfSubStr 在参数字符串中的任何位置查找匹配项,而不管换行符。

以下是一个例子:

\documentclass{scrartcl}
\usepackage{xstring}

\newcommand{\mytest}[8]{%                                                                                                                         
  \IfSubStr{#1}{\#HIDE}{Hidden.}{#1}
}


\begin{document}

Four tests follow:

1. \mytest{Some string that is not hidden.}

2. \mytest{Another string that is not hidden.}

3. \mytest{Some string that is hidden.\#HIDE}

4. \mytest{A string that does not work and breaks everything because it has a newline\newline in it}

Tests completed.

\end{document}

我使用 pdflatex 得到的输出是:

接下来进行四个测试: 1. 一些未隐藏的字符串。。隐藏。测试完成。

我也不明白为什么 test 2 无法打印。出于某种原因,我无法使用 [1] 作为 \mytest 的参数数量。

答案1

包默认\xstring使用,这意味着其宏中的文本使用 以困难的方式完全展开。这不符合 LaTeX 的保护机制,宏可能会中断。在您的例子中,您根本不需要扩展,因为字符串是明文给出的,因此示例修改为调用。它被放入一个组中,以便不干扰可能使用 的宏的其他包。\fullexpandarg\edef\mytest\noexpandargxstring

\documentclass{scrartcl}
\usepackage{xstring}

\newcommand{\mytest}[1]{%
  \begingroup
    \noexpandarg
    \IfSubStr{#1}{\#HIDE}{Hidden.}{#1}%
  \endgroup
}


\begin{document}

Four tests follow:

1. \mytest{Some string that is not hidden.}

2. \mytest{Another string that is not hidden.}

3. \mytest{Some string that is hidden.\#HIDE}

4. \mytest{A string that now works and does not break    
   everything because of a newline\newline in it}    

Tests completed.

\end{document}

结果

另请参阅文档包的xstring,部分“3.1.1 命令\fullexpandarg\expandarg\noexpandarg”。

答案2

后面的数字\newcommand{<cmd>}定义参数的数量。你只使用了 1,所以不要输入[8]。目前,你抓取了前 8 个标记作为 的参数\mytest,它们是

  1. {Some string that is not hidden.}
  2. \par
  3. 2
  4. .
  5. \mytest
  6. {Another string that is not hidden.}
  7. \par
  8. 3

...然后您在第一次.调用后将其作为下一个输入开始。\mytest

在下面的例子中,我做了\newline一个无操作,以便\IfSubStr可以更好地与其参数配合:

在此处输入图片描述

\documentclass{scrartcl}
\usepackage{xstring}

\let\storenewline\newline
\newcommand{\mytest}[1]{{%
  \let\newline\relax%
  \IfSubStr{#1}{\#HIDE}{Hidden.}{\let\newline\storenewline #1}%
}}


\begin{document}

Four tests follow:

\begin{enumerate}
  \item
  \mytest{Some string that is not hidden.}

  \item
  \mytest{Another string that is not hidden.}

  \item
  \mytest{Some string that is hidden.\#HIDE}

  \item
  \mytest{A string that does not work and \newline breaks everything because it has a newline in it.}

  \item
  \mytest{A string that should be hidden and \newline has a newline in it.\#HIDE}
\end{enumerate}

Tests completed.

\end{document}

这可能是具体的适用于您使用的情况\newline。其他宏也可能导致问题,为此Heiko 的回答更好。

相关内容