我使用以下代码来显示第 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的缩写)linerange
firstline
linerange
\lst@GLI@
G
L
I
etoolbox
包裹命令\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
键值的进一步使用无效。