lstinputlisting 环境中的第一行号

lstinputlisting 环境中的第一行号

我使用以下代码来显示第 23-45 行sort.cpp

\lstinputlisting[language=C++,linerange=23-45]{sort.cpp}

但是,行号从 1 开始,而我希望它从 23 开始。我找到了一些参考资料,建议将其更改为

\lstinputlisting[language=C++,linerange=23-45,firstnumber=23]{sort.cpp}

它有效,我希望这是默认设置。根据第 31 页listings文档

汽车让包选择第一个数字:新列表从数字一开始,命名列表继续最近的同名列表(见下文),独立文件以与第一个输入行相对应的数字开始。
最后的继续最近列表的编号并将数字设置为数字。

它应该是默认的。这里有什么问题,还是我误解了引用?

我的列表设置:

\usepackage{xcolor,listings}%color support for listings
\lstset{
basicstyle=\footnotesize,
numbers=left, 
numberstyle=\footnotesize, 
keywordstyle=\color{blue!70}, 
commentstyle=\color{red!50!green!50!blue!50}, 
%stringstyle=\ttfamily, % typewriter type for strings
%frame=shadowbox, 
rulesepcolor=\color{red!20!green!20!blue!20},
escapeinside=``, 
xleftmargin=2em,xrightmargin=2em, aboveskip=1em,
breaklines=true             % sets automatic line breaking
}

答案1

这种默认行为是可以理解的,因为listings包裹与导入列表的布局和/或结构无关。因此,以下情况会促使使用firstnumber不默认为第一行的单独键值linerange:您的sort.cpp文件中有一堆不相关的过程/函数。引用某些函数时,行号以第一个元素开头linerange是没有意义的,因为行号与内容无关。

不过,从积极的一面来看,无论如何,都可以强制listings包将其与(称为)firstnumber中的第一个元素相同。为此,我们使用以下代码修补了-parser( , et ine nterval的缩写)linerangefirstlinelinerange\lst@GLI@GLIetoolbox包裹命令\patchcmd

\usepackage{etoolbox}% http://ctan.org/pkg/etoolbox
...
\makeatletter
\patchcmd{\lst@GLI@}% <command>
  {\def\lst@firstline{#1\relax}}% <search>
  {\def\lst@firstline{#1\relax}\def\lst@firstnumber{#1\relax}}% <replace>
  {\typeout{listings firstnumber=firstline}}% <success>
  {\typeout{listings firstnumber not set}}% <failure>
\makeatother

listings firstnumber=firstline如果命令成功修补,则上述修补程序将打印\lst@GLI@,否则将打印listings firstnumber not set<jobname>.aux文件中。修补程序包括搜索 建立的位置\lst@GLI@firstline并向其添加 的等效赋值firstnumber

但请注意,上述补丁是永久性替换,并使firstnumber键值的进一步使用无效。

相关内容