如何以可维护的方式引用外部源文件(例如 C++)中的行号?

如何以可维护的方式引用外部源文件(例如 C++)中的行号?

我怀疑有没有一种非常有效的方法可以做到这一点,但LaTeX似乎几乎可以做到任何事情。我正在编写一份文档,向该软件包的未来用户解释一段 C++ 源代码。源代码是一个 2,000,000 多行软件包的一部分,有数十名开发人员。我正在处理的特定代码部分只有几千行,但它非常复杂,典型的文档记录方法太过繁琐(例如源代码注释、doxygen 等)。我希望能够在我的解释TeX文档中引用代码行,但由于代码仍处于部分开发阶段,这些行号可以(更准确地说,将要) 更改。我目前的方法是只说所有行号都只引用特定存储库修订版中的行,但这并不是很令人满意。我并不反对在我的代码中放置某种识别标记作为注释,这些注释LaTeX将解析为行号,特别是如果这些标签(至少在某种程度上)是人类可读的。有什么想法吗?

这是我正在寻找的那种东西的简单示例。对此持保留态度,因为我试图解决的主要问题是我的特定用例远非简单。

你好.cc:

#include <iostream>

int main() {
    std::cout << "Hello World" << std::endl;  // %label{sc:greet}
    return 0;
}

算法.tex:

\documentclass[12pt]{article} % or whatever
\usepackage{something-magical} % i.e. I need this, would define something like \coderef
\begin{document}
In this program, line \coderef{hello.cc}{sc:greet} greets the user.
\end{document}

理想情况下输出如下内容:

可能的输出

答案1

假设您不仅想要引用,还想在文档中的某个位置排版 C++ 源代码,您可以使用该listings包,定义一个字符以转义为 LaTeX(在我的示例中为左引号),并\label{...}在源代码中的一对这样的转义字符内写入一个。只需确保您明智地选择转义字符;如果它出现在您不打算转义为 LaTeX 的地方,那么当您尝试排版代码时就会遇到麻烦。

如果你打算始终将 LaTeX 标签放在行尾 C++ 注释中,并且不希望这些注释打印在 PDF 中,则可以定义listings“到行尾”分隔符来唯一标识此类注释,例如,

moredelim=[il][]{//latexlabel}

然后,包listings将检测到任何出现的//latexlabel并且不会打印它;但请注意,listings将打印后面的任何未转义的文本//latexlabel

请随意定制/缩短该分隔符;//latexlabel可能对您的口味来说有点太长了。

在此处输入图片描述

\documentclass{article}

\usepackage{filecontents} % only to write your code to hello.cpp
\begin{filecontents*}{hello.cpp}
#include <iostream>

int main() {
    std::cout << "Hello World" << std::endl; //latexlabel `\label{sc:greet}`
    return 0; // another comment that does get typeset
}
\end{filecontents*}

\usepackage{listings}
\lstset
{
    language=C++,
    escapechar=`,
    numbers=left,
    moredelim=[il][]{//latexlabel},
}

\begin{document}

\section{Comments on the implementation}
In this program, line~\ref{sc:greet} greets the user.

\section{Source code}
\lstinputlisting{hello.cpp}
\end{document}

相关内容