LaTeX:自动识别代码段落

phi*_*mue 5 latex lines

我正在编写一个程序(在C中,但我认为这不是那么相关)与LaTeX中的一些纪录片材料有关.我希望纪录片材料包含原始代码中的代码片段.

为了包含源代码并使其保持最新,我在我的文档中执行以下操作:

\lstinputlisting[firstline=200, lastline=210]{../src/source.c)
Run Code Online (Sandbox Code Playgroud)

这将线200到210(包含例如函数)自动加载../src/source.c到我的文档中.

但是,如果我在第200行之前添加一些行,这意味着第200行"向下漫游某些行",所以我必须调整它以获得我的原始函数.

所以这是我的问题:有没有人知道如何动态告诉lstinputlisting(或任何足够的替代品)告诉哪些线路?

我想象如下:我在我的C源代码中添加特殊注释lstinputlisting,例如

/// lstinputlisting "myfunc" BEGIN
int myFunction(int x){
  return x+2;
}
/// lstinputlisting "myfunc" END
Run Code Online (Sandbox Code Playgroud)

然后,lstlisting扫描该文件,只是包括之间的线BEGINEND东西.

Cal*_*laf 14

我在你的帖子发表几个月后回答,但我在下面描述的lstlists的功能已经在这个包中好几年了.

要查找的关键字是选项linerange,为方便起见,rangeprefix以及rangesuffix.

这是一个完整的例子.

\documentclass{article}
\usepackage{fullpage,times,listings}
\lstloadlanguages{C++}

\lstset{language=C++,keywordstyle=\bfseries,commentstyle=\itshape,
  rangeprefix=//----------------,rangesuffix=----------------,
  includerangemarker=false,columns=spaceflexible}

\begin{document}
We first show the main function.
\lstinputlisting[linerange=main0-main1]{code.cpp}
Then we show the implementation.
\lstinputlisting[linerange=fact0-fact1]{code.cpp}
\end{document}
Run Code Online (Sandbox Code Playgroud)

然后在code.cpp中保存以下内容:

#include <cassert>

//----------------fact0----------------
// A recursive implementation of factorial
int factorial(int i)
{
    if(i)
        return i * factorial(i-1);
    else
        return 1;
}
//----------------fact1----------------

//----------------main0----------------
// Test the implementation.
int main()
{
    assert(factorial(5) == 120);
}
//----------------main1----------------
Run Code Online (Sandbox Code Playgroud)

这是一个很好的解决方案,因为不可避免地编辑代码,然后更新一个TeX文件中的行号变得繁琐.使用符号解决了这个问题,但它也在代码本身留下了一条痕迹,如果行数发生变化,或者宽度变化太大,则需要确认排版输出看起来仍然合理.

最后,在编辑代码之后,只有在标记的块中插入/删除时才需要再次排版乳胶文件.