假设我正在编写一个 LaTeX 文档来描述一些代码,并且我想在代码中引用文档中的特定方程编号。有没有一种自动的方法可以确定将分配给哪个方程编号
\label{eqn:myequation}
编写一个程序来解析源代码并用 pdflatex 分配给该标签的当前数字替换注释中的公式标签将会很好。
答案1
这可能适合你的用途,也可能不适合,因为它不会在物理上改变你的代码文件。(它保留\label
代码中的 s,而不是用数字替换它们。)但有几种方法可以做到这一点,使用listings
软件包的 LaTeX 功能转义。其他代码漂亮打印软件包也有类似的功能,但我用它作为示例,listings
因为它是最普遍的。
您可以Eq.~\ref{eqn:foo}
在注释中直接使用,并告诉 listings 包在一组任意分隔符之间转义为 LaTeX 代码(如第一个示例中所示,使用|
),或者将所有注释行视为转义的 LaTeX 代码,如第二个示例中所示。
总体思路如下:
\documentclass{article}
\usepackage{listings}
\lstset{language=c}
\begin{document}
My code implements
\begin{equation}\label{eq:energy}
e = mc^2,
\end{equation}
which describes the relationship between mass and energy.
The code is displayed in Listing~\ref{lst:func}.
\begin{lstlisting}[
caption={Test function.},
label={lst:func},
escapechar=|,% <-- for escaping to LaTeX inside comments
]
double NucEnergy(double mass){
/* here I have |\itshape Eq.~\ref{eq:energy}| of the text */
< ... code omitted ... >
}
\end{lstlisting}
Another option, where all comment lines are parsed as \LaTeX\ input:
\begin{lstlisting}[
caption={Another test function.},
label={lst:func2},
texcl=true,%<-- to treat all comment lines as escaped LaTeX
]
double NucEnergy(double mass){
// here I have Eq.~\ref{eq:energy} of the text
< ... code omitted ... >
}
\end{lstlisting}
\end{document}
请注意,在第一个例子中,我们完全负责文本样式(注释\itshape
),而在第二个例子中,自动使用默认注释样式。
答案2
谢谢您提供的有趣例子,保罗。
看来 Ethan 关于 .aux 文件的建议正是我想要的。我承认我已经使用 LaTeX 大约 13 年了,但之前从未真正看过 .aux 文件。
在我当前的文档中,我有一个等式
\begin{equation}
\min_{\psi,\mathcal{E}} -|\langle \psi(T)|f\rangle|^2 +\frac{\gamma}
{2}\|\mathcal{E}\|^2
\label{eqn:state_equation}
\end{equation}
.aux 文件包含一行
\newlabel{eqn:state_equation}{{1}{1}{}{equation.0.1}{}}
我可以看到,在 .pdf 中这确实是公式 1,因此看起来第一组花括号的内容是指定的数字,而从另一个示例中,页码似乎在第二个 {} 中,包含子部分的名称出现在第三个 {} 中。
现在我可以编写一个文本解析器,它将读取我的源代码并创建一个分发版本,其中 eqn:state_equation 被 (1) 替换。
非常感谢您的建议!