使用 showlabel 显示 IEEElabels?

使用 showlabel 显示 IEEElabels?

我在用着IEEEtrantools排版方程式(这里有一个很好的教程)。

该软件包提供了IEEEeqnarray排版方程的环境。该环境存在标签问题,因此必须使用

\newcommand{\IEEElabel}[1]{\begingroup\addtocounter{equation}{-1}\refstepcounter{equation}\label{#1}\endgroup}

代替\label

问题在于IEEElabel用 s来显示showlabel(或者其他方式?)。

以下是 MWE:

\documentclass{article}

\usepackage{fontspec} % enagles loading of OpenType fonts
\usepackage{polyglossia} % support for languages

% fonts:
\defaultfontfeatures{Scale=MatchLowercase,Mapping=tex-text} % without this XeLaTeX won't turn "--" into dashes
\setmainfont{Arial}
\setsansfont{Arial}
\setmonofont{DejaVu Sans Mono}

% math:
\usepackage{IEEEtrantools} % for advanced typesetting like multiline equations, and the likes.
\newcommand{\IEEElabel}[1]{\begingroup\addtocounter{equation}{-1}\refstepcounter{equation}\label{#1}\endgroup}
\usepackage{unicode-math} % to use unicode in the formulas -- to improve readability of sources
\setmathfont{Asana-Math.otf}

% showlabels?
\usepackage[inline]{showlabels}

\begin{document}

\begin{IEEEeqnarray}{rCl}
  e^{i π} + 1 = 0
  \IEEElabel{eq:test}
\end{IEEEeqnarray}

\end{document}

编辑

这是包含 amsmath、mathtools 的片段。当我使用它们时 - 我没有得到标签,当我没有得到标签时 - 标签就在那里。

\documentclass{article}

\usepackage{fontspec} % enagles loading of OpenType fonts
\usepackage{polyglossia} % support for languages

% fonts:
\defaultfontfeatures{Scale=MatchLowercase,Mapping=tex-text} % without this XeLaTeX won't turn "--" into dashes
\setmainfont{Arial}
\setsansfont{Arial}
\setmonofont{DejaVu Sans Mono}

% math:
\usepackage{amsmath, mathtools}
\usepackage{IEEEtrantools} % for advanced typesetting like multiline equations, and the likes.
\usepackage{unicode-math} % to use unicode in the formulas -- to improve readability of sources
\setmathfont{Asana-Math.otf}


% showlabels?
\usepackage[inline]{showlabels}


% define a general showlabels patch for equation numbering commands
\makeatletter
  \def\eqnnumpatch#1{
    \expandafter\let\csname SL@#1\expandafter\endcsname\csname #1\endcsname
    \expandafter\def\csname #1\endcsname{%
      \csname SL@#1\endcsname     %% produce original equation number %%
      \ifx\SL@labelname\relax
        % do nothing
      \else
        \SL@eqnlrtext{\SL@labelname}%     %% produce label annotation %%
      \fi
      \global\let\SL@labelname\relax
    }
  }
\makeatother

% patch the two macros relevant for the IEEEeqnarray environment
\eqnnumpatch{theequationdis}
\eqnnumpatch{theIEEEsubequationdis}


\begin{document}

\begin{IEEEeqnarray}{rCl}
  e^{i π} + 1 & = & 0
  \label{eq:test}
\end{IEEEeqnarray}

\end{document}

我有相同的IEEEtrantoolsshowlabel。以下是完整的两个日志:没有数学用数学

答案1

showlabels包重新定义了\label宏以生成标签注释。然而,在重新定义的\label宏中,它区分了文本模式,其中直接生成标签注释,并且数学模式,其中标签注释的排版被推迟到实际方程编号(即 (1)、(2) 等)排版完成。后者也是通过修补宏来完成的\@eqnnum,该宏由 LaTeX 用于排版方程编号,或者由 定义\maketag@@@,用于相同目的。修补后的方程编号宏然后通过恢复标签名称(由-patched宏amsmath存储)来生成标签注释。\SL@labelnameshowlabels\label

不幸的是,IEEEeqnarray使用另一组宏来生成方程编号,即\theequationdis常规方程和\theIEEEsubequationdis子方程(可以通过查看 找到IEEEtrantools.sty)。因此,标签注释不会立即显示。解决您的问题的明显方法是使用与 相同的方式修补这两个命令\@eqnnum,从而透明地将showlabels功能集成到 中IEEEeqnarray

如果我们仔细查看showlabels.sty,就会发现该\@eqnnum宏在以下段中被重新定义:

\let\SL@eqnnum=\@eqnnum
\def\@eqnnum{%
  \SL@eqnnum
  \ifx\SL@labelname\relax
    % do nothing
  \else
    \SL@eqnlrtext{\SL@labelname}%
  \fi
  \global\let\SL@labelname\relax
}

这里要注意的重要一点是重新定义的宏如何检查是否\SL@labelname已设置,如果已设置,则将其传递给showlabel生成\SL@eqnlrtext实际注释的。在下面的 MWE 中,我定义了它采用宏的 csname,然后以与上面包中\eqnnumpatch所示相同的方式对其进行修补。然后使用此宏来修补前面提到的方程编号宏:\@eqnnumshowlabelIEEEtrantools

\documentclass{article}

\usepackage{IEEEtrantools}
\usepackage[inline]{showlabels}

\makeatletter
  %% 1) define a general showlabels patch for equation numbering commands
  \def\eqnnumpatch#1{
    \expandafter\let\csname SL@#1\expandafter\endcsname\csname #1\endcsname
    \expandafter\def\csname #1\endcsname{%
      \csname SL@#1\endcsname     %% produce original equation number %%
      \ifx\SL@labelname\relax
        % do nothing
      \else
        \SL@eqnlrtext{\SL@labelname}%     %% produce label annotation %%
      \fi
      \global\let\SL@labelname\relax
    }
  }
  %% 2) fix showlabel's definition of \SL@inlinetext
  \newif\ifSL@inline
  \ifx\SL@setlabel\SL@inlinetext\SL@inlinetrue\fi    %% `inline` set? %%
  \def\SL@inlinetext#1{%
    \ifmmode                               %% remove \ifSL@AMS switch %%
      \xdef\SL@labelname{\SL@prlabelname{#1}}%
    \else
      \SL@interlinetextright{\SL@prlabelname{#1}}%
    \fi
  }
  \ifSL@inline
    \let\SL@setlabel\SL@inlinetext %% correctly redefine \SL@setlabel %%
  \fi
\makeatother

%% 3) patch the two macros relevant for the IEEEeqnarray environment
\eqnnumpatch{theequationdis}
\eqnnumpatch{theIEEEsubequationdis}

%% 4) test it
\begin{document}

\begin{IEEEeqnarray}{rCl}
  e^{i p} + 1 = 0 \label{eq:first}\\
  E = mc^2 \IEEEyessubnumber\label{eq:second}
\end{IEEEeqnarray}

\end{document}

为了简洁起见,省略了与 XeLaTeX 相关的所有内容。

编辑:

\IEEElabel当然,当使用问题中定义的宏而不是 时,这也有效\label。但是,我无法重现您的编号问题,并且由于您没有指定计数器的确切问题equation,并且它似乎与实际IEEEtrantools+showlabels问题无关,因此我选择不将其包含在答案中。也许您应该确保您的 版本IEEEtrantools是最新的。

编辑:

我最初的答案不适用于showlabel选项inline。这是因为如果使用 ,则\SL@inlinetext宏被定义为在数学模式下不执行任何操作,这显然依赖于 AMS 环境将标签名称存储在 中的事实。此问题已在上面显示的 MWE 中得到修复(参见注释和之间的所有内容)。amsmath\df@labelfix showlabel's definition of \SL@inlinetext\makeatother

相关内容