带有可变数量参数的命令来格式化菜单序列

带有可变数量参数的命令来格式化菜单序列

我想定义一个接受可变数量参数的命令:

\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,您可以使用它来更改分隔符(前导可选参数)或格式(尾随可选参数);尾随可选参数应该是一个只接受一个参数的命令。

工作原理如下:

  1. 将列表拆分成多个部分;前导和尾随空格将被删除。

  2. 为每个元素添加所选的格式(默认\emph)。

  3. 生成列表的每个元素,$\to$其中任意两个元素之间都有。

在此处输入图片描述

相关内容