假设我有一个包含一些非纯文本的变量,例如\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
,除非你确切知道为什么需要它。