我正在使用该listings
包来存储我的源代码,除其他外,我显然正在使用来控制这些源代码的显示\lstset
。
现在,在设置时numberstyle
,我将它们设置为\sffamily\tiny\color{gray}
。现在一切都正常了,因为它们都作为环境内的开关工作。但如果我需要环境内的数字怎么办?
也就是说,我想用 稍微增加数字\raisebox{}{}
。但是我如何将有问题的行号放入该命令中?基本上,它们必须放入第二组花括号中。
我怎么做?
根据要求,以下是示例:
\documentclass[a4paper, 11pt]{scrartcl}
\usepackage{listings}
\lstset{
numbers=left,
numberstyle=\sffamily\tiny,
}
\begin{document}
\begin{lstlisting}[title=test]
for i:=maxint to 0 do
begin
{ do nothing }
end;
Write("Case insensitive")
WritE("Pascal keywords.")
a = 'a' -- comment
\end{lstlisting}
\end{document}
正如您所看到的,我已经设置了numberstyle
我想要的开关,但是我应该如何在其中放置一个环境,将数字输入到其中?
答案1
listings
经过设计,当输出行号时,存储在键中的代码本质上是以行号作为参数来应用的。中的numberstyle
许多其他键也是如此。...style
listings
我将在我的回答中解释一些 TeXnical 细节,但如果您不理解也不要担心,只需尝试按照示例操作即可。您分配给键的值numberstyle
存储在 中\lst@numberstyle
,当listings
需要写入数字时,它会将其作为 调用\lst@numberstyle{\thelstnumber}
。如果 TeX 在处理 后不希望读取参数\lst@numberstyle
,它会将这些括号视为表示组而不是参数,这是无害的。
基本上有两种方法可以用这个论点来做某事(第一种方法是由亚历克西斯在我原来的答案只提到第二个之后),取决于你想要调用什么宏:
您可以定义一个新的宏来吸收该参数,并将其与其他所选代码一起放回输入流,然后将此宏作为键值中的最后一个元素
numberstyle
。这也许是最直观的方法,并且具有最通用的优点(即使行号不作为最后一个参数传递给现有宏时也可以使用它)。与这些东西一样,最好通过示例来说明。在这个例子中,有\mynumberstyle
这样一个宏:\documentclass[a4paper, 11pt]{scrartcl} \usepackage{listings} \newcommand*{\mynumberstyle}[1]{\raisebox{0.3em}{#1}} \lstset{ numbers=left, numberstyle=\sffamily\tiny\mynumberstyle, } \begin{document} \begin{lstlisting}[title=test] for i:=maxint to 0 do begin { do nothing } end; Write("Case insensitive") Write("Pascal keywords.") a = 'a' -- comment \end{lstlisting} \end{document}
当你想要做的只是调用另一个宏并使用行号(或者更确切地说,宏
\thelstnumber
最终扩展到行号)作为最后的该宏的参数(就像您的情况一样\raisebox
),您可以避免定义新命令,也可以避免读取参数并将其放回原处以便再次读取(但现在使用原始的 catcodes,虽然这对于此处的用例来说不是问题)...具体来说,您只需将其附加
\raisebox{first argument}
到您分配给键的值的末尾numberstyle
,它就会选择行号作为其第二个参数(就像\mynumberstyle
在上面的示例中将其作为其唯一参数一样)。以下示例说明了这一点:\documentclass[a4paper, 11pt]{scrartcl} \usepackage{listings} \lstset{ numbers=left, numberstyle=\sffamily\tiny\raisebox{0.3em}, } \begin{document} \begin{lstlisting}[title=test] for i:=maxint to 0 do begin { do nothing } end; Write("Case insensitive") Write("Pascal keywords.") a = 'a' -- comment \end{lstlisting} \end{document}