现在已经很晚了,所以我可能没有充分考虑这个问题,但我敢发誓,存在一个宏(可能不是包的一部分,只是我在某个地方捡到的东西),它能够获取某种由某个字符分隔的内联列表,并将该字符替换为另一个字符串。例如,类似
\ThisImaginaryMacro{apples;oranges;peaches;pears}
会产生类似
apples $\cdot$ oranges $\cdot$ peaches $\cdot$ pears
因为我在某处指定应该用 替换分号$\cdot$
。
我一直在搜索.tex
我最近制作的所有文件,但似乎就是找不到这个,这让我很抓狂,所以非常感谢任何帮助。
答案1
你可以用很多方法来实现。例如xstring
:
\usepackage{xstring}
\newcommand{\RealMacro}[1]{\StrSubstitute{#1}{;}{$\cdot$}}
然而,这要求您非常严格地输入参数,并且分号周围不能有空格。
一个非常强大的解决方案使用xparse
LaTeX3 包:
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\RealMacro}{ O{~$\cdots$~} m }
{
\ryan_change_semicolons:nn { #1 } { #2 }
}
\seq_new:N \l_ryan_input_seq
\cs_new_protected:Npn \ryan_change_semicolons:nn #1 #2
{
\seq_set_split:Nnn \l_ryan_input_seq { ; } { #2 }
\seq_use:Nnnn \l_ryan_input_seq { #1 } { #1 } { #1 }
}
\ExplSyntaxOff
有了这个定义,你不必担心输入以下任何一个
\RealMacro{apples;oranges;peaches;pears}
\RealMacro{apples ; oranges; peaches;pears}
因为前导和尾随空格将被删除。该宏还允许调用如下函数
\RealMacro[, ]{apples;oranges;peaches;pears}
输出为
苹果、橘子、桃子、梨
可选参数的默认值<space>$\cdot$<space>
与请求的一致。
答案2
仅提供循环列表的替代方法:
\documentclass{article}
\begingroup\lccode`\~`\;\lowercase{\endgroup
\def\ThisImaginaryMacro#1{\gdef~{\cdot}$\mathcode`\;"8000 \mathrm{#1}$}}
\begin{document}
\ThisImaginaryMacro{apples;oranges;peaches;pears}
\end{document}
答案3
这类任务可以方便地通过递归宏完成:
%recursive ``low-level'' macro
\def\sToC#1;#2\nil{#1\ifx\empty#2\empty\else\space$\cdot$\space\sToC#2\nil\fi}
%user-friendly ``driver'' macro
\def\semicToCdot#1{\expandafter\sToC#1;\nil}
\semicToCdot{apples;oranges;peaches;pears}
\bye