我的文档包含许多方程式,现在我遇到了一个问题。如果我决定修改或添加新方程式,则会出现标签问题。基本上到目前为止,我对第四章和第一个方程式使用\label{eq4.1}
where 。使用这种方法,如果我稍后决定在之前添加新方程式,那么我必须更改所有后续方程式以反映此更改。我正在寻找一种更好、更灵活的方法来应对这个问题。4
1
eq4.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 会处理这些。如果您交叉引用了您同时删除的方程式(或章节、部分等),甚至会发出警告。
有了showkeys
PDF 中显示的标签,您就可以在需要时轻松浏览它以找到确切的名称\ref
。如果名称足够好,您可能会记住它们。
答案2
一般来说,方程式的标签是基于它们的描述,而不是它们出现的顺序。在技术写作中,添加/删除方程式、图形和表格是很常见的。我的实验室遵循的一般方案是:
使用 fg 表示图形、使用 tb 表示表格、使用 eq 表示方程式。例如,在您的例子中,您可能想要使用
\label{eq:defx}
。如果有多个方程式,而您希望按照它们的部分将它们分开,为了方便回忆标签名称,您可能需要使用类似于在某个部分下
\label{eq:bbt:defx}
定义的方程式,x
比如“大爆炸理论”。当有一组方程式可以作为单个方程式(类似于您的示例)时,您可能需要使用
\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
警告:前方愚蠢的代码:
我展示了一种方法,首先将方程存储在expl3
seq 变量中,然后将带标签的方程写入单独的文件。使用 可以轻松在写入或交换顺序之前或之后添加新方程\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}