我正在使用它\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.sty
,lstlisting
定义为
\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}