未扩展字符串替换

未扩展字符串替换

这个问题与对变量的内容进行子字符串替换。是否可以对任意字符串执行字符串替换,而无需扩展?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}

在此处输入图片描述

相关内容