在方程编号下方添加方程名称

在方程编号下方添加方程名称

我想知道是否有可能(如果可以,如何)在方程编号下方添加方程名称。我只是使用标准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

这是一个简单的使用星号版本\tagamsmath

在此处输入图片描述

\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}}文本格式。文本格式可以采用两种方式之一。可以为每个标签设置格式,就像我\smallNequation环境中所做的那样,也可以逐个标签地设置格式,就像我\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}

在此处输入图片描述

相关内容