迭代逗号分隔的参数

迭代逗号分隔的参数

我到处找了找,似乎找不到这个问题的简洁答案。是否有可能(如果可以,如何)创建一个命令,该命令将遍历逗号分隔值的“参数”并对其采取行动?

示例主要窃自newcommand 中的“For 循环”

\newcommand{\pdfappendix}[1]{
    for \image in #1
    {
       \includegraphics[scale=0.6]{\image.pdf}
    }
}

这里的目标是创建一个可以打印文件菜单结构(或某些任意路径)的命令,如下所示:

\ppath{Command,TeXing Options,Generate PDF (C-c C-t C-p)}

可能带有分隔符的可选参数(默认为\to或其他)

这将产生

Command -> TeXing Options -> Generate PDF (C-c C-t C-p)

ed?

答案1

etoolbox的列表处理能力非常简单:

在此处输入图片描述

\documentclass{article}
\usepackage{etoolbox}% http://ctan.org/pkg/etoolbox
\newcommand{\ppath}[2][$\;\triangleright\;$]{%
  \def\nextitem{\def\nextitem{#1}}% Separator
  \renewcommand*{\do}[1]{\nextitem\textsf{##1}}% How to process each item
  \docsvlist{#2}% Process list
}
\begin{document}
A decent file path is \ppath{File,New,Document}.
\end{document}

分隔符\nextitem在第一次使用时不执行任何操作。\do定义如何处理每个项目,而\docsvlist处理逗号分隔的列表。请参阅狡猾的 (La)TeX 技巧简要讨论一下 的使用\nextitem

答案2

找到答案另一个问题的答案. 与@Werner 的帮助(特别是延迟\def技巧),纯 TeX 解决方案无需额外的软件包即可工作。下面是我所寻找的一个最小工作示例。

\documentclass{article}

\makeatletter
\newcommand{\ppath}[2][ $\triangleright$ ]{%
  \def\nextitem{\def\nextitem{#1}}%
  \@for \el:=#2\do{\nextitem\el}%
}
\makeatother

\begin{document}
  A decent file path is \ppath{File,New,Why}.  I said, Why.
\end{document}

输出:

输出

(感谢@Peter、@jon。)


对评论的解释:

\def\nextitem{\def\nextitem{#1}}这里定义了\nextitem,当使用它时,重新定义\nextitem以扩展为第一次给出的参数。这是一个相当棘手的操作,所以再读一遍。

因此,如果我调用\nextitem{foo},它将扩展为\def\nextitem{foo}\nextitem标记已被使用和扩展,因此消失了。请注意,\nextitem从有一个参数变为没有参数;使用 之后\nextitem{foo},即本身重新定义\nextitemfoo-- 并且第一次不会发出foo(因为第一次只是重新定义。

这是技巧的核心:for 循环提供了一种输出方式>File>New>Why——\nextitem技巧是让第一个>“消失”——因为第一次\nextitem使用时,它所做的只是重新定义。

答案3

这是一个使用 LaTeX3 的解决方案,可能更简单

自 2021 年 5 月起

\clist_use:nn并且正如评论中\clist_use:nnnn所指出的那样可用。egreg

\documentclass{standalone}
\ExplSyntaxOn
\NewDocumentCommand \ppath { O{$\;\triangleright\;$} m } {
  \clist_use:nn { #2 } { #1 }
}
\ExplSyntaxOff
\begin{document}
A decent file path is \ppath{File,New,Document}.
\end{document}

输出为

在此处输入图片描述

2021年5月之前

该指令\clist_use:nn { #2 } { #1 }应替换为

  \group_begin:
  \clist_set:Nn \l_tmpa_clist { #2 }
  \clist_use:Nn \l_tmpa_clist { #1 }
  \group_end:

一些解释:

在第二个例子中,

  1. 我们将命令包装在一个组中以使用局部变量
  2. \l_tmpa_clist我们将强制参数存储在名为clist 类型的临时变量中
  3. 我们“使用”该变量来显示具有给定分隔符的列表

注意使用\clist_use:Nn而不是\clist_use:nn

LaTeX3 命令文档在 CTAN 上以 interface3.pdf 形式提供,也可使用 本地获取texdoc interface3

答案4

在 OpTeX 中,我们有\foreach语法命令

\foreach <list of object>\do <parameter-mask for sigle object>{<what to do>}

例如

\foreach a,b,c,d,\do #1,{do something with #1}

(expadable) 循环遍历给定的以逗号分隔的对象列表。您的任务应该通过以下宏来解决:

\def\ppath#1{\ppathA#1,\end}
\def\ppathA#1,#2\end{#1\foreach #2\do ##1,{$\,\triangleright\,$##1}}

\ppath{Command,TeXing Options,Generate PDF (C-c C-t C-p)}

\ppath{Cmd}

\bye
 

相关内容