Сделайте так, чтобы выровненные уравнения изменяли выравнивание, чтобы избежать номеров уравнений на новой строке

Сделайте так, чтобы выровненные уравнения изменяли выравнивание, чтобы избежать номеров уравнений на новой строке

Мне нужно написать математическую программную модель, состоящую из нескольких ограничений. Ограничения представлены в виде строк из двух столбцов: первый столбец — это уравнение, а второй — его область определения, например

x_i > l_i & \forall i \in S

Но обе колонки могут быть довольно длинными, поэтому, если, с одной стороны, было бы предпочтительнее выровнять их по горизонтали каким-либо образом, с другой стороны, колонки могут оказаться разделенными по вертикали или напечатанными поверх других элементов страницы.

Тогда я подумал, что приличным решением было бы использовать одну среду align-like, чтобы каждый первый столбец был выровнен по отношению к другим, а каждый второй столбец также был выровнен по отношению к другим. Однако, если на строке не осталось места для экв. числа, то я бы хотел, чтобы второй столбец, т. е. домен, был выровнен по правому краю, чтобы заполнить пространство после первого столбца и избежать печати экв. числа на новой строке.

Рассмотрим следующее

\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двумя способами, в зависимости от выравнивания квантификаторов. Я воспользовался возможностью, чтобы подавить лишнее пространство после сигмы из-за сверхбольших нижних индексов.

        \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} 

введите описание изображения здесь

Связанный контент