我正在尝试复制扫描书的一部分。这本书是关于编程的(纯 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
。