我需要编写一个由多个约束组成的数学规划模型。约束以两列行表示:第一列是方程,第二列是其定义域,例如
x_i > l_i & \forall i \in S
但是两列都可能很长,所以如果一方面希望以某种方式将所有列水平对齐,另一方面,这些列可能最终会被垂直分割或打印出来超出页面的其他元素。
我当时认为一个不错的解决方案是使用一个类似对齐的环境,这样每个第一列都与其他列对齐,每个第二列也与其他列对齐。但是,如果行上没有等式数字的空间,那么我希望第二列(即域)右对齐,以填充第一列后面的空间,避免等式数字打印在新行上。
考虑以下
\documentclass[a4,13pt,reqno,twoside, openright]{article}
\usepackage[utf8x]{inputenc}
\usepackage{float}
\usepackage{subfig}
\usepackage{graphicx}
\usepackage{amsmath}
\usepackage{mathtools}
\usepackage{amsthm}
\usepackage{amsfonts}
\usepackage{amssymb}
\allowdisplaybreaks
\textwidth = 14cm
\hoffset = -1.5cm
\voffset = -2.0cm
\begin{document}
\begin{subequations}
\begin{align}
& y^D_{tzgm} \le y_{tzgm} & \forall t \in T, z \in Z, g \in G_z, m \in \overline{M}_{zg}
\\
& x_{tzg} \leq \sum_{m \in M_{zg}} P_{zgm} \cdot y_{tzgm} + \sum_{m \in \bar M_{zg}} (P^D_{zgm} - P_{zgm}) \cdot y^D_{tzgm} & \forall t \in T, z \in Z, g \in G_z\\
&x_{tzg} \geq \sum_{m \in M_{zg}} p_{zgm} \cdot y_{tzgm} + \sum_{m \in \bar M_{zg}} (p^D_{zgm} - p_{zgm}) \cdot y^D_{tzgm} & \forall t \in T, z \in Z, g \in G_z\\
& o_{1zh} = v_{0h} &\forall z \in Z, h \in H_z\\
& o_{(|T|+1)zh} = v_{(|T|+1)h} & \forall z \in Z, h \in H_z\\
& o_{tzh} + n_{th} + \eta_{h} \cdot m_{tzh} = o_{(t+1)zh} + s_{tzh} + l_{tzh} & \forall t \in T, z \in Z, h \in H_z
\end{align}
\end{subequations}
\end{document}
如您所见,我将每个等式数字放在新行上,因为第一个不等式的定义域太长。我想要的结果的近似值(通过手动添加空格获得)是
\documentclass[a4,13pt,reqno,twoside, openright]{article}
\usepackage[utf8x]{inputenc}
\usepackage{float}
\usepackage{subfig}
\usepackage{graphicx}
\usepackage{amsmath}
\usepackage{mathtools}
\usepackage{amsthm}
\usepackage{amsfonts}
\usepackage{amssymb}
\allowdisplaybreaks
\textwidth = 14cm
\hoffset = -1.5cm
\voffset = -2.0cm
\begin{document}
\begin{subequations}
\begin{align}
& y^D_{tzgm} \le y_{tzgm} \qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad \mathrlap{\forall t \in T, z \in Z, g \in G_z, m \in \overline{M}_{zg}}
\\
& x_{tzg} \leq \sum_{m \in M_{zg}} P_{zgm} \cdot y_{tzgm} + \sum_{m \in \bar M_{zg}} (P^D_{zgm} - P_{zgm}) \cdot y^D_{tzgm} & \forall t \in T, z \in Z, g \in G_z\\
&x_{tzg} \geq \sum_{m \in M_{zg}} p_{zgm} \cdot y_{tzgm} + \sum_{m \in \bar M_{zg}} (p^D_{zgm} - p_{zgm}) \cdot y^D_{tzgm} & \forall t \in T, z \in Z, g \in G_z\\
& o_{1zh} = v_{0h} &\forall z \in Z, h \in H_z\\
& o_{(|T|+1)zh} = v_{(|T|+1)h} & \forall z \in Z, h \in H_z\\
& o_{tzh} + n_{th} + \eta_{h} \cdot m_{tzh} = o_{(t+1)zh} + s_{tzh} + l_{tzh} & \forall t \in T, z \in Z, h \in H_z
\end{align}
\end{subequations}
\end{document}
另外,您认为有更好的方法来排版这些模型吗?
短暂性脑缺血发作
答案1
我只是将第一行标签放在零宽度、右对齐的框中。
\documentclass[a4,13pt,reqno,twoside, openright]{article}
\usepackage[utf8x]{inputenc}
\usepackage{float}
\usepackage{subfig}
\usepackage{graphicx}
\usepackage{amsmath}
\usepackage{mathtools}
\usepackage{amsthm}
\usepackage{amsfonts}
\usepackage{amssymb}
\allowdisplaybreaks
\textwidth = 14cm
\hoffset = -1.5cm
\voffset = -2.0cm
\begin{document}
\begin{subequations}
\begin{align}
& y^D_{tzgm} \le y_{tzgm} & \makebox[0pt][r]{$\forall t \in T, z \in Z, g \in G_z, m \in \overline{M}_{zg}$}
\\
& x_{tzg} \leq \sum_{m \in M_{zg}} P_{zgm} \cdot y_{tzgm} + \sum_{m \in \bar M_{zg}} (P^D_{zgm} - P_{zgm}) \cdot y^D_{tzgm} & \forall t \in T, z \in Z, g \in G_z\\
&x_{tzg} \geq \sum_{m \in M_{zg}} p_{zgm} \cdot y_{tzgm} + \sum_{m \in \bar M_{zg}} (p^D_{zgm} - p_{zgm}) \cdot y^D_{tzgm} & \forall t \in T, z \in Z, g \in G_z\\
& o_{1zh} = v_{0h} &\forall z \in Z, h \in H_z\\
& o_{(|T|+1)zh} = v_{(|T|+1)h} & \forall z \in Z, h \in H_z\\
& o_{tzh} + n_{th} + \eta_{h} \cdot m_{tzh} = o_{(t+1)zh} + s_{tzh} + l_{tzh} & \forall t \in T, z \in Z, h \in H_z
\end{align}
\end{subequations}
\end{document}
答案2
因为你并不真的想要对齐,你可以只使用gather
填充胶强制将条件分开,除非另有说明这里您通常不能\hfill
在 ams 对齐中使用,因此需要先对其进行一些调整。
为了降低代码的重新定义,gather
当然可以基于此创建一个新的环境,而原来的环境保持gather
不变。
\documentclass[a4,13pt,reqno,twoside, openright]{article}
\usepackage[utf8x]{inputenc}
\usepackage{float}
\usepackage{subfig}
\usepackage{graphicx}
\usepackage{amsmath}
\usepackage{mathtools}
\usepackage{amsthm}
\usepackage{amsfonts}
\usepackage{amssymb}
\allowdisplaybreaks
\textwidth = 14cm
\hoffset = -1.5cm
\voffset = -2.0cm
\makeatletter
\def\set@gather@field{%
\iftagsleft@
\global\lineht@\ht\z@
\else
\global\lineht@\dp\z@
\fi
\kern\eqnshift@
\unhbox\z@
\hfil
}
\def\gather@#1{%
\ingather@true \let\split\insplit@
\let\tag\tag@in@align \let\label\label@in@display
\chardef\dspbrk@context\z@
\intertext@ \displ@y@ \Let@
\let\math@cr@@@\math@cr@@@gather
\gmeasure@{#1}%
\global\shifttag@false
\tabskip\z@skip
\global\row@\@ne
\halign to\displaywidth\bgroup
\strut@
\setboxz@h{$\m@th\displaystyle##$}%
\calc@shift@gather
\set@gather@field
\tabskip\@centering
&\setboxz@h{\strut@{##}}%
\place@tag@gather
\tabskip \iftagsleft@ \gdisplaywidth@ \else \z@skip \span\fi
\crcr
#1%
}
\makeatother
\begin{document}
\begin{subequations}
\begin{gather}
y^D_{tzgm} \le y_{tzgm} \quad\hfill \forall t \in T, z \in Z, g \in G_z, m \in \overline{M}_{zg}
\\
x_{tzg} \leq \sum_{m \in M_{zg}} P_{zgm} \cdot y_{tzgm} + \sum_{m \in \bar M_{zg}} (P^D_{zgm} - P_{zgm}) \cdot y^D_{tzgm} \quad\hfill\forall t \in T, z \in Z, g \in G_z\\
x_{tzg} \geq \sum_{m \in M_{zg}} p_{zgm} \cdot y_{tzgm} + \sum_{m \in \bar M_{zg}} (p^D_{zgm} - p_{zgm}) \cdot y^D_{tzgm} \quad\hfill\forall t \in T, z \in Z, g \in G_z\\
o_{1zh} = v_{0h} \quad\hfill\forall z \in Z, h \in H_z\\
o_{(|T|+1)zh} = v_{(|T|+1)h} \quad\hfill\forall z \in Z, h \in H_z\\
o_{tzh} + n_{th} + \eta_{h} \cdot m_{tzh} = o_{(t+1)zh} + s_{tzh} + l_{tzh} \quad\hfill\forall t \in T, z \in Z, h \in H_z
\end{gather}
\end{subequations}
\end{document}
答案3
您可以为此目的定义一个特定的命令:
\documentclass[a4paper]{article}
\usepackage[textwidth=14cm,showframe]{geometry}
\usepackage{amsmath}
\newcommand{\eqcond}[3][3em]{%
\makebox[\dimexpr\displaywidth-#1][s]{%
$\displaystyle#2\hfill#3$}%
}
\allowdisplaybreaks
\begin{document}
\begin{subequations}
\begin{align}
&\eqcond
{y^D_{tzgm} \le y_{tzgm}}
{\forall t \in T, z \in Z, g \in G_z, m \in \overline{M}_{zg}}
\\
&\eqcond
{x_{tzg} \leq \sum_{m \in M_{zg}} P_{zgm} \cdot y_{tzgm} +
\sum_{m \in \bar M_{zg}} (P^D_{zgm} - P_{zgm}) \cdot y^D_{tzgm}}
{\forall t \in T, z \in Z, g \in G_z}
\\
&\eqcond
{x_{tzg} \geq \sum_{m \in M_{zg}} p_{zgm} \cdot y_{tzgm} +
\sum_{m \in \bar M_{zg}} (p^D_{zgm} - p_{zgm}) \cdot y^D_{tzgm}}
{\forall t \in T, z \in Z, g \in G_z}
\\
&\eqcond
{o_{1zh} = v_{0h}}
{\forall z \in Z, h \in H_z}
\\
&\eqcond
{o_{(|T|+1)zh} = v_{(|T|+1)h}}
{\forall z \in Z, h \in H_z}
\\
&\eqcond
{o_{tzh} + n_{th} + \eta_{h} \cdot m_{tzh} =
o_{(t+1)zh} + s_{tzh} + l_{tzh}}
{\forall t \in T, z \in Z, h \in H_z}
\end{align}
\end{subequations}
\end{document}
有一个可选参数\eqcond
;使用\eqcond[6em]{...}{...}
可以减小框的宽度。使用\eqcond[0em]
可以得到完整宽度(方程式编号将被推到线下方)。
我使用了,这比篡改和geometry
要好;该选项只是为了显示边距。\hoffset
\voffset
showframe
还可以添加对超满行的检查。
答案4
另一种解决方案是仅在必要时将量词放在下一行(无编号)。flalign
根据量词的对齐方式,可以通过两种方式在环境中完成此操作。我借此机会抑制了 sigma 后面多余的空格,因为下标过大。
\documentclass[a4,11pt,reqno,twoside, openright]{article}
\usepackage[utf8x]{inputenc}
\usepackage{graphicx}
\usepackage{mathtools}
\usepackage{amsfonts}
\usepackage{amssymb}
\usepackage[textwidth = 14cm, nomarginpar, showframe]{geometry}%
\allowdisplaybreaks
\begin{document}
\begin{subequations}
\begin{flalign}
\hspace{4em} & & y^D_{tzgm} & ≤ y_{tzgm} &\forall t \in T, z &\in Z, g \in G_z, m \in \overline{M}_{zg} \\%
& & x_{tzg} &\leq \mathrlap{\sum_{\mathclap{m \in M_{zg}}} P_{zgm} · y_{tzgm} + \sum_{\mathclap{m \in \bar M_{zg}}} (P^D_{zgm} - P_{zgm}) · y^D_{tzgm}}\\[-12pt]
\notag & & & & & \forall t \in T, z \in Z, g \in G_z \\
& & x_{tzg} & \geq \mathrlap{\sum_{\mathclap{m \in M_{zg}}} p_{zgm} · y_{tzgm} + \sum_{\mathclap{m \in \bar M_{zg}}} (p^D_{zgm} - p_{zgm}) · y^D_{tzgm}}\\[-12pt]
\notag & & & & &\forall t \in T, z \in Z, g \in G_z \\
& & o_{1zh} & = v_{0h} & & \forall z \in Z, h \in H_z \\
& & o_{(|T|+1)zh} & = v_{(|T|+1)h} & & \forall z \in Z, h\in H_z \\
& & \mathllap{o_{tzh} + n_{th} + η_{h} · m_{tzh}} & =\mathrlap{ o_{(t+1)zh} + s_{tzh} + l_{tzh} } & & \forall t \in T, z \in Z, h \in H_z
\end{flalign}
\end{subequations}
\begin{subequations}
\begin{flalign}
& & y^D_{tzgm} & ≤ y_{tzgm} & \hspace{8em}&\ \mathllap{\forall t \in T, z \in Z, g \in G_z, m \in \overline{M}_{zg}} \\%
& & x_{tzg} &\leq \mathrlap{\sum_{\mathclap{m \in M_{zg}}} P_{zgm} · y_{tzgm} + \sum_{\mathclap{m \in \bar M_{zg}}} (P^D_{zgm} - P_{zgm}) · y^D_{tzgm}}\\[-12pt]
\notag & & & & & \mathllap{\forall t \in T, z \in Z, g \in G_z} \\
& & x_{tzg} & \geq \mathrlap{\sum_{\mathclap{m \in M_{zg}}} p_{zgm} · y_{tzgm} + \sum_{\mathclap{m \in \bar M_{zg}}} (p^D_{zgm} - p_{zgm}) · y^D_{tzgm}}\\[-12pt]
\notag & & & & & \mathllap{\forall t \in T, z \in Z, g \in G_z} \\
& & o_{1zh} & = v_{0h} & & \mathllap{∀z \in Z, h \in H_z} \\
& & o_{(|T|+1)zh} & = v_{(|T|+1)h} & & \mathllap{\forall z \in Z, h \in H_z} \\
& & \mathllap{o_{tzh} + n_{th} + η_{h} · m_{tzh}} & =\mathrlap{ o_{(t+1)zh} + s_{tzh} + l_{tzh} } & & \mathllap{\forall t \in T, z \in Z, h \in H_z}
\end{flalign}
\end{subequations}
\end{document}