我正在尝试创建一个宏,其中可选项使列表中的某项加粗。我可以使用 expl3/xparse 包处理列表,并且可以比较两个字符串,但我无法同时执行这两项操作。是否可以将比较作为接受一个参数的封装宏返回,或者可以扩展 ProcessList 来处理两个参数?我有读这里还有其他帖子,但似乎找不到任何符合此用例的内容。
\documentclass{article}
\ExplSyntaxOn
\newcommand{\compare}[2]{\ifthenelse{\equal{#1}{#2}}{\textbf{#1}}{\emph{#2}}}
\NewDocumentCommand\within{O{} >{\SplitList{,}}m}{%
\def\compari{\compare{#1}{##2}}
\ProcessList{#2}{\compari}%
}
\ExplSyntaxOff
\begin{document}
\compare{apples}{bananas}
\compare{apples}{apples}
\within{apples}{apples,bananas}
\end{document}
预期输出
香蕉
苹果
苹果,香蕉
答案1
以下解决方案使用\@for
循环,该循环需要逗号分隔的列表。但仍有一个错误,因为如果列表包含空格,此代码将崩溃。
\documentclass{article}
\makeatletter
\newcommand*{\within}[2]{%
\def\@tempa{#1}%
\def\separator{\def\separator{,\space}}% to place the comma in the printed list only after the first iteration
\@for\x:=#2\do{\separator\ifx\@tempa\x\textbf{\x}\else\emph{\x}\fi}%
}
\makeatother
\begin{document}
\within{apples}{apples,bananas,pears,apples,strawberries} % the apples are bold (twice)
\within{pears}{apples,bananas,pears,apples,strawberries} % the pears are bold
\end{document}