![带有可变数量参数的命令来格式化菜单序列](https://linux22.com/image/264181/%E5%B8%A6%E6%9C%89%E5%8F%AF%E5%8F%98%E6%95%B0%E9%87%8F%E5%8F%82%E6%95%B0%E7%9A%84%E5%91%BD%E4%BB%A4%E6%9D%A5%E6%A0%BC%E5%BC%8F%E5%8C%96%E8%8F%9C%E5%8D%95%E5%BA%8F%E5%88%97.png)
我想定义一个接受可变数量参数的命令:
\menu{foo}
% would result in \emph{foo}
\menu{foo}{bar}
% would result in \emph{foo} $\to$ \emph{bar}
\menu{foo}{bar}{baz}
% would result in \emph{foo} $\to$ \emph{bar} $\to$ \emph{baz}
等等。这可能吗?如果可以,我该怎么做?
答案1
使用menukeys
…我猜这就是你要找的东西;-)
\documentclass{article}
\usepackage{menukeys}
% create a new simple style to add arrwos between the items
\newmenustylesimple*{arrows}{\CurrentMenuElement}[ $\to$ ]{blacknwhite}
\begin{document}
\menu{foo > bar > baz}
\bigskip
% apply the new style to the old macro. The optional arguments
% defines the separator, the default is a comma
\renewmenumacro{\menu}[>]{arrows}
\menu{foo > bar > baz}
\end{document}
第一行显示了 的默认样式\menu
,但可以通过多种方式更改它。该示例显示了一个非常简单的样式。可以在手册中找到更多预定义样式……
答案2
虽然不完全符合您的要求,但具有相同的功能,如下所示:
\documentclass{article}
\usepackage{pgffor} % you don't need this if tikz is already included
\begin{document}
\def\menu#1{%
\gdef\firstelement{1}
\foreach \e in {#1}{%
\ifnum\firstelement=0$\to$\fi\emph{\e}%
\gdef\firstelement{0}%
}
}
\menu{foo}\par
\menu{foo,bar}\par
\menu{foo,bar,baz}\par
\end{document}
答案3
使用 LaTeX3 宏,使用项目列表而不是可变数量的参数(在 LaTeX 中不推荐)相当容易。
为什么不使用可变数量的参数?主要原因已由 David 在评论中解释;另一个原因是实现的笨拙;应该启动递归,存储最后找到的参数并检查左括号;如果找到则继续递归,否则停止并输出结果。由于无论如何都需要存储参数,因此最好使用一个参数并通过循环条目来实现命令。
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\menu}{m}
{
\vwegert_menu:nnn { , } { #1 } { \emph }
}
\NewDocumentCommand{\xmenu}{O{,}mO{\emph}}
{
\vwegert_menu:nnn { #1 } { #2 } { #3 }
}
\cs_new_protected:Npn \vwegert_menu:nnn #1 #2 #3
{
% split the list at the chosen separator
\seq_set_split:Nnn \l_vwegert_input_seq { #1 } { #2 }
\seq_clear:N \l_vwegert_output_seq
% add `\emph` around the items (or what's desired)
\seq_map_inline:Nn \l_vwegert_input_seq
{ \seq_put_right:Nn \l_vwegert_output_seq { #3{ ##1 } } }
% print the result
\seq_use:Nnnn \l_vwegert_output_seq { $\to$ } { $\to$ } { $\to$ }
}
\seq_new:N \l_vwegert_input_seq
\seq_new:N \l_vwegert_output_seq
\ExplSyntaxOff
\begin{document}
\menu{foo}
\menu{foo,bar}
\xmenu[;]{foo;bar;baz}[\textbf]
\end{document}
我们有一个没有选项的简单命令\menu
和一个更强大的命令\xmenu
,您可以使用它来更改分隔符(前导可选参数)或格式(尾随可选参数);尾随可选参数应该是一个只接受一个参数的命令。
工作原理如下:
将列表拆分成多个部分;前导和尾随空格将被删除。
为每个元素添加所选的格式(默认
\emph
)。生成列表的每个元素,
$\to$
其中任意两个元素之间都有。