我在用着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}
答案1
该showlabels
包重新定义了\label
宏以生成标签注释。然而,在重新定义的\label
宏中,它区分了文本模式,其中直接生成标签注释,并且数学模式,其中标签注释的排版被推迟到实际方程编号(即 (1)、(2) 等)排版完成。后者也是通过修补宏来完成的\@eqnnum
,该宏由 LaTeX 用于排版方程编号,或者由 定义\maketag@@@
,用于相同目的。修补后的方程编号宏然后通过恢复标签名称(由-patched宏amsmath
存储)来生成标签注释。\SL@labelname
showlabels
\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
所示相同的方式对其进行修补。然后使用此宏来修补前面提到的方程编号宏:\@eqnnum
showlabel
IEEEtrantools
\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@label
fix showlabel's definition of \SL@inlinetext
\makeatother