我怀疑有没有一种非常有效的方法可以做到这一点,但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}