对变量的内容进行子字符串替换

对变量的内容进行子字符串替换

假设我有一个包含一些非纯文本的变量,例如\def\var{Caro \textit{et al.}},我想Caro对进行子字符串替换\underline{Caro}。如果我尝试按照以下方法进行操作替换子字符串,这将失败:

\documentclass{minimal}
\usepackage{xstring}
\def\ReplaceStr#1{%
  \IfSubStr{#1}{Caro}{%
    \StrSubstitute{#1}{Caro}{\underline{Caro}}}{#1}}

\begin{document}

\def\var{Caro \textit{et al.}}

\ReplaceStr{\var}

\end{document}

如果我从变量定义中删除格式,即\def\var{Caro et al.},那么它就可以工作:

\documentclass{minimal}
\usepackage{xstring}
\def\ReplaceStr#1{%
  \IfSubStr{#1}{Caro}{%
    \StrSubstitute{#1}{Caro}{\underline{Caro}}}{#1}}

\begin{document}

\def\var{Caro et al.}

\ReplaceStr{\var}

\end{document}

不幸的是,在我的实际情况下,我无法直接修改附带的格式,\var因为它是通过一系列命令生成的。我该怎么做:

  • \var在进行子字符串替换之前,删除所有格式(即使其成为“纯文本”)
  • 使字符串替换对格式化的文本正确起作用

对于那些好奇的人来说,我的实际\var来源是 biblatex 调用:\def\var{\citename{somebibitem}{author}}

答案1

您必须小心扩展;默认情况下xstring会执行完全扩展并且\textit不会存活。

\documentclass{article}
\usepackage{xstring}

\newcommand\replacecaro[1]{%
  \begingroup\expandarg
  \IfSubStr{#1}{Caro}{\StrSubstitute{#1}{Caro}{\underline{Caro}}}{#1}%
  \endgroup
}

\begin{document}

\newcommand{\var}{Caro \textit{et al.}}

\replacecaro{\var}

\end{document}

在此处输入图片描述

在 LaTeX 中使用\def,除非你确切知道为什么需要它。

相关内容