它的作用

它的作用

我有这个代码:

\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并使用它来修补equationamsmath方程式环境,如align。这将存储这些环境的原始定义,然后重新定义这些环境以调用\saveandprinteq{<equation body>}而不是它们通常会执行的操作。(我为此使用了\collect@bodyfrom 。)amsmath

所做\saveandprinteq{<equation body>}的是(恢复原始环境定义并使用它来)排版方程并将副本附加到框寄存器\savedeqs。此框寄存器开始时为空,但到文档结束时,它包含到该点为止的每个方程的副本。该命令\listofequations打印\section*{List of equations},然后调用\unvbox\savedeqs以打印此框寄存器的内容。

几点说明

  • 过早调用\listofequations将打印自上次调用此命令以来的所有方程式副本。如果您有多个章节,您可以通过\listofequations在每个章节末尾添加来为它们创建单独的方程式列表。您可以使用 清除框寄存器\setbox\savedeqs=\vbox{}
  • 由于框寄存器包含方程的排版版本,因此方程编号等信息会保留在方程列表中。如果方程中使用的宏在方程之后发生更改,这同样不会影响副本。
  • 使用这种方法,不可能在实际方程式之前插入方程式列表,因为据我所知,盒子寄存器不能写入辅助文件。

相关内容