我需要创建一个宏来呈现具有可变数量参数(1+)的列表,例如
\mylist{1,2,3}
应扩展为$\tilde{1}$--$\tilde{2}$--$\tilde{3}$
。我正在尝试使用xparse
和\SplitList
,但我没有找到一种方法来判断何时处理最后一个标记(我不需要分隔符--
)。
\NewDocumentCommand\mylist{>{\SplitList{,}}m}
{
\ProcessList{#1}{\myitem}
}
\newcommand\myitem[1]{$\tilde{#1}$--}
这将扩展\mylist{1}
为 ,$\tilde{1}$--
而不是所需的$\tilde{1}$
。
答案1
识别第一项比识别最后一项容易。
针对此问题,有很多策略。
使用条件
\documentclass{article} \usepackage{xparse} \NewDocumentCommand\mylist{>{\SplitList{,}}m} {% \ProcessList{#1}{\myitem}% \firstitemtrue } \newif\iffirstitem \firstitemtrue \newcommand\myitem[1]{% \iffirstitem \firstitemfalse \else --% \fi $\tilde{#1}$} \begin{document} \mylist{a,b,c} \end{document}
首次使用时重新定义宏;按组进行处理将恢复
\myitem
到初始含义。\documentclass{article} \usepackage{xparse} \NewDocumentCommand\mylist{>{\SplitList{,}}m} {% {\ProcessList{#1}{\myitem}}% } \newcommand\myitem[1]{$\tilde{#1}$\let\myitem\myitema} \newcommand\myitema[1]{--$\tilde{#1}$} \begin{document} \mylist{a,b,c} \end{document}
使用与宏不同的方法
expl3
,这种方法更加灵活,但会有一些复杂性。\documentclass{article} \usepackage{xparse} \ExplSyntaxOn \NewDocumentCommand\mylist{m} { \egreg_process_list:n {#1} } % define a sequence for storing the "massaged" items \seq_new:N \l_egreg_items_seq \cs_new_protected:Npn \egreg_process_list:n #1 { % clear the sequence \seq_clear:N \l_egreg_items_seq % cycle through the arguments, storing "\tilde{<arg>}" in the sequence \clist_map_inline:nn { #1 } { \seq_put_right:Nn \l_egreg_items_seq { $\tilde{##1}$ } } % output the sequence putting "--" in between elements \seq_use:Nnnn \l_egreg_items_seq { -- } { -- } { -- } } \ExplSyntaxOff \begin{document} \mylist{a,b,c} \end{document}
这三种情况下的输出都是
请注意,除非您处于%
上下文中,否则仍然需要保护正文中的行尾。\NewDocumentCommand
\ExplSyntaxOn
答案2
我经常使用这个技巧(见狡猾的 (La)TeX 技巧)。方法是使用“延迟”来定义列表分隔符。也就是说,将其定义为定义,以便第一次使用时只定义自身:
\documentclass{article}
\usepackage{xparse}% http://ctan.org/pkg/xparse
\NewDocumentCommand\mylist{O{--} >{\SplitList{,}}m}
{%
\def\itemdelim{\def\itemdelim{#1}}% Define list separator with one delay
\ProcessList{#2}{\myitem}% Process list
}
\newcommand\myitem[1]{\itemdelim$\tilde{#1}$}
\begin{document}
\mylist{a,b,c}
\end{document}
附加的可选参数允许\mylist
您修改输出的列表分隔符(或项目分隔符)。默认为--
。