将源代码的各个部分作为列表包含进去,同时保证源代码编辑的稳定性

将源代码的各个部分作为列表包含进去,同时保证源代码编辑的稳定性

有没有办法使用\lstinputlisting(从listings包中)灵活地输入源代码的特定部分?可以使用firstlinelastline选项输入特定的行范围,但这对源文件的更改不够稳健。

例如,假设输入源文件是:

int square(int x) {
  return x * x;
}

int cube(int x) {
  return x * x * x;
}

在我的 LaTeX 文档中,我可以cube使用命令包含该过程\lstinputlisting[firstline=5,lastline=7]{source.c}

但假设我稍后决定重写该cube过程。输入源文件变为:

int square(int x) {
  return x * x;
}

int cube(int x) {
  int x2;
  x2 = square(x);
  return x * x2;
}

现在我的 LaTeX 文档不会显示最后两行,cube因为列表仅使用第 5-7 行。我可以手动更新行范围,但这很繁琐且容易出错。

有没有办法用某种标签标记源代码的某些部分,以便列表能够适应这些类型的更改?例如,输入源文件可能是这样的

int square(int x) {
  return x * x;
}

/**\beginlabel{lst:cube} **/
int cube(int x) {
  int x2;
  x2 = square(x);
  return x * x2;
}
/**\endlabel{lst:cube} **/

这样我就可以使用类似的东西\lstinputlisting[lines=lst:cube]{source.c}来包含我想要的部分并保持对变化的稳健性。

如果有帮助的话,我愿意使用其他包来列出源代码(例如minted)。

答案1

简短指南

  1. 设置标记的前缀和后缀。将空格替换为\(反斜杠加空格)
  2. 决定标记线是否应该是输出的一部分。
  3. 包含代码并使用前缀和后缀之间的文本作为选项的“行号” linerange

% create the test file for this example
\begin{filecontents}{external.c}
int square(int x) {
  return x * x;
}

@@@START@@@
int cube(int x) {
  int x2;
  x2 = square(x);
  return x * x2;
}
@@@STOP@@@

\end{filecontents}

\documentclass{article}

\usepackage{listings}
\lstset{%
    rangeprefix=@@@,% [1]
    rangesuffix=@@@,
    includerangemarker=false,% [2]
}

\begin{document}
\lstinputlisting[linerange=START-STOP]{external.c}%[3]
\end{document}

有关更多详细信息,请参阅手册中的“5.7 任意线范围标记”部分...

答案2

listings软件包提供了一个实验性功能任意线范围标记(参见清单手册)。

// example.c
int square(int x) {
  return x * x;
}

/* BEGIN */
int cube(int x) {
  int x2;
  x2 = square(x);
  return x * x2;
}
/* END */

MWE 演示该linerange选项:

\documentclass{article}
\usepackage{listings}

\lstset{rangeprefix=\/\*\ ,rangesuffix=\ \* \/}

\begin{document}
Example.c

   \lstinputlisting[language=C, linerange=BEGIN-END]{example.c}

\end{document}

输出:

在此处输入图片描述

您可以使用该includerangemarker=false选项来防止行范围标记(/* BEGIN *//* END */)本身成为输出的一部分。

相关内容