\documentclass[preview,border=12pt,varwidth]{standalone}
\usepackage[a4paper,margin=1cm]{geometry}
\usepackage{mathtools}
\begin{document}
\abovedisplayskip=0pt\relax
\begin{align}
\begin{multlined}[b][7cm]
\framebox[5cm]{Top LHS}\\
\framebox[5cm]{Middle LHS}\\
\framebox[5cm]{Bottom LHS}
\end{multlined}
&= \begin{multlined}[t][7cm]
\framebox[5cm]{Top RHS 1}\\
\framebox[5cm]{Middle RHS 1}\\
\framebox[5cm]{Bottom RHS 1}
\end{multlined}\\
&= \begin{multlined}[t][7cm]
\framebox[5cm]{Top RHS 2}\\
\framebox[5cm]{Middle RHS 2}\\
\framebox[5cm]{Bottom RHS 2}
\end{multlined}
\end{align}
\end{document}
答案1
通常方程编号的基线与方程的基线对齐。withmultlined
选项t
只是一个具有较大深度的框。
您想将方程编号向下移动到“底线”,但这定义不明确:
- 一个方程式可以有多个
multlined
具有不同底线的环境。 - 问题中的线条被框起来。因此,方程编号的基线或深度可以与方程的底部规则或最大深度或最深元素的基线对齐。
- 底线可以是的底线
\substack
,用作积分/求和运算符的下标。
因此我认为,方程编号的最佳位置取决于方程。以下示例定义了\tagvpos
设置位置标签以标记方程标签应位于的垂直位置:
- 它针对包的测量环境实现
amsmath
(例如gather
,align
(不是equation
)。 - 它使用
zref-savepos
位置标签包,该标签使用了 pdfTeX 的一个功能,该功能在 PDF 和 DVI 两种模式下均可用,并且还受 XeTeX 和 LuaTeX 支持。 amsmath
如果方程太宽,包具有将方程标签向下移动的功能。在后一种情况下,方程编号不会通过 进行额外移动\tagvpos
。
示例文件:
\documentclass{article}
\usepackage[
a4paper,
hmargin=48mm,
]{geometry}
\usepackage{mathtools}
\usepackage{zref-savepos}
\makeatletter
\@ifdefinable\saved@make@display@tag{%
\@ifdefinable\saved@maketag@@@{%
\@ifdefinable\tagvpos@label{%
\newif\iftagvpos@shifttag@
\g@addto@macro{\shifttag@true}{%
\global\tagvpos@shifttag@true
}%
\newcommand*{\tagvpos@reset}{%
\global\let\tagvpos@label\relax
\global\tagvpos@shifttag@false
}%
\let\saved@make@display@tag\make@display@tag
\def\make@display@tag{%
\ifmeasuring@
\tagvpos@reset
\else
\let\saved@maketag@@@\maketag@@@
\def\maketag@@@##1{%
\ifx\tagvpos@label\relax
\tagvpos@reset
\expandafter\@firstoftwo
\else
\zref@refused{\tagvpos@label a}%
\zref@refused{\tagvpos@label b}%
\begingroup
\let\@auxout=\@mainaux
\zsaveposy{\tagvpos@label b}%
\endgroup
\ifx\tag@shifts\@empty
\else
\if1\shift@tag\row@\relax
\global\tagvpos@shifttag@true
\fi
\fi
\iftagvpos@shifttag@
\tagvpos@reset
\expandafter\expandafter\expandafter\@firstoftwo
\else
\expandafter\expandafter\expandafter\@secondoftwo
\fi
\fi
{%
\saved@maketag@@@{##1}%
}{%
\raisebox{%
\dimexpr\zposy{\tagvpos@label a}sp-\zposy{\tagvpos@label b}sp\relax
}{\saved@maketag@@@{##1}}%
\tagvpos@reset
}%
}%
\fi
\saved@make@display@tag
}%
\begingroup
\let\@addtoreset\ltx@gobbletwo
\newcounter{tagvpos}
\endgroup
\renewcommand*{\thetagvpos}{tagvpos\number\value{tagvpos}}
\newcommand*{\tagvpos}{%
\ifmeasuring@
\else
\stepcounter{tagvpos}%
\xdef\tagvpos@label{\thetagvpos}%
\begingroup
\let\@auxout=\@mainaux
\zsaveposy{\tagvpos@label a}%
\endgroup
\fi
}%
}%
}%
}
\makeatother
% Testing
\usepackage{color}
\newcommand*{\tagmark}{%
\begingroup
\sbox0{$\vcenter{}$}%
\raisebox{-\ht0}[0pt][0pt]{\textcolor{red}{$\,\mapsto$}}%
\endgroup
}
\begin{document}
\begin{gather}
\text{environment \texttt{gather}}\nonumber
\\
\hspace{.75\linewidth}1 = 1
\\
\hspace{.75\linewidth}0.5 = \frac{1}{2\tagmark\tagvpos}\\
\tag{a}
\label{a}
\hspace{.75\linewidth}\ref{a} = \frac{\eqref{a}\tagmark\tagvpos}{1}
\\
\hspace{\linewidth}
\llap{%
$\dots$
\begin{tabular}[t]{@{}r@{}}
very long\\equation\tagmark\tagvpos
\end{tabular}%
}
\end{gather}
\begin{align}
\text{environment \texttt{align}} &+ \text{\texttt{multlined}}\nonumber\\
\begin{multlined}[b][5cm]
\framebox[3cm]{Top LHS}\\
\framebox[3cm]{Middle LHS}\\
\framebox[3cm]{Bottom LHS}
\end{multlined}
&= \begin{multlined}[t][5cm]
\framebox[3cm]{Top RHS 1}\\
\framebox[3cm]{Middle RHS 1}\\
\framebox[3cm]{Bottom RHS 1\tagmark\tagvpos}
\end{multlined}\\
&= \begin{multlined}[t][5cm]
\framebox[3cm]{Top RHS 2}\\
\framebox[3cm]{Middle RHS 2}\\
\framebox[3cm]{Bottom RHS 2\tagmark\tagvpos}
\end{multlined}
\end{align}
\begin{align}
\hspace{\linewidth}
\llap{%
$\dots$
\begin{tabular}[t]{@{}r@{}}
very long\\equation\tagmark\tagvpos
\end{tabular}%
}
\end{align}
\end{document}
评论:
内部位置标签使用计数器自动命名。如果涉及文件( ) ,则将标签写入主
.aux
文件只是为了保持标签名称的唯一性。此外,文件中的标签名称计数器不会重置(这是之前的本地权限的目的)。\include
\let\@auxout\@mainaux
.aux
\include
\let\@addtoreset\@gobbletwo
\newcounter
对过宽方程式进行移位检测:环境
gather
使用开关,而将align
移位状态存储在所有行的列表中。
答案2
对于amsmath
构造,您可以使用
\usepackage[tbtags]{amsmath}
mathtools
并且方程式编号移动到底部(如果使用左侧编号,则移动到顶部),但是除了来自底层的构造之外,这似乎不起作用amsmath
。
答案3
我不得不在页面布局上稍微作弊,但这是我的解决方案。
只需使用简单的align
命令,并手动提供缩进和编号。不过,当下部线条的宽度不同时,它看起来可能会很别扭。
在我看来,无论如何,使用多线进行精确控制似乎很困难。
\documentclass[preview,border=12pt,varwidth]{standalone}
\usepackage[a4paper,landscape]{geometry}
\usepackage{mathtools}
\begin{document}
\abovedisplayskip=0pt\relax
\begin{align}
\framebox[5cm]{Top LHS} \hspace{4cm} \nonumber \\
\framebox[5cm]{Middle LHS} \hspace{2cm} \nonumber \\
\framebox[5cm]{Bottom LHS}
&=
\framebox[5cm]{Top RHS 1} \nonumber \\
& \hphantom{=} \hspace{2cm} \framebox[5cm]{Middle RHS 1} \nonumber \\
& \hphantom{=} \hspace{4cm} \framebox[5cm]{Bottom RHS 1} \\
&=
\framebox[5cm]{Top RHS 2} \nonumber \\
& \hphantom{=} \hspace{2cm} \framebox[5cm]{Middle RHS 2} \nonumber \\
& \hphantom{=} \hspace{4cm} \framebox[5cm]{Bottom RHS 2}
\end{align}
\end{document}
答案4
这是一个stackengine
解决方案,使用\abovebaseline
宏,知道方程编号将出现在基线(又名“数学轴”)上。
如果您没有多数字环境(即,如果您的等式只有一个数字),那么解决方案将非常简单: \abovebaseline[0pt]{your equation here}
如果您的数学尚未进入数学模式,则可能需要\stackMath
在开始时进行一次。
\documentclass[preview,border=12pt,varwidth]{standalone}
\usepackage[a4paper,margin=1cm]{geometry}
\usepackage{mathtools}
\usepackage{stackengine}
\begin{document}
\abovedisplayskip=0pt\relax
\begin{align}
\abovebaseline[2.5\baselineskip]{\begin{multlined}[b][7cm]
\framebox[5cm]{Top LHS}\\
\framebox[5cm]{Middle LHS}\\
\framebox[5cm]{Bottom LHS}
\end{multlined}}
&\abovebaseline[0pt]{ = \begin{multlined}[t][7cm]
\framebox[5cm]{Top RHS 1}\\
\framebox[5cm]{Middle RHS 1}\\
\framebox[5cm]{Bottom RHS 1}
\end{multlined}}\\
&\abovebaseline[0pt]{ = \begin{multlined}[t][7cm]
\framebox[5cm]{Top RHS 2}\\
\framebox[5cm]{Middle RHS 2}\\
\framebox[5cm]{Bottom RHS 2}
\end{multlined}}
\end{align}
\end{document}