软件包 xparse \SplitList 最后一个标记

软件包 xparse \SplitList 最后一个标记

我需要创建一个宏来呈现具有可变数量参数(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

识别第一项比识别最后一项容易。

针对此问题,有很多策略。

  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}
    
  2. 首次使用时重新定义宏;按组进行处理将恢复\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}
    
  3. 使用与宏不同的方法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您修改输出的列表分隔符(或项目分隔符)。默认为--

相关内容