与 \lstinputlisting 共享行计数器

与 \lstinputlisting 共享行计数器

使用listings包,您可以命名您的列表以使它们共享一个行计数器:

另一方面,您可以使用 firstnumber=auto 并命名您的列表。名称相同的列表(区分大小写!)共享一个行计数器。

但是,这似乎仅在lstlisting使用环境时才有效,而不是在使用时\lstinputlisting。仔细检查手册后,似乎有记录:

name=<name>

列出列表。显示环境列表如果 firstnumber=auto 有效,则同名的共享一个行计数器。

我想知道是否有人知道某种跨\lstinputlistings 共享行计数器的“技巧”。

下面是一个 MWE 来演示这个问题:

\documentclass{article}
\usepackage{listings}
\lstset{numbers=left,firstnumber=auto}

\begin{document}
\begin{lstlisting}[name=bar]
...
\end{lstlisting}
\begin{lstlisting}[name=bar] %first line number is the last of previous listing + 1
...
\end{lstlisting}
\lstinputlisting[name=foo]{foo.c}
\lstinputlisting[name=foo]{foo.c} %first line number is 1
\end{document}

答案1

您可以使用name=foo, firstnumber=last选项来\lstinputlisting获得所需的结果,如黄色突出显示的代码所示:

在此处输入图片描述

代码:

\documentclass{article}

\begin{filecontents*}{foo.c}
  #include <stdio.h>
  void main()
\end{filecontents*}

\usepackage{listings}
\usepackage{xcolor}
\lstset{numbers=left,firstnumber=auto}

\begin{document}
\begin{lstlisting}[name=bar]
  first line
  second line
\end{lstlisting}
\begin{lstlisting}[name=bar]
  third line (continued)
\end{lstlisting}

\lstinputlisting[name=foo,backgroundcolor=\color{yellow!20}]{foo.c}
\lstinputlisting[name=foo,backgroundcolor=\color{yellow!20}, firstnumber=last]{foo.c} %first line number is now 3
\end{document}

答案2

只是对@Peter 的回答的一个补充:如果您使用firstline/lastline选项,则必须将该选项放在firstnumber最后,如下面的代码所示;否则您的第二个列表将再次从行号 1 开始。

\lstinputlisting[name=foo,firstline=1,lastline=2]{foo.c}
\lstinputlisting[name=foo,firstline=3,lastline=4, firstnumber=last]{foo.c} %first line number is now 3

(使用 listings.sty - 2014/09/06 1.5e 测试)

相关内容