自动对多个方程式进行编号并允许添加新方程式

自动对多个方程式进行编号并允许添加新方程式

我的文档包含许多方程式,现在我遇到了一个问题。如果我决定修改或添加新方程式,则会出现标签问题。基本上到目前为止,我对第四章和第一个方程式使用\label{eq4.1}where 。使用这种方法,如果我稍后决定在之前添加新方程式,那么我必须更改所有后续方程式以反映此更改。我正在寻找一种更好、更灵活的方法来应对这个问题。41eq4.1

\documentclass{article}
\usepackage{amsmath}

\begin{document}

\begin{align}
x &= 2^{100}, \label{eq4.1} \\
y &= 2^{100}, \label{eq4.2} \\
z &= 2^{100}. \label{eq4.3}
\end{align}

These are \eqref{eq4.1} and \eqref{eq4.2} and \eqref{eq4.3}. 

\end{document}

答案1

\label–机制的目的\ref是一旦某些数字发生变化,就免除用户重命名交叉引用的负担。

你的方案完全等同于不是添加任何\label命令并仅通过指定的编号进行交叉引用。是的,你可以使用该\ref命令,但你的代码将完全等同于

\DeclareRobustCommand{\eqref}[1]{\eqrefaux#1\eqrefaux}
\def\eqrefaux eq#1\eqrefaux{\textup{(#1)}}

在序言和打字中

\documentclass{article}
\usepackage{amsmath}

\begin{document}

\begin{align}
x &= 2^{100}, \\
y &= 2^{100}, \\
z &= 2^{100}.
\end{align}

These are \eqref{eq4.1} and \eqref{eq4.2} and \eqref{eq4.3}. 

\end{document}

宏只是删除了eq字符串。请注意,这不需要两次传递,因为它没有利用\label。但它错误的大错特错

如果你在某处添加一个方程,你需要跟踪它的位置并找到全部交叉引用的编号较大,则从编号最大的开始,向其添加 1,然后逐步向下。简直是噩梦!而且肯定是错误的来源:假设您的章节存储在不同的文件中:您需要检查每个文件并修复交叉引用。

也许,一周后,你的主管会给你发邮件:“亲爱的 CroCo,你上周添加的那个方程式应该删除。”你想过吗?根据墨菲定律,这肯定会发生。

已经有灵活的机制了:正确\label使用\ref

添加有意义的方程式的名称,

\documentclass{article}
\usepackage{amsmath}
\usepackage{showkeys} % remove for final versions

\begin{document}

\begin{align}
x &= 2^{100}, \label{eq-x100}\\
y &= 2^{100}, \label{eq-y100}\\
z &= 2^{100}. \label{eq-z100}
\end{align}

These are \eqref{eq-x100} and \eqref{eq-y100} and \eqref{eq-z100}. 

\end{document}

您无需担心添加或删除方程式或其他编号对象,因为 LaTeX 会处理这些。如果您交叉引用了您同时删除的方程式(或章节、部分等),甚至会发出警告。

有了showkeysPDF 中显示的标签,您就可以在需要时轻松浏览它以找到确切的名称\ref。如果名称足够好,您可能会记住它们。

在此处输入图片描述

答案2

一般来说,方程式的标签是基于它们的描述,而不是它们出现的顺序。在技术写作中,添加/删除方程式、图形和表格是很常见的。我的实验室遵循的一般方案是:

  1. 使用 fg 表示图形、使用 tb 表示表格、使用 eq 表示方程式。例如,在您的例子中,您可能想要使用\label{eq:defx}

  2. 如果有多个方程式,而您希望按照它们的部分将它们分开,为了方便回忆标签名称,您可能需要使用类似于在某个部分下\label{eq:bbt:defx}定义的方程式,x比如“大爆炸理论”。

  3. 当有一组方程式可以作为单个方程式(类似于您的示例)时,您可能需要使用\nonumber来抑制方程式编号。

    \documentclass{article}
    \usepackage{amsmath}
    
    \begin{document}
    \begin{align}
    x &= 2^{100}, \nonumber \\
    y &= 2^{100}, \nonumber \\
    z &= 2^{100}. \label{eq:defxyz}
    \end{align}
    
    These are defined in Eqs.~\ref{eq:defxyz}. 
    \end{document}
    

编辑:这并没有回答问题,而是一个建议。重新标记所有方程式可能需要一些时间,但从长远来看,您可能会节省大量时间——考虑到您已经开始添加/删除方程式了。

答案3

警告:前方愚蠢的代码:

我展示了一种方法,首先将方程存储在expl3seq 变量中,然后将带标签的方程写入单独的文件。使用 可以轻松在写入或交换顺序之前或之后添加新方程\AddEquation

但是,每次都会重写文件,因此必须修改设计;-)

\documentclass{article}
\usepackage{amsmath}

\usepackage{xparse}

\ExplSyntaxOn
\seq_new:N \l__croco_equation_seq
\iow_new:N \l__croco_equation_file


\NewDocumentCommand{\AddEquation}{v}{%
  \seq_put_right:Nn \l__croco_equation_seq {#1}
}

\NewDocumentCommand{\WriteEquations}{O{eq4}}{%
  \int_zero:N \l_tmpa_int
  \iow_open:Nn \l__croco_equation_file {\jobname.equ}
  \iow_now:Nn \l__croco_equation_file {\begin{align}}
    \seq_map_inline:Nn \l__croco_equation_seq {%
      \int_incr:N \l_tmpa_int
      \iow_now:Nx \l__croco_equation_file {##1\space \string\label{#1.\int_use:N \l_tmpa_int} \string\\}
    }
    \iow_now:Nn \l__croco_equation_file {\end{align}}
  \iow_close:N \l__croco_equation_file 
  \seq_gclear:N \l__croco_equation_seq
}

\ExplSyntaxOff


\begin{document}

\AddEquation{x &= 2^{100}}
\AddEquation{y &= 2^{100}}
\AddEquation{z &= 2^{100}}

\WriteEquations

\InputIfFileExists{\jobname.equ}{}{}


\AddEquation{x &= 2^{100}}
\AddEquation{y &= 2^{100}}
\AddEquation{z &= 2^{100}}

\WriteEquations[eqother]

\InputIfFileExists{\jobname.equ}{}{}



These are \eqref{eq4.1} and \eqref{eq4.2} and \eqref{eq4.3}. 

and those are are \eqref{eqother.1} and \eqref{eqother.2} and \eqref{eqother.3}. 



\end{document}

相关内容