有没有办法使用\lstinputlisting
(从listings
包中)灵活地输入源代码的特定部分?可以使用firstline
和lastline
选项输入特定的行范围,但这对源文件的更改不够稳健。
例如,假设输入源文件是:
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
简短指南
- 设置标记的前缀和后缀。将空格替换为
\
(反斜杠加空格) - 决定标记线是否应该是输出的一部分。
- 包含代码并使用前缀和后缀之间的文本作为选项的“行号”
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 */
)本身成为输出的一部分。