创建一个 \lstnewenvironment,用于创建命名列表

创建一个 \lstnewenvironment,用于创建命名列表

我正在使用它\lstnewenvironment来格式化我的文档中的一组代码列表。

\lstnewenvironment{code}
    {\lstset{language=haskell,
    basicstyle=\small\ttfamily,
    numbers=left,
    numberstyle=\tiny\color{gray},
    backgroundcolor=\color{lightgray},
    firstnumber=auto
    }}
    {}

我希望能够赋予所有这些列表相同的名称,以便它们能够连续编号,即使其他列表(不使用环境code)分散在它们之间。

但是我无法name使用 添加属性\lstset。列表手册第 11 页的顶部指出,某些属性只能在列表中直接设置为选项(而不能在 中\lstset)。我怀疑这是其中一个属性。所以我必须这样做

\begin{code}[name=main]
...
\end{code}

在每个列表上。还有其他方法可以指示环境code应始终带有该name选项吗?

答案1

感谢 egreg,您可以使用自定义计数器来跟踪最后一行号并从那里继续:

在此处输入图片描述

代码:

\documentclass{article}
\usepackage{xcolor}
\usepackage{listings}

\newcounter{main}
\setcounter{main}{1}

\lstnewenvironment{code}[1][firstnumber=\themain,name=main]
  {\lstset{language=haskell,
           basicstyle=\small\ttfamily,
           numbers=left,
           numberstyle=\tiny\color{gray},
           backgroundcolor=\color{lightgray},
           #1
          }
}
{\setcounter{main}{\value{lstnumber}}}


\begin{document}
\begin{code}
 foo bar first line
 foo bar second line
 foo bar third line
\end{code}

some text

\begin{lstlisting}[backgroundcolor=\color{lightgray!20}]
  some other non-code listing
\end{lstlisting}


\begin{code}
 listing continued
\end{code}
\end{document}

答案2

请注意,在中listings.stylstlisting定义为

\lstnewenvironment{lstlisting}[2][]
    {\lst@TestEOLChar{#2}%
     \lstset{#1}%
     \csname\@lst @SetFirstNumber\endcsname}
    {\csname\@lst @SaveFirstNumber\endcsname}

将行\csname\@lst @SetFirstNumber\endcsname和复制\csname\@lst @SaveFirstNumber\endcsname到您自己的行中\lstnewenvironment(经过适当的\makeatletter技巧后)应该可以使用name中定义的常用键\lstset。 在下面可编译的示例的上下文中查看它,该示例借用了 Peter Grill 的回答:

\documentclass{article}
\usepackage{xcolor}
\usepackage{listings}

\makeatletter
\lstnewenvironment{code}[1][]
    {\lstset{language=haskell,
    basicstyle=\small\ttfamily,
    numbers=left,
    numberstyle=\tiny\color{gray},
    backgroundcolor=\color{lightgray},
    firstnumber=auto,
    name=main,
    #1}%
    \csname\@lst @SetFirstNumber\endcsname}
    {\csname\@lst @SaveFirstNumber\endcsname}
\makeatother

\begin{document}
\begin{code}
 foo bar first line
 foo bar second line
 foo bar third line
\end{code}

some text

\begin{lstlisting}[backgroundcolor=\color{lightgray!20}]
  some other non-code listing
\end{lstlisting}


\begin{code}
 listing continued
\end{code}
\end{document}

相关内容