在 edef 中使用 xstring 宏

在 edef 中使用 xstring 宏

我尝试使用\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\baz1不可扩展,而\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}

在此处输入图片描述

相关内容