我有一个宏,其中的参数可能包含换行符,但是当其中包含换行符时,一切似乎都会中断。
我该如何避免这个问题?我还希望 \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
\noexpandarg
xstring
\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
,它们是
{Some string that is not hidden.}
\par
2
.
\mytest
{Another string that is not hidden.}
\par
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 的回答更好。