\newcommand 模仿 lstinline 的问题

\newcommand 模仿 lstinline 的问题

我正在尝试复制扫描书的一部分。这本书是关于编程的(纯 C)。
我需要使用许多名称相同但周围环境不同的命令,例如背景颜色等。我正在使用listings包。我用创建了newcommand,类似于 的别名\lstinline。稍后,也许,我会用背景颜色或不同的字体/大小或类似的东西包围它。我希望能够即时完成这类事情(以便稍后轻松调整一切)。

主要问题在于书中的源代码(具体来说预订的或者特别的字符,如#\)。目前,我只是对普通命令使用不同的名称,稍后我将定义(扩展)这些名称,如下所示:

\usepackage{listings}
\newcommand{\test}[1]{\lstinline{#1}}

\test{"\nA marathon is %f kilometers.\n\n"}
\lstinline{"\nA marathon is %f kilometers.\n\n"}

问题用这个命令:

\test{"\nA marathon is %f kilometers.\n\n"}

尽管命令如预期的那样工作正常:

\lstinline{"\nA marathon is %f kilometers.\n\n"}

我收到错误( ),但当我删除 (La)TeX 特殊字符( , )Undefined Control Sequence. \nA后,一切都正常运行。#\

我的问题是,是否有一种干净的方法来创建处理源代码的新命令(或别名),或者还有其他更优雅的你知道吗?

任何帮助都值得感激。

答案1

这与传递包含逐字内容的参数背后的思想非常相似。一旦参数被吞噬(使用类似 的定义\newcommand{\test}[1]),您就无法更改与输入的每个元素相关联的类别代码。因此,逐字解释完全丢失。

\test在您的例子中,解决这个问题最方便的方法是\lstinline通过类似

\let\test\lstinline

(也许使用起来更\LetLtxMacro安全letltxmacro; 看何时使用 \LetLtxMacro?) 或者

\newcommand{\test}{\lstinline}

这种方法有效,因为\lstinline不会吞噬其(强制)参数。它将它留待以后处理。上述解决方案实际上会插入\lstinline它找到的任何地方\test,从而为 提供一个简单的别名\lstinline

相关内容