将作为参数提供的命令视为纯文本

将作为参数提供的命令视为纯文本

我发现自己在努力完成一个本该很简单的任务,但经过几个小时的搜索和反复尝试后,我终于放弃了。我可能仍然缺乏对 LaTeX 及其内部结构的更深入的理解。

在下面的 MWE 中,我想通过将命令和宏(例如\usepackage)打印为纯文本(步骤 1)来引用它们。为了摆脱\textbackslash,我想我可以将它们包装在内联列表中(步骤 2)。这仍然按预期工作。当我尝试为此创建宏时,麻烦开始了(步骤 3)。作为我的宏的参数,命令不会被解释为文本,而是被解释为命令本身,我猜这会导致Improper alphabetic constant我的示例中出现错误。

\documentclass[a4paper,11pt]{scrartcl}
\usepackage{listings}

\newcommand{\commandToText}[1]{\lstinline{#1}} %step 3

\begin{document}  
\textbackslash usepackage %step 1
\lstinline{\usepackage} %step 2
\commandToText{\usepackage} %step 3
\end{document}

经过一番搜索,我发现\detonkenize可能需要命令来解决这个问题。至少\newcommand{\commandToText}[1]{\detokenize{#1}}将参数打印为纯文本,无论是否提供命令作为输入。

不幸的是,用内联列表 pdflatex 包装参数\newcommand{\commandToText}[1]{\lstinline{\detokenize{#1}}}不再终止。

我想知道去标记化是否是将作为参数给出的命令解释为纯文本的最佳方法。也许还有其他选择?或者可以lstinline说服使用去标记化的命令?

更新: 我从评论和答案中意识到我的 MWE 太过简单,因为它忽略了两个方面:

  • listings以各种配置使用该包(例如,用于代码、JSON、说明),并欣赏能够轻松定义和调整通用样式以满足我的需求的可能性。对我来说\texttt,或等替代方案\verb似乎不太方便。但如果答案是,我的目标无法使用,\lstinline那么其中一个可能是替代方案。
  • \commandToText应该能够接受进一步的修饰。例如,目前我使用包realboxes来进一步突出显示文本:\newcommand{\commandToText}[1]{\Colorbox{yellow}{\lstinline{#1}}}。据我所知,仅包装\lstinline而不指定参数(如 Skillmon 和 egreg 所建议的)是不允许这样做的。

我想知道为什么上面的步骤 3 不起作用。我本来希望\lstinline已经转换为纯文本。如果它在宏之外调用,它会这样做。但如果它在宏的参数上使用它,它就不会。同样,\newcommand{\commandToText}[1]{\Colorbox{yellow}{\verb|#1|}}不起作用,因为参数似乎在\verb应用之前被解释。我猜,这与这些命令的扩展方式有关?

答案1

\verb\lstinline等命令\makeatother通过更改 catcode 来工作,即从文件中读取的字符被标记的方式。 \usepackage通常是一个 csname 标记,但是

\verb|\usepackage|

使\正常的 catcode 成为 12 个字符,因此\usepackage也是 11 个字符的标记。

但是如果你在扫描右括号时构造(任何)诸如\fbox{\verb|\usepackage|}参数的标记,那么在\verb调用时,在 之间会有一个 csname 标记|。 的 catcode\会发生变化,但没有任何效果,因为没有\字符被标记。

相反\string(和\detokenize)不依赖于改变标记化,它们将提供的代币并产生字符标记。

所以你可以将其嵌套为

\newcommand{\commandToText}[1]{\colorbox{red}{\texttt{\string#1}}}

或任何你需要的。

有点冗长,但详细的解释可以在背页

答案2

如果你只想一次打印一个命令名称,最简单的方法是定义

\newcommand{\commandToText}[1]{\texttt{\string#1}}

使用\texttt是为了在普通文本和命令名称之间有更好的视觉区分。

如果你想做更复杂的任务,你可以定义

\newcommand{\commandToText}{\lstinline[basicstyle=\ttfamily]}

但这不能用于另一个命令的参数。它将参数的确定权留给了\lstinline,因此不会出现不合时宜的标记化。

相关内容