我有这个代码:
\documentclass[12pt]{article}
\usepackage[utf8]{inputenc}
\usepackage[margin=2.5cm]{geometry}
\usepackage{lipsum}
\title{Test}
\author{Andreas Melsen}
\date{September 2018}
\begin{document}
\section*{Finance Notes}
\lipsum[2]
\begin{equation}
PV=\sum_{n=1}^{\infty}\frac{C}{(1+r)^n}
\end{equation}
\lipsum[4]
\begin{equation}
r_r=\frac{r-i}{1+i}\approx{}r-i
\end{equation}
\section*{List of Equations}
\begin{equation}
PV=\sum_{n=1}^{\infty}\frac{C}{(1+r)^n}
\end{equation}
\begin{equation}
r_r=\frac{r-i}{1+i}\approx{}r-i
\end{equation}
\end{document}
输出结果如下:
我目前正在学习一门公司财务课程,其中我的笔记样本可能类似于上图。在整个笔记中,我将写下各种方程式,我的问题是,是否可以在文档末尾自动列出所有使用的方程式,如“方程式列表”部分所示?提前致谢!
答案1
以下代码应该可以满足您的要求。它使用一个框寄存器来存储文档中的所有方程式,并且不基于注释中链接的两个答案中的任何一个。
\documentclass{article}
\usepackage{amsmath} %% Necessary for collect@body and \savecounters@/\restorecounters@
\usepackage{lipsum} %% Unnecessary, for \lipsum
\newbox\savedeqs %% <- box register that will store your equations
\makeatletter %% <- change @ so that it can be used in command names
\newcommand\saveandprinteq[1]{% %% <- saves equation in a box register, then prints it
\begingroup
\expandafter\let\csname \@currenvir\expandafter\endcsname\csname listeq@\@currenvir\endcsname
\expandafter\let\csname end\@currenvir\expandafter\endcsname\csname listeq@end\@currenvir\endcsname
%% ^^ restore original environment definitions
\edef\listeq@temp{% %% <- the full environment, with its original name
\noexpand\begin{\@currenvir}%
\unexpanded{#1}%
\noexpand\end{\@currenvir}%
}%
\savecounters@ %% <- store counter values
\global\setbox\savedeqs=\vbox{\unvbox\savedeqs\listeq@temp}% %% <- append to \savedeqs
\restorecounters@ %% <- restore them
\listeq@temp %% <- print the environment
\endgroup
}
\newcommand*\listeqpatch[1]{% %% <- patches equation environment
\expandafter\let\csname listeq@#1\expandafter\endcsname\csname #1\endcsname
\expandafter\let\csname listeq@end#1\expandafter\endcsname\csname end#1\endcsname
\renewenvironment{#1}{\collect@body\saveandprinteq}{}%
}
\newcommand\listofequations{ %% <- prints the list of equations
\section*{List of equations}
\unvbox\savedeqs
}
\makeatother %% <- change @ back
%% Patching equation environments
\listeqpatch{equation}
\listeqpatch{align}
\listeqpatch{gather}
\listeqpatch{multline}
\listeqpatch{flalign}
\begin{document}
\section{Finance Notes}
\lipsum[2]
\begin{equation}
PV=\sum_{n=1}^{\infty}\frac{C}{(1+r)^n}
\end{equation}
\lipsum[4]
\begin{align} %% <- Using align just to show that it works
r_r &= \frac{r-i}{1+i}\\
&\approx r-i
\end{align}
\listofequations
\end{document}
(请注意,我对第二个方程使用了align
环境,只是为了证明它有效。)
它的作用
我正在定义命令\listeqpatch
并使用它来修补equation
和amsmath
方程式环境,如align
。这将存储这些环境的原始定义,然后重新定义这些环境以调用\saveandprinteq{<equation body>}
而不是它们通常会执行的操作。(我为此使用了\collect@body
from 。)amsmath
所做\saveandprinteq{<equation body>}
的是(恢复原始环境定义并使用它来)排版方程并将副本附加到框寄存器\savedeqs
。此框寄存器开始时为空,但到文档结束时,它包含到该点为止的每个方程的副本。该命令\listofequations
打印\section*{List of equations}
,然后调用\unvbox\savedeqs
以打印此框寄存器的内容。
几点说明
- 过早调用
\listofequations
将打印自上次调用此命令以来的所有方程式副本。如果您有多个章节,您可以通过\listofequations
在每个章节末尾添加来为它们创建单独的方程式列表。您可以使用 清除框寄存器\setbox\savedeqs=\vbox{}
。 - 由于框寄存器包含方程的排版版本,因此方程编号等信息会保留在方程列表中。如果方程中使用的宏在方程之后发生更改,这同样不会影响副本。
- 使用这种方法,不可能在实际方程式之前插入方程式列表,因为据我所知,盒子寄存器不能写入辅助文件。