我正在尝试学习如何使用命令,\eqref
而不是仅仅执行tag{1.1}
,这样我就不必返回并重新编号。我遇到了麻烦:在问题 3b 中,我说
Now \eq{y(t, \epsilon)= y_0(t) + \epsilon y_1(t) + O(\epsilon^2), \label{eq:aa}}
(\eq 是我定义的缩写,它是\newcommand{\eq}[1]{\begin{align*}#1\end{align*}}
)。后来我回去写了So we can fill in \eqref{eq:aa}
,问题是
- 它没有标记方程式
- 当它再次引用它时,它称它为(1.2),尽管它是第一个标记方程。
这是我的代码的链接,如果它可以帮助您进行诊断。https://www.writelatex.com/read/zjhhjpndjpkz
我感谢您的帮助!
答案1
好的。你的定义存在一些问题。
任何带星号的数学显示环境旨在抑制编号。您可以\tag{...}
在带星号的环境中放置一个,但数字不会自动增加。但是,\label
在这样的标签上将要受到\ref
或的尊重\eqref
。(\eqref
实际上所做的就是将 a 的参数格式化\ref
为直立并用括号括起来。)
接下来。align
旨在用于多行表达式,每行都有左部分和右部分。虽然很多人用它来\align
显示单行,但这不是一个好主意,因为多行显示周围的垂直间距与单行显示周围的垂直间距有意不同。如果一行没有两个部分(以 分隔&
),则结构不会水平居中。
最后,将环境变成命令会使您的输入更难被别人阅读和解读,并导致不良的输入习惯 - 例如将显示材料排成长行。相信我,这会导致期刊编辑严重脱发。
如果你真的想要使用像这样的简写来显示一行、编号,那么可以这样做,也许像这样:
\newcommand{\eq}[1]{\begin{equation} #1\end{equation}}
但最好在这样做之前再三考虑。有人建议说服你的输入环境/编辑器使用“完成”。这使得很多从长远来看,文件更加易于理解,调试和维护也更加高效。
答案2
我查看了链接中提供的代码。主要问题似乎是您align*
在宏定义中使用了环境\eq
。align*
环境在设计上确实不是增加或打印方程编号。因此,\label
与此方程(或方程组)相关的任何指令都不会指向由 生成的内容\eq
。
因此,后续的\ref
或\eqref
指令不会指向该结构。相反,要么(??)
打印出来,要么交叉引用将指向在丢失指令之前最近增加其关联计数器的对象。该对象可能是部分、定理、以“正常”方式(即不是通过)\label
生成的其他方程式等。\eq
\eq
通过如下定义宏您应该能够获得更好的结果:
\newcommand{\eq}[1]{\begin{equation}\begin{split} #1 \end{split}\end{equation}}
并附\label
上说明,例如
\eq{y(t, \epsilon)= y_0(t) + \epsilon y_1(t) + O(\epsilon^2),} \label{eq:aa}
请注意,使用此设置,您应该用 重命名语句\tag
内的所有指令。\eq
\label