我一直在使用该listings
包以 LaTeX 格式呈现我的源代码。但是,我无法让两个具有相同名称的单独用户定义列表之间的行号继续显示。例如,以下代码似乎只是将每个列表块的行号从 1 开始,而不是按顺序对它们进行编号:
\usepackage{listings}
\lstnewenvironment{bash}[1][]{
#1,
language = bash,
numbers = left,
firstnumber = auto}
\begin{document}
\begin{bash}[name=Test]
echo xyz
\end{bash}
\begin{bash}[name=Test]
echo xyz
\end{bash}
\end{document}
我知道每次我都可以用 手动设置数字\firstnumber = last
,但这有点违背了命名列表的目的。我想我在这里遗漏了什么。任何帮助都将不胜感激。
答案1
与 Heiko 的精彩回答略有不同:
\documentclass{article}
\usepackage{xcolor}
\usepackage{listings}
\lstnewenvironment{bash}[1][]
{\lstset{language=C}\lstset{%
numbers=left,numberstyle=\normalsize,stepnumber=1,numbersep=5pt,
framesep=5pt,
basicstyle=\normalsize\ttfamily,
showstringspaces=false,
keywordstyle=\itshape\color{blue},
stringstyle=\color{maroon},
commentstyle=\color{black},
xleftmargin=5pt,
xrightmargin=5pt,
aboveskip=\bigskipamount,
belowskip=\bigskipamount,
backgroundcolor=\color{gray!20}, #1
}}
{}
%
%%% Always I forget this so I created some aliases
\def\ContinueLineNumber{\lstset{firstnumber=last}}
\def\StartLineAt#1{\lstset{firstnumber=#1}}
\let\numberLineAt\StartLineAt
\begin{document}
\begin{bash}[name=Test]
echo xyz
\end{bash}
\StartLineAt{30}
\begin{bash}[name=Test]
echo xyz
\end{bash}
\ContinueLineNumber
\begin{bash}[name=Test]
echo xyz
\end{bash}
\end{document}
该代码提供了两个我个人认为方便的宏
\ContinueLineNumber
和
\StartLineAt
如果您不希望所有代码都具有连续编号,您可能会发现它很有用。
答案2
在 定义的环境中,不会调用用于保存和恢复行号的代码\lstnewenvironment
。下面添加它:
\documentclass{article}
\usepackage{listings}
\makeatletter
\lstnewenvironment{bash}[1][]{%
\lstset{%
#1,
language=bash,
numbers=left,
firstnumber=auto,
}%
\csname\@lst @SetFirstNumber\endcsname
}{%
\csname \@lst @SaveFirstNumber\endcsname
}
\makeatother
\begin{document}
\begin{bash}[name=Test]
echo xyz
\end{bash}
\begin{bash}[name=Test]
echo xyz
\end{bash}
\end{document}