我到处找了找,似乎找不到这个问题的简洁答案。是否有可能(如果可以,如何)创建一个命令,该命令将遍历逗号分隔值的“参数”并对其采取行动?
示例主要窃自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}
,即本身重新定义\nextitem
为foo
-- 并且第一次不会发出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:
一些解释:
在第二个例子中,
- 我们将命令包装在一个组中以使用局部变量
\l_tmpa_clist
我们将强制参数存储在名为clist 类型的临时变量中- 我们“使用”该变量来显示具有给定分隔符的列表
注意使用\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