这个问题与对变量的内容进行子字符串替换。是否可以对任意字符串执行字符串替换,而无需扩展?MWE:
\documentclass{article}
\usepackage{xstring}
\begin{document}
\noexpandarg
\StrSubstitute{John \textit{knows} that Mary is a unicorn}{knows}{believes}
\end{document}
使用此 MWE,无需替换任何内容。期望的行为是用 替换\textit{knows}
,\textit{believes}
即逐字逐句地进行简单替换。此外,例如,\StrSubstitute{\textit{knows}}{tex}{latex}
应导致\latexit{knows}
(即,替换应将字符串视为给定的,而不考虑任何内部语义)。
最好有一个pdflatex
解决方案(没有 lua、perl、sed、文本编辑器搜索和替换)。xstring
不是必需的。
答案1
默认情况下,xstring 不会考虑组。但你可以强制它考虑括号内的文本:
\documentclass{article}
\usepackage{xstring}
\begin{document}
\noexpandarg
\StrSubstitute{John {knows} that Mary is a unicorn}{knows}{believes}
\exploregroups
\StrSubstitute{John {knows} that Mary is a unicorn}{knows}{believes}
\StrSubstitute{John \textit{knows} that Mary is a unicorn}{knows}{believes}
\end{document}
答案2
使用 可以很轻松实现这种简单的替换l3regex
。
\documentclass{article}
\usepackage{xparse,l3regex}
\ExplSyntaxOn
\NewDocumentCommand{\strsubstitute}{ +m m m }
{
\tl_set:Nn \l_marijn_strsubst_tl { #1 }
\regex_replace_all:nnN { #2 } { #3 } \l_marijn_strsubst_tl
\tl_use:N \l_marijn_strsubst_tl
}
\tl_new:N \l_marijn_strsubst_tl
\ExplSyntaxOff
\begin{document}
\strsubstitute{John \textit{knows} that Mary is a unicorn}{knows}{believes}
\strsubstitute{John \textit{knows} that Mary is a unicorn}{\c{textit}}{\c{textbf}}
\end{document}