6

私は、LaTeX の小さなドキュメンタリー資料に関連してプログラムを (C で書いていますが、あまり関係ないと思います) 書いています。ドキュメンタリー資料に、元のコードのコード スニペットを含めてほしい。

ソースコードを含めて最新の状態に保つために、ドキュメントで次のことを行います。

\lstinputlisting[firstline=200, lastline=210]{../src/source.c)

これにより、200 行目から 210 行目 (関数などを含む) が../src/source.cドキュメントに自動的に読み込まれます。

ただし、200 行の前にいくつかの行を追加すると、これは 200 行が「いくつかの行をさまよう」ことを意味するため、元の機能を得るためにこれを調整する必要があります。

lstinputlistingだからここに私の質問があります:どの行を取るべきかを動的に伝える方法(または適切な代替物)を伝える方法を誰かが知っていますか?

次のようなものを想像します: によって認識される C ソース コードに特別なコメントを追加しますlstinputlisting

/// lstinputlisting "myfunc" BEGIN
int myFunction(int x){
  return x+2;
}
/// lstinputlisting "myfunc" END

次に、lstlistingファイルをスキャンして、BEGINと の間の行だけを含めますEND

4

4 に答える 4

15

あなたの投稿から数か月後に回答していますが、以下で説明する lstlistings の機能は、数年前からそのパッケージに含まれていました。

検索するキーワードは、オプション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}

次に、以下を 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----------------

必然的にコードを編集する必要があり、TeX ファイル全体の行番号を更新するのが面倒になるため、これは良い解決策です。シンボルを使用するとこの問題は解決しますが、コード自体に痕跡が残ります。行数が変更された場合、または幅が変更されすぎた場合は、タイプセット出力が適切に見えることを確認する必要があります。

最後に、コードを編集した後、マークされたブロック内で挿入/削除した場合にのみ、latex ファイルを再度タイプセットする必要があります。

于 2011-05-06T20:02:09.347 に答える
1

このようなことは、しばらく前にTeX SEで議論され、 1つの回答はパッケージを使用していましたcatchfilebetweentags。これは問題を直接解決するものではありませんが、おそらくそれを使用して、必要なフラグメントをフィードすることができ\lstlistingsます。おそらく、一時ファイルを使用することもできます。

于 2010-12-16T00:39:53.363 に答える
1

#includeCで使用する方が簡単ではないでしょうか?

完璧ではありませんが、十分な解決策です。

以下に例を示します (コンパイルできませんでした。最後に書いたのはC5 年前のことです)。

メインCプログラム:

    #include <stdio.h>

    //function included from separate file -- will be included in LaTeX too
    #include "fun_x.c"         

    int main() 
    {
      int d = 0;
      printf("%d", fun_x(d));

    //code included from separate file -- will be included in LaTeX too
    #include "calc.c"

      return 0;
    }

fun_x.cファイル:

int fun_x(int c) 
{
  c++;
  return c;
}

calc.cファイル:

d = 99;
d = fun_x(d);

ラテックスソース:

\begin{document}
...

\lstinputlisting{../src/fun_x.c)

...

\lstinputlisting{../src/calc.c)

...

\end{document}
于 2010-10-12T14:32:07.210 に答える
1

これを実現する唯一の合理的な方法は、私が頭の中で考えることができる唯一の方法は、メイクファイルを作成し、正しい出力を生成する責任を負わせることです。

sourcefile.c が ./src にあり、LaTeX ファイルが ./tex にあると仮定すると、./tex/Makefile は次のようになります。

doc.tex: sourcefile.grep
        <command to compile doc.tex>
sourcefile.grep: 
        <command to grep/whatever to dump from 
        ../src/sourcefile.c to ./tex/sourcefile.grep>

そして、doc.tex の lstlistings は ./src/sourcefile.grep を指します。

于 2010-10-12T14:33:46.623 に答える