如何更好的控制listing的展示数量?

如何更好的控制listing的展示数量?

我正在使用该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许多其他键也是如此。...stylelistings

我将在我的回答中解释一些 TeXnical 细节,但如果您不理解也不要担心,只需尝试按照示例操作即可。您分配给键的值numberstyle存储在 中\lst@numberstyle,当listings需要写入数字时,它会将其作为 调用\lst@numberstyle{\thelstnumber}。如果 TeX 在处理 后不希望读取参数\lst@numberstyle,它会将这些括号视为表示组而不是参数,这是无害的。

基本上有两种方法可以用这个论点来做某事(第一种方法是由亚历克西斯在我原来的答案只提到第二个之后),取决于你想要调用什么宏:

  1. 您可以定义一个新的宏来吸收该参数,并将其与其他所选代码一起放回输入流,然后将此宏作为键值中的最后一个元素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}
    
  2. 当你想要做的只是调用另一个宏并使用行号(或者更确切地说,宏\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}
    

相关内容