我想知道是否有可能(如果可以,如何)在方程编号下方添加方程名称。我只是使用标准equation
环境将方程显示在页面中间,方程编号移到右侧。我需要在方程编号下方放置一些文本作为方程名称。其他要求包括:
- 文本应与公式编号水平右对齐,且不应影响后者与公式的垂直对齐;即,公式和公式编号仍应垂直对齐。
- 公式编号和名称之间的垂直间距应为标准文本间距;即,如果公式垂直较高,则公式编号和名称之间不应有多余的空格。
- 文本应该能够格式化为不同的字体样式。现在,我需要将其格式化为
\sf
。
这是一个 MWE(没有方程名称):
\documentclass{article}
\usepackage{amsmath}
\numberwithin{equation}{section}
\begin{document}
\section{First Section}
\label{sec:section1}
\begin{equation}
\label{eqn:label}
\boxed{M\approx\frac{\pi}{4}\left(\frac{2d}{\lambda_o}\right)^2\left(\mathrm{NA}\right)^2}
\end{equation}
Reference \eqref{eqn:label}.
\end{document}
下面是我想要实现的一个快照示例(取自 Saleh,2007):
我尝试使用该\tag
命令,但发现这不仅会替换公式编号(这是我不想要的),还会导致公式编号计数器跳过该特定公式。理想情况下,该公式仍应作为常规编号公式运行,可以通过数字引用(通过\eqref
或其他方式),但在公式编号下方添加一些文本。
任何帮助都感激不尽。
答案1
这是一个简单的使用星号版本\tag
的amsmath
:
\documentclass{article}
\usepackage{amsmath}% http://ctan.org/pkg/amsmath
\newcommand{\eqname}[1]{\tag*{#1}}% Tag equation with name
\begin{document}
\begin{align}
f(x) &= a \\ \eqname{Constant} \\
g(x) &= ax \\ \eqname{Linear} \\
h(x) &= ax^2+bx+c \label{abc} \\ \eqname{Quadratic}
\end{align}
See~\eqref{abc}.
\end{document}
为了一致性,我已经包\tag*
在里面了\eqname
。
根据您的方程式构造,您可以调整方程式和名称之间的垂直跳跃:
\documentclass{article}
\usepackage{amsmath}% http://ctan.org/pkg/amsmath
\newcommand{\eqname}[1]{\tag*{#1}}% Tag equation with name
\begin{document}
\begin{align}
\boxed{M \approx \frac{\pi}{4}\biggr(\frac{2d}{\lambda_0}\biggr)^2(\text{NA})^2} \label{abc} \\[-\baselineskip]
\eqname{Number of TE Modes}
\end{align}
See~\eqref{abc}.
\end{document}
这里我将其上移了\baselineskip
,但你可以根据自己的喜好进行调整。
答案2
下面的示例侵入包的内部,amsmath
在显示的方程中设置方程标签的阶段添加方程名称。
\eqname{<name of the equation>}
设置方程名称。名称增加了方程标签的深度,因此方程编号的基线不会改变。公式名称的宽度会减少公式可用的空间。因此,公式编号可能会下移( 的特征
amsmath
),如示例中的公式 5 所示。星号形式
\eqname*
忽略公式名称的宽度。如果公式名称与公式内容不冲突,则可以使用它,参见示例中的公式 6。支持使用包
nameref
来引用方程的名称。标签名称在可选参数中给出。(示例使用了包nameref
,但包不是必需的。)可以通过重新定义来更改方程名称的格式
\eqnameref
。示例使用\textsf
评论。
例子:
\documentclass[a5paper]{article}
\usepackage{amsmath}
\usepackage{nameref}
\newcommand*{\eqnameformat}[1]{%
\textsf{#1}%
}
\makeatletter
\@ifdefinable{\org@maketag@@@}{%
\let\org@maketag@@@\maketag@@@
\renewcommand*{\maketag@@@}[1]{%
\org@maketag@@@{%
\@ifundefined{eq@name}{#1}{%
\begin{tabular}[t]{@{}r@{}}%
#1\tabularnewline
\eqnameformat{\@nameuse{eq@name}}%
\end{tabular}%
}%
}%
}%
}
\newif\ifeqname@star
\newcommand*{\eqname}{%
\@ifstar{\eqname@startrue\eqname@}{\eqname@starfalse\eqname@}%
}
\newcommand*{\eqname@}[2][]{%
\gdef\eq@name{#1}%
\ifx\eq@name\@empty
\else
\begingroup
\@ifundefined{GetTitleString}{%
\gdef\@currenteqlabelname{#2}%
}{%
\GetTitleString{#2}%
\global\let\@currenteqlabelname\GetTitleStringResult
}%
\let\@currentlabelname\@currenteqlabelname
\label{#1}%
\endgroup
\fi
%
\gdef\eq@name{#2}%
\ifx\eq@name\@empty
\global\let\eq@name\relax
\else
\ifeqname@star
\gdef\eq@name{\llap{#2}}%
\fi
\fi
}
\@ifdefinable{\org@make@display@tag}{%
\let\org@make@display@tag\make@display@tag
\def\make@display@tag{%
\@ifundefined{@currenteqlabelname}{}{%
\let\@currentlabelname\@currenteqlabelname
}%
\org@make@display@tag
}%
}
\let\eq@name\relax
\let\@currenteqlabelname\relax
\g@addto@macro\displ@y@{%
\global\let\eq@name\relax
\global\let\@currenteqlabelname\relax
}
\@ifdefinable{\org@math@cr@@}{%
\let\org@math@cr@@\math@cr@@
\def\math@cr@@[#1]{%
\org@math@cr@@[{#1}]%
\noalign{%
\global\let\eq@name\relax
}%
}%
}
\@ifdefinable{\org@eqref}{%
\let\org@eqref\eqref
\renewcommand*{\eqref}[1]{%
\begingroup
\let\eq@name\relax
\org@eqref{#1}%
\endgroup
}%
}
\g@addto@macro\equation{%
\eqname{}%
}
\makeatother
\begin{document}
% some test cases
The first equation \eqref{eq:einstein} with name ``\nameref{eq:einstein}'',
the second equation \eqref{eq:second} and
and the last equation \eqref{eq:last} with name ``\nameref{eq:last}''.
\begin{gather}
\eqname[eq:einstein]{Einstein}
E=mc^2\\
\label{eq:second}
a=b
\end{gather}
\begin{equation}
\eqname{Name AB}
a=b
\end{equation}
\begin{gather}
x=y
\end{gather}
\begin{gather}
\eqname{A longer equation name A/no star}
a=b=c=d=e=f=g=h=i=j\\
\eqname*[eq:last]{A longer equation name B/star}
a=b=c=d=e=f=g=h=i=j
\end{gather}
\end{document}
答案3
这是一个解决方案。我引入环境Nequation
来表示“命名方程”,其中名称作为参数传递。我展示了它如何不会搞砸equation
环境编号方案的使用。[根据用户请求,已编辑以修复标签引用,并将部分添加到方程#,并允许文本格式化名称]
为了响应用户的最新查询,可以在我首先添加子部分和子子部分的地方添加\renewcommand\theequation{\thesection.\arabic{equation}}
文本格式。文本格式可以采用两种方式之一。可以为每个标签设置格式,就像我\small
在Nequation
环境中所做的那样,也可以逐个标签地设置格式,就像我\textsf
在实际调用行中展示的那样。
\documentclass{article}
\usepackage{amsmath}
\usepackage{stackengine}
\def\stackalignment{r}
\def\useanchorwidth{T}
\def\stacktype{L}
\newlength\eqshift
\setlength\eqshift{\widthof{)}}
\renewcommand\theequation{\thesection.\arabic{equation}}
\let\savetheequation\theequation
\newenvironment{Nequation}[1]{%
\def\thecurrentname{#1}%
\let\theequation\savetheequation%
\begin{equation}%
\renewcommand\theequation{%
\stackunder{\savetheequation}%
{{\small\thecurrentname}\hspace{-\the\eqshift}}}%
}{%
\end{equation}%
\let\theequation\savetheequation%
\ignorespacesafterend%
}
\begin{document}
\section{New Section}
\begin{Nequation}{\textsf{Equation Name}}
\label{eqn:label}
y=mx+c
\end{Nequation}
We find in equation~\eqref{eqn:label}, a different result than
\begin{equation}
\label{eqtwo}
y=mx^2+c
\end{equation}
However, in equation~\eqref{eqtwo}\ldots
\end{document}