为“菜单序列”创建命令

为“菜单序列”创建命令

我正在尝试创建一个可以接受单个参数的可扩展命令(可能采用以下形式):

\menuentry{File:New:Class}

并生成类似以下内容的内容:

\texttt{File -> New -> Class} 

问题是参数必须灵活。我应该能够提供任意深度的菜单。这样做的原因是,我可能希望稍后更改格式,而我不想手动替换所有 s texttt

答案1

etoolbox包裹具有丰富的列表处理选项。以下是一次尝试。

在此处输入图片描述

\documentclass{article}
\usepackage{etoolbox}% http://ctan.org/pkg/etoolbox
\newcommand{\menuitem}{\texttt}% Menu item formatting
\newcommand{\menusep}{\ensuremath{\rightarrow}}% Menu separator
\newcommand{\menuend}{\relax}% Menu end
\makeatletter
\newcommand{\menulist}[1]{% \menulist{<menu list>}
  \def\menu@sep{\def\menu@sep{\menusep}}% https://tex.stackexchange.com/a/89187/5764
  \renewcommand*{\do}[1]{\menu@sep\menuitem{##1}}%
  \menulistparser{#1}% Process list
  \menuend%
}
\makeatother
\DeclareListParser{\menulistparser}{:}% List separator is ':'
\begin{document}

\menulist{File:New:Class}% 3 menu items

\menulist{Tools:Options:Advanced:Properties:Document}% 5 menu items

\menulist{}% 0 menu items/empty list

\menulist{Help}% 1 menu item

\renewcommand{\menusep}{~\rule{1ex}{1ex}~}\renewcommand{\menuend}{!}% Different separator and end
\menulist{Your:Menu:Sequence:Here}

\end{document}

\DeclareListParser{<cmd>}{<sep>}声明一个列表解析器命令<cmd>,该命令将单个参数作为列表处理,列表项分隔符为<sep>。此定义的用途是容纳item:item:item:...样式列表。对于常规 CSV 列表,您还可以使用 ,\docsvlist其预定义\DeclareListParser{\docsvlist}{,}etoolbox

主命令\menulist{<menu list>}解析列表并使用 格式化每个条目\menuitem{..},但还会添加自定义分隔符\menusep。最后一个菜单项后面是\menuend\menusep使用以下之一以“单次延迟”应用巧妙的 LaTeX 技巧

答案2

LaTeX3 解决方案;一些输入和输出参数可通过键值语法自定义。请注意,:必须在 之后设置默认分隔符\ExplSyntaxOff。 的可选参数中设置的键\menuentry仅适用于该命令。

\documentclass{article}
\usepackage{xparse}

\ExplSyntaxOn
\NewDocumentCommand{\menuentry}{ O{} m }
  {
   \group_begin: % to segregate local changes to keys and font
   \keys_set:nn { menuentry } { #1 }
   \exp_args:NNx \seq_set_split:Nnn \l_menuentry_seq { \l_menuentry_inputsep_tl } { #2 }
   \tl_use:N \l_menuentry_font_tl
   \bool_set_false:N \l_tmpa_bool
   \seq_map_function:NN \l_menuentry_seq \menuentry_process:n
   \group_end:
  }
\NewDocumentCommand{\menuentryset} { m }
  { \keys_set:nn { menuentry } { #1 } }

\tl_new:N \l_menuentry_font_tl
\tl_new:N \l_menuentry_sep_tl
\tl_new:N \l_menuentry_inputsep_tl
\seq_new:N \l_menuentry_seq

\cs_new:Npn \menuentry_process:n #1
  {
   \bool_if:NTF \l_tmpa_bool 
     { \l_menuentry_sep_tl }
     { \bool_set_true:N \l_tmpa_bool }
   \tl_if_empty:nTF { #1 } {EMPTY~ARG!} { #1 }
  }
\keys_define:nn { menuentry }
  {
   menufont .tl_set:N = \l_menuentry_font_tl ,
   menusep  .tl_set:N = \l_menuentry_sep_tl,
   inputsep .tl_set:N = \l_menuentry_inputsep_tl,
  }
\keys_set:nn { menuentry }
  {
   menufont = \sffamily ,
   menusep  = ${}\to{}$
  }
\ExplSyntaxOff
\menuentryset{inputsep=:}

\begin{document}

\menuentry{}% 0 menu items/empty list

\menuentry{Help}% 1 menu item

\menuentry{File:New:Class}% 3 menu items

\menuentry{Tools:Options:Advanced:Properties:Document}% 5 menu items

\menuentryset{menufont=\ttfamily,menusep=~>{ },inputsep=/}

\menuentry{Help}% 1 menu item

\menuentry{File/New/Class}% 3 menu items

\menuentry[inputsep=|]{Tools|Options|Advanced|Properties|Document}% 5 menu items

\end{document}

在此处输入图片描述

答案3

xstring以下是使用该包的示例

在此处输入图片描述

看看文档 - 还有很多其他命令可以帮助您自定义此命令。

\documentclass{article}
\usepackage{xstring}

\newcommand{\menuentry}[1]{\StrSubstitute{#1}{:}{$\rightarrow$}[\dummy]\texttt{\dummy}}

\begin{document}

\menuentry{File:New:Class}

\menuentry{File:New:Class:SubClass}
\end{document}  

答案4

您可以将菜单项放在列表中并对其进行迭代。以下是关于如何迭代列表的简短 MWE。我已将小图像中的相关行取消注释以包含您自己的行。

在此处输入图片描述

\documentclass[justified]{tufte-book}
\usepackage{lipsum}
\begin{document}
\def\spacer{\hspace{3pt}}
\def\test{}
%\def\test{\includegraphics[height=7pt]{./graphics/web/add.png}}
\def\alist{Dashboard, Content, Structure, Hello~yannis, Log Out, \test}
\makeatletter
\noindent\fbox{%
\begin{minipage}{9cm}
\noindent\colorbox{black}{\small
\@for \i:=\alist \do{\color{white}
  \texttt\i\spacer 
}}
\smallskip
\tiny \lipsum[1-2]
\end{minipage}}
\makeatother
\end{document}

相关内容