使用菜单键排版包含连字符的路径

使用菜单键排版包含连字符的路径

我想使用该menukeys包来排版目录和文件名,但如果文件名包含连字符,则输出会在连字符前添加一个空格,例如

\documentclass{article}
\usepackage{menukeys}
\renewmenumacro{\directory}[bslash]{paths}
\begin{document}
Type \directory{C:\Users\username\AppData\Roaming\.emacs.d\site-lisp}
\end{document}

有办法避免这种情况吗?示例输出

答案1

如果分隔符是,bslashmenukeys包将使用\detokenize它来解析输入。这是为了防止将\字符解释为控制序列的开始(例如,\Users\username可以解释为 LaTeX 命令\Users后跟命令\username)。

但是,\detokenize在每个控制序列的末尾添加一个空格(参见\detokenize 的确切语义是什么?去标记化不需要额外的空格吗?)。通常这在 中不是问题menukeys,因为空格被添加在“单词”的末尾,而当打印分隔符时,要么需要空格(对于带有空格的路径),要么在当前目录名称的末尾丢弃空格。

例外情况是目录名不是有效的控制序列名,例如\site-lisp。此处\detokenize解析\site,添加一个额外的空格(因为它位于控制序列的末尾),然后继续-lisp

答案https://tex.stackexchange.com/a/45292/从上面提到的第二个相关问题中可以看到 的替代方案\detokenize,它是v中的参数说明符expl3。这样的参数被逐字读取并转换为字符代码 10(空格)和 12(其他),这意味着\不会被解释为控制序列的开始。因此,此说明符消除了 的需要\detokenize。 中的进一步处理menukeys,特别是用 用分隔符分隔参数\seq_set_split,似乎不会受到影响。路径名中的正常空格仍然有效。但请注意,我没有广泛测试任何副作用。

为了正确实施此修改,应该更改软件包的源代码(当然,如果软件包维护者同意的话)。我在现有的 Github 问题中添加了一条评论https://github.com/tweh/menukeys/issues/48。但是,作为临时修复,您可以\directory在自己的文档中使用v说明符重新定义宏,其中删除\detokenize和的出现。请注意,默认值在下面的 MWE 中是硬编码的(重新定义不遵循命令- 但您仍然可以在必要时提供可选参数)。\unexpandedbslash\renewmenumacro


更新:在 Github 问题中,软件包维护者表示这种方法会产生太多副作用(例如,您不能再在路径名中使用实际宏)。他打算在未来的 menukeys 版本中完全放弃对反斜杠分隔路径的支持。因此,如果您想正确格式化此类路径(并且您不介意不在路径中使用宏并且不嵌套 menukeys 宏),那么您可以使用以下代码。


梅威瑟:

\documentclass{article}
\usepackage{menukeys}
\renewmenumacro{\directory}[bslash]{paths}
\makeatletter
\RenewDocumentCommand\directory{+O{bslash}+v}%           
{%
\leavevmode
\begingroup
  \def\tw@current@color@theme
    {\csname tw@style@paths@color@theme\endcsname}%
  \@nameuse{tw@style@paths@pre}%
  \tw@mk@test@input@sep{#1}
    {%
      \edef\tw@menu@list{#2}%
      \edef\tw@mk@tempa{\@backslashchar}%
    }
    {%
      \edef\tw@menu@list{#2}%
      \edef\tw@mk@tempa{\tw@mk@trimspaces{#1}}%
    }%
  \begingroup
    \letcs{\tw@mk@tempb}{tw@parse@menu@list@directory}%
    \tw@mk@indrisloop\tw@mk@tempa\tw@menu@list\tw@mk@tempb
  \endgroup
  \@nameuse{tw@style@paths@post}%
\endgroup
}%
\makeatother
\begin{document}

\noindent Type \directory{C:\Users\username\AppData\Roaming\.emacs.d\site-lisp}\\
Type \directory[/]{C:/Users/username/AppData/Roaming/.emacs.d/site-lisp}\\
Type \directory{C:\Users\[your user name]\AppData\Roaming\.emacs.d\site-lisp}   
\end{document}

结果:

在此处输入图片描述

相关内容