我尝试使用\protect
以下\edef
方法,但没有成功。有办法吗?
\documentclass{article}
\usepackage{xstring}
\begin{document}
\def\abc{a,b,c}
\edef\result{\StrSubstitute[2]{\abc}{,}{ }}
\result
\end{document}
etoolbox
注意:我知道我可以使用或做同样的事情xpatch
(我已经这样做了),但对上述问题感到好奇。
答案1
答案很简单:不能。
该指令\edef
纯粹通过扩展来工作;在:期间不能执行任何赋值\edef
。当 TeX 在其中找到不可扩展的标记时,\edef
它会忽略它并继续处理下一个标记。
所以你不能说
\newcount\baz
\edef\foo{\advance\baz 1 \number\baz}
并希望\foo
扩展到1
。它将扩展到
\advance\baz 1 0
因为\advance
、\baz
和1
不可扩展,而\number
可扩展。只需在交互式会话中尝试一下:
This is TeX, Version 3.1415926 (TeX Live 2013)
**\relax
*\newcount\baz
*\edef\foo{\advance\baz 1 \number\baz}
*\show\foo
> \foo=macro:
->\advance \baz 1 0.
<*> \show\foo
和\StrSubstitute
一些进行赋值;不仅对寄存器的操作是赋值,而且和\def\
也是\let
。
\result
定义包含替换结果的正确方法是
\StrSubstitute[2]{\abc}{,}{ }[\result]
尾随可选参数可以在大多数宏中使用xstring
。
这是测试文件:
\documentclass{article}
\usepackage{xstring}
\begin{document}
\def\abc{a,b,c}
\StrSubstitute[2]{\abc}{,}{ }[\result]
\texttt{\meaning\result}
\end{document}