我想要一个命令用包中的命令\myreplace
替换所有实例。(事实上,这是命令执行的操作之一,但由于与此事无关的原因,我无法使用该特定命令。)因此,我运行代码。:
\textlengthmark
tipa
tipa
\textipa
\documentclass{memoir}
\usepackage{xstring,tipa}
\newcommand*\myreplace[1]{\StrSubstitute{#1}{:}{\textlengthmark}}
\begin{document}
\myreplace{gaga:}
\end{document}
然而我得到的只是
TeX 容量超出,抱歉 [输入堆栈大小=5000] \myreplace{gaga:}
这似乎与命令有关\textlengthmark
,因为用任何其他字符串替换它都可以。
有人能发现错误吗?
答案1
xstring
这是默认情况下尝试全面扩展其参数的常见问题。
\documentclass{memoir}
\usepackage{xstring,tipa}
\newcommand*\myreplace[1]{%
\saveexpandmode\noexpandarg
\StrSubstitute{#1}{:}{\textlengthmark}%
\restoreexpandmode}
\begin{document}
\myreplace{gaga:}
\end{document}
如果您不需要使用xstring
具有不同“扩展模式”设置的命令,只需发出命令\noexpandarg
然后\usepackage{xstring}
忘记它,因为您的版本将会起作用。
答案2
一种stringstrings
方法:
\documentclass{memoir}
\usepackage{stringstrings,tipa}
\makeatletter
\newcommand*\myreplace[1]{%
\encodetoken{\textlengthmark}%
\convertchar[e]{#1}{:}{\textlengthmark}%
\retokenize{\thestring}%
\protected@edef\xyz{\thestring}%
\decodetoken{\textlengthmark}%
\xyz
}
\makeatother
\begin{document}
\myreplace{gaga:}
\end{document}