用于在内联列表项之间放置分隔符的宏

用于在内联列表项之间放置分隔符的宏

现在已经很晚了,所以我可能没有充分考虑这个问题,但我敢发誓,存在一个宏(可能不是包的一部分,只是我在某个地方捡到的东西),它能够获取某种由某个字符分隔的内联列表,并将该字符替换为另一个字符串。例如,类似

\ThisImaginaryMacro{apples;oranges;peaches;pears}

会产生类似

apples $\cdot$ oranges $\cdot$ peaches $\cdot$ pears

因为我在某处指定应该用 替换分号$\cdot$

我一直在搜索.tex我最近制作的所有文件,但似乎就是找不到这个,这让我很抓狂,所以非常感谢任何帮助。

答案1

你可以用很多方法来实现。例如xstring

\usepackage{xstring}
\newcommand{\RealMacro}[1]{\StrSubstitute{#1}{;}{$\cdot$}}

然而,这要求您非常严格地输入参数,并且分号周围不能有空格。

一个非常强大的解决方案使用xparseLaTeX3 包:

\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

相关内容