Preciso escrever um modelo de programação matemática composto por diversas restrições. As restrições são representadas como linhas de duas colunas: a primeira coluna é a equação e a segunda é o seu domínio, por exemplo
x_i > l_i & \forall i \in S
Mas ambas as colunas podem ser bastante longas, então se por um lado seria preferível ter todas elas alinhadas horizontalmente de alguma forma, por outro as colunas podem acabar sendo divididas verticalmente ou impressas ultrapassando outros elementos da página.
Pensei então que uma solução decente seria usar um ambiente semelhante ao alinhamento, para que cada primeira coluna estivesse alinhada com as outras e cada segunda coluna estivesse alinhada com as outras também. No entanto, se não houver espaço para a eq. número for deixado na linha, então eu gostaria que a segunda coluna, ou seja, o domínio, fosse alinhada à direita para preencher o espaço após a primeira coluna para evitar a eq. número a ser impresso na nova linha.
Considere o seguinte
\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}
Como você pode ver, recebo todas as equações. número em uma nova linha porque a primeira desigualdade tem um domínio muito longo. Uma aproximação do resultado que eu gostaria, obtido adicionando espaço manualmente, é
\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}
Por outro lado, você acha que existem maneiras melhores de compor esses modelos?
TIA
Responder1
Acabei de colocar o rótulo da primeira linha em uma caixa de largura zero alinhada à direita.
\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}
Responder2
Como você realmente não deseja o alinhamento, você pode simplesmente usar gather
e separar as condições com cola de preenchimento, exceto conforme indicadoaquivocê normalmente não pode usar \hfill
em alinhamentos ams, então precisa ajustá-lo um pouco primeiro.
para manter o código baixo, isso redefine, gather
é claro que seria possível criar um novo ambiente baseado nisso, deixando o original gather
como estava.
\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}
Responder3
Você pode definir um comando específico para esta finalidade:
\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}
Existe um argumento opcional para \eqcond
; com \eqcond[6em]{...}{...}
você obtém largura reduzida da caixa. Com \eqcond[0em]
você obteria largura total (e o número da equação seria colocado abaixo da linha.
Eu usei geometry
, isso é melhor do que adulterar \hoffset
e \voffset
; a showframe
opção é apenas para mostrar as margens.
Também se pode adicionar uma verificação para uma linha excessivamente cheia.
Responder4
Outra solução consiste em colocar os quantificadores numa linha abaixo (sem numeração) apenas quando necessário. Isso pode ser feito com o flalign
ambiente de duas maneiras, de acordo com o alinhamento dos quantificadores. Aproveitei a oportunidade para suprimir espaços estranhos após o sigma, devido a subscritos extragrandes.
\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}