答案1
如果分隔符是,bslash
则menukeys
包将使用\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 中是硬编码的(重新定义不遵循命令- 但您仍然可以在必要时提供可选参数)。\unexpanded
bslash
\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}
结果: