![将方程编号与标签结合起来,并独立引用](https://linux22.com/image/354949/%E5%B0%86%E6%96%B9%E7%A8%8B%E7%BC%96%E5%8F%B7%E4%B8%8E%E6%A0%87%E7%AD%BE%E7%BB%93%E5%90%88%E8%B5%B7%E6%9D%A5%EF%BC%8C%E5%B9%B6%E7%8B%AC%E7%AB%8B%E5%BC%95%E7%94%A8.png)
在先前这个问题中,我们定义了一个新命令\owntag
,将方程编号与用户定义的标签结合起来:
\documentclass{article}
\usepackage{amsmath}
\newcommand{\owntag}[1]{\stepcounter{equation}\tag{\theequation, #2}}
\begin{document}
\begin{align}
F=ma \owntag[eq:newton]{Newton}
\end{align}
My equation is \eqref{eq:newton}.
\end{document}
如您所见,我们可以参考格式为“1,牛顿”的方程式作为参考。我想扩展此命令,以便我可以
- 仅使用数字引用方程(即“方程 (1)”)
- 仅使用文本引用方程式(即“eq. (Newton)”)
为了实现第一个目标,我尝试添加一个额外的计数器,将其设置为方程计数器的值,然后执行\refstepcounter
并将其放在\label
其后,但仍然得到“(1,牛顿)”作为参考:
\documentclass{article}
\usepackage{amsmath}
\usepackage{xifthen}
\newcounter{equationwotag}
\newcommand{\owntag}[2][]{\ifthenelse{\equal{#1}{}}{
\stepcounter{equation}\tag{\theequation, #2}
}{
\setcounter{equationwotag}{\value{equation}}\label{#1}\stepcounter{equation}\stepcounter{equation}\tag{\theequation, #2}
}}
\begin{document}
\begin{align}
F=ma \owntag[eq:newton]{Newton}
\end{align}
My equation is \eqref{eq:newton}.
\end{document}
如何实现这两种引用方法?
答案1
当您添加时,\label{eq:Newton}
当前的“值”将\@currentlabel
作为关联标签存储在辅助文件中。因此,执行所需操作的一种方法是设置\@currentlabel
相应设置,然后添加\label
。还有一个额外的复杂因素,即数学包重新定义,\label
以便进行一些错误检查,特别是,如果您尝试在方程式环境(如)内定义两个标签,则会出现错误align
。为了解决这个问题,我们必须使用\ltx@label
而不是\label
,这是“正常无保护”的 latex \label
。
最后,我误读了您的 MWE,以为您想要一个可选参数来提供标签的简短版本。这似乎是一个很好的功能,但它需要更多的技巧,因为我们需要在标签名称中插入一个“变量”。
我已经将其设置为\owntag[<short label>]{<tag>}
:
\ref{Eq:<label>}
给出带有方程编号和“自己的标签”的“完整标签”\ref{eq:<label>}
仅给出方程编号\ref{tag:<label>}
仅提供“自己的标签”
结果是你现在可以生成这个:
使用代码
\documentclass{article}
\usepackage{amsmath}
\makeatletter
\newcommand{\owntag}[2][\relax]{% \owntag[short label]{tag}
\ifx#1\relax\relax\def\owntag@name{#2}\else\def\owntag@name{#1}\fi% base label
\refstepcounter{equation}\tag{\theequation, #2}%
\expandafter\ltx@label\expandafter{eq:\owntag@name}%
\edef\@currentlabel{\theequation, #2}\expandafter\ltx@label\expandafter{Eq:\owntag@name}%
\def\@currentlabel{#2}\expandafter\ltx@label\expandafter{tag:\owntag@name}%
}
\makeatother
\begin{document}
\begin{align}
F=ma \owntag[newton]{Newton}% with optional argument
\end{align}
My equation is \eqref{Eq:newton}. The equation number by itself is
\eqref{eq:newton} and the tag is \eqref{tag:newton}.
\begin{align}
E=mc^2\owntag{Einstein}% no optional argument
\end{align}
My equation is \eqref{Eq:Einstein}. The equation number by itself is
\eqref{eq:Einstein} and the tag is \eqref{tag:Einstein}.
\end{document}
答案2
我在使用来自 user30471 的宏时遇到了麻烦。
\begin{align}
\frac{\partial u_i}{\partial x_i} = 0 \qquad \mathrm{or} \qquad \vec{\nabla} \cdot \vec{u} = 0
\owntag[example]{Mass conservation}
\end{align}
the mass conservation equation \eqref{mass}.
给出输出:
最终对我有用的是以下代码:
\refstepcounter{equation}\label{eq:mass}
\begin{equation}
\frac{\partial u_i}{\partial x_i} = 0 \qquad \mathrm{or} \qquad \vec{\nabla} \cdot \vec{u} = 0
\tag{\theequation ,\ Mass\ Conservation}
\label{dummy}
\end{equation}
This is the mass conservation equation \eqref{eq:mass}. This is its dummy label \eqref{dummy}.
输出