我需要能够使用单个宏命令切换所有后续“单元格”的颜色。(当我的方程式有很多部分时,我也不希望对齐的 h 间距过于分散)。如果有人有更好的选择,请告诉我;但目前,它是equationarray
。
\documentclass[10pt]{memoir}
\usepackage{xcolor}
\usepackage{eqnarray}
\providecommand{\mathfgcolor}{}
\NewDocumentEnvironment{eq}{b}{%
\begin{equationarray*}{*{16}{ >{\mathfgcolor} c } }
#1
\end{equationarray*}%
\ignorespacesafterend%
}{}
\showoutput
\begin{document}
\setlength{\abovedisplayskip}{2pt plus 0pt minus 0pt}
\setlength{\belowdisplayskip}{3pt plus 0pt minus 0pt}
This is my first equation to show off good spacing
\begin{eq}
(1+r_{0.5}) &=& (1 + r_{1})^{0.5} &=& (1+5\%)^{0.5} &\approx& 1+2.4695\% &=& 1.024695
\end{eq}
ok --- compounding 2.4695\% over two (6-month) periods indeed yields 5\%
\begin{eq}
(1+2.4695\%)\cdot(1+2.4695\%) &=& 1.024695^{2} &\approx& (1+5\%)
\gdef\mathfgcolor{\color{blue}}
\\
(1 + r_{0,1}) \cdot (1+r_{1,2}) &=& (1+r_1)^2 &=& (1+r_{0,2})
\end{eq}
\end{document}
不幸的是,这在第二个等式前产生了一个令人费解的垂直空间:
现在我知道了\showoutput
,我查看了日志,但我不知道是什么产生了这个额外的空间,更重要的是,我如何要求 LaTeX 不要插入它。 (我猜原因是 LaTeX 在某个时候 [对于足够长的一行] 真的想将行推到右边距,此时它还决定下一行有内容 [虽然它是空的] 并将此行留空,从而将等式推到它后面一行。 在这种情况下,它可能是一个\parfillskip
之前......?)
感谢大家(D!)在这里纵容我的问题。
更新: 1我把例子做得更详细,说明了为什么我一开始就费心使用 eqnarray。 2我认为我正在使用来自的标准 eqnarray.sty 1.3 /usr/local/texlive/2022/texmf-dist/tex/latex/eqnarray/eqnarray.sty
。[3] 请忽略“&”周围的空格 --- 我在其他地方修改了这一点,但在示例中省略了它。
问候,/iaw
答案1
为什么不使用array
?
为什么b
要有参数说明符?这是一个标准环境,不需要它。
现在让我们看看问题。输出日志显示第一个显示之前的行
....\OT1/cmr/m/n/10 s
....\OT1/cmr/m/n/10 p
....\OT1/cmr/m/n/10 a
....\OT1/cmr/m/n/10 c
....\OT1/cmr/m/n/10 i
....\OT1/cmr/m/n/10 n
....\OT1/cmr/m/n/10 g
....\glue 3.33333 plus 1.66666 minus 1.11111
....\glue 3.33333 plus 1.66666 minus 1.11111
....\glue 3.33333 plus 1.66666 minus 1.11111
....\glue 3.33333 plus 1.66666 minus 1.11111
....\glue 3.33333 plus 1.66666 minus 1.11111
....\glue 3.33333 plus 1.66666 minus 1.11111
....\glue 3.33333 plus 1.66666 minus 1.11111
....\glue 3.33333 plus 1.66666 minus 1.11111
....\glue 3.33333 plus 1.66666 minus 1.11111
....\glue 3.33333 plus 1.66666 minus 1.11111
....\glue 3.33333 plus 1.66666 minus 1.11111
....\glue 3.33333 plus 1.66666 minus 1.11111
....\glue 3.33333 plus 1.66666 minus 1.11111
....\glue 3.33333 plus 1.66666 minus 1.11111
....\glue 3.33333 plus 1.66666 minus 1.11111
....\glue 3.33333 plus 1.66666 minus 1.11111
....\glue 3.33333 plus 1.66666 minus 1.11111
....\penalty 10000
....\glue(\parfillskip) 0.0 plus 1.0fil
这意味着在开始显示之前添加了 17 个空格。该行可以容纳它们,但第二个显示之前的行不能,因此输出仅由空格组成的行。
两个虚假空格来自和的代码\equationarray
,并且\@equationarray
很容易修复。其他 15 个显然是由于声明的 16 个列造成的。
猜猜是什么?是的memoir
!这个漏洞位于第 5670 行
5664 \let\m@mold@addamp\@addamp
5665 \newcommand*{\m@m@addamp}{%
5666 \if@firstamp
5667 \@firstampfalse
5668 \global\@curtab\@ne
5669 \else
5670 \@addtopreamble{&}
5671 \global\advance\@curtab\@ne
5672 \fi}
5673 \let\@addamp\m@m@addamp
现在进行修复。
\documentclass[10pt]{memoir}
\usepackage{xcolor}
\usepackage{eqnarray}
\makeatletter
% fix the spurious space by memoir
\renewcommand*{\@addamp}{%
\if@firstamp
\@firstampfalse
\global\@curtab\@ne
\else
\@addtopreamble{&}% <---
\global\advance\@curtab\@ne
\fi}
% fix the spurious spaces by equationarray
\def\equationarray{%
\col@sep\arraycolsep
\def\d@llarbegin{$\displaystyle}%
\def\d@llarend{$}%
\stepcounter{equation}%
\let\@currentlabel=\theequation
\set@eqnsw \global\@eqcnt\z@ \global\@eqargcnt\z@
\let\@classz\@eqnclassz
\def\multicolumn##1##2##3{\@eqnmulticolumn{##1}{##2}{##3}%
\global\advance\@eqcnt##1\relax
\global\advance\@eqcnt\m@ne}%
\def\eqnnum##1{\global\@eqnswfalse\gdef\@eqnarrnum{##1}}% <---
\def\@halignto{to\displaywidth}%
\@ifnextchar[{\@equationarray}{\@equationarray[.]}}
\def\@equationarray[#1]#2{%
\eqnarr@opts
\@tempdima \ht \strutbox
\advance \@tempdima by\extrarowheight
\setbox\@arstrutbox=\hbox{\vrule
\@height\arraystretch \@tempdima
\@depth\arraystretch \dp \strutbox
\@width\z@}%
\gdef\advance@eqargcnt{\global\advance\@eqargcnt\@ne}%
\begingroup
\@mkpream{#2}%
\xdef\@preamble{%
\if #1l\tabskip\z@ \else\if #1r\tabskip\@centering
\else\if #1c\tabskip\@centering
\else\tabskip\eqnarr@left \fi\fi\fi
\halign \@halignto
\bgroup \tabskip\z@ \@arstrut \@preamble
\if #1l\tabskip\@centering \else\if #1r\tabskip\z@
\else\tabskip\@centering \fi\fi
\@amper\llap{\@sharp}\tabskip\z@\cr}%
\endgroup
\gdef\advance@eqargcnt{}%
\bgroup
\let\@sharp##% <---
\let\protect\relax
\m@th \let\\=\@equationcr
\let\par\@empty
$$% % $$ BRACE MATCHING HACK
\lineskip \z@
\baselineskip \z@
\@preamble}
\makeatother
\providecommand{\mathfgcolor}{}
\NewDocumentEnvironment{eq}{}
{\begin{equationarray*}{*{16}{>{\mathfgcolor}c}}}
{\end{equationarray*}\ignorespacesafterend}
\begin{document}
\setlength{\abovedisplayskip}{2pt plus 0pt minus 0pt}
\setlength{\belowdisplayskip}{3pt plus 0pt minus 0pt}
This is my first equation to show off good spacing
\begin{eq}
(1+r_{0.5}) &=& (1 + r_{1})^{0.5} &=& (1+5\%)^{0.5} &\approx& 1+2.4695\% &=& 1.024695
\end{eq}
ok --- compounding 2.4695\% over two (6-month) periods indeed yields 5\%
\begin{eq}
(1+2.4695\%)\cdot(1+2.4695\%) &=& 1.024695^{2} &\approx& (1+5\%)
\gdef\mathfgcolor{\color{blue}}
\\
(1 + r_{0,1}) \cdot (1+r_{1,2}) &=& (1+r_1)^2 &=& (1+r_{0,2})
\end{eq}
\end{document}
到底该如何做呢?
\documentclass[10pt]{memoir}
\usepackage{amsmath}
\usepackage{array}
\usepackage{xcolor}
\makeatletter
% fix the spurious space from memoir
\renewcommand*{\@addamp}{%
\if@firstamp
\@firstampfalse
\global\@curtab\@ne
\else
\@addtopreamble{&}% <---
\global\advance\@curtab\@ne
\fi}
\makeatother
\providecommand{\mathfgcolor}{}
\newcolumntype{A}{>{\mathfgcolor}c@{}}
\newcolumntype{B}{>{\mathfgcolor{}}c<{{}}@{}}
\NewDocumentEnvironment{eq}{}
{\begin{equation*}\begin{array}{@{} A *{8}{B}}}
{\end{array}\end{equation*}\ignorespacesafterend}
\begin{document}
This is my first equation to show off good spacing
\begin{eq}
(1+r_{0.5}) &=& (1 + r_{1})^{0.5} &=& (1+5\%)^{0.5} &\approx& 1+2.4695\% &=& 1.024695
\end{eq}
ok --- compounding 2.4695\% over two (6-month) periods indeed yields 5\%
\begin{eq}
(1+2.4695\%)\cdot(1+2.4695\%) &=& 1.024695^{2} &\approx& (1+5\%)
\gdef\mathfgcolor{\color{blue}}
\\
(1 + r_{0,1}) \cdot (1+r_{1,2}) &=& (1+r_1)^2 &=& (1+r_{0,2})
\end{eq}
\end{document}