[Tex/LaTex] Labeled linear program with labeled equations and wide objective function

alignnumbering

Can anybody help me stating a linear program in latex with the following requirements?

  1. The LP itself shall be numbered on the left-hand side (although in the remaining document the equations' labels are on the rhs), with a certain tag, e.g. "(P)" which should be associated with an equation label.

  2. The LP part consists of 5 columns:

    • for "max" and for "subject to"
    • for the lhs of the constraints
    • for the relations $\leq$, etc.
    • for the rhs of the constraints
    • for quantification (e.g. $\forall v \in V$)
  3. The objective function (which does not have a lhs/rhs) may be wide and should span over the three middle columns.

  4. Every row should itself have an equation label which is right-justified.

So far I used an equation environment together with the array environment and the multicolumn command to get the layout right. But the constraint labels don't work here. On the other hand, using align doesn't seem to help since even the wide objective didn't work very nicely (I used \mathclap).

The following picture shows how it should look like

this http://www.math.uni-magdeburg.de/~walter/downloads/latex-lp-labels.png

Here is a MWE rendering the centered part – but I have no clue how to add the single equation labels nor the left-aligned equation label given that other equations are right-aligned.

\documentclass{article}
\usepackage{amsmath}
\begin{document}
\begin{equation*}
  \begin{array}{lrcll}
    \max 
    & \multicolumn{4}{l}{\sum\limits_{v \in V} x_v + \sum\limits_{e \in E} y_e + 10000\gamma } \\
    \text{s.t.}
    & x_v + x_w & \geq & 0 & \forall \{v,w\} \in E \\
    & y_e & \geq & 0 & \forall e \in E \\
    & y(\delta(U)) & \geq & \frac{1}{2}(|U|-1) & \forall U \subseteq V
  \end{array}
\end{equation*}
\end{document}

Best Answer

I've taken some liberties in interpreting what you're trying to accomplish here. For example, I assume that you will manually create the tag names for the LP blocks. Also, I think my solution lacks a certain elegance: in particular, each such block has to be created separately. I don't really like that.

Here's the general idea: create two adjacent boxes centered on the baseline with one containing a dummy equation to create the label for the entire block. Spacing after the boxes is a bit wonky. So, I add ~ after the last flalign environment. (Short coming: you also have to manually adjust the width of the first parbox to get the label to be positioned correctly.)

You seemed to want the first line to somehow align with the LP. I've got two solutions to that. The first puts the first line into a box of zero width. (Short coming: you have to re-enter math mode within this box.) The second puts this first line in its own flalign environment. (Short coming: you have to adjust the vertical spacing between the two environments.)

\documentclass{article}
\usepackage{amsmath,calc}
\newlength{\LPlhbox}
\begin{document}


\settowidth{\LPlhbox}{(P.1)}%
\noindent%
\parbox{\LPlhbox}{\begin{align}
               \tag{P.1}\label{My first LP Block}
               \end{align}}%
\hspace*{\fill}%
\begin{minipage}{\linewidth-2cm}
    \begin{flalign}\notag
     & \makebox[0pt][l]{$\displaystyle{}\max \sum\limits_{v \in V} x_v + \sum\limits_{e \in E} y_e + 10000\gamma$} \\
    \label{this line can be referenced}
     & \text{s.t.} & x_v + x_w   & \geq  0                 && \forall \{v,w\} \in E && \\
     &             & y_3         & \geq 0                  && \forall e\in E        && \\
     &             & (\delta(U)) & \geq \frac{1}{2}(|U|-1) && \forall U \subseteq V
    \end{flalign}~
\end{minipage}

\settowidth{\LPlhbox}{(P.2)}%
\noindent%
\parbox{\LPlhbox}{\begin{align}
               \tag{P.2}\label{My second LP Block}
               \end{align}}%
\hspace*{\fill}%
\begin{minipage}{\linewidth-2cm}
   \begin{flalign}\notag
     \max \sum\limits_{v \in V} x_v + \sum\limits_{e \in E} y_e + 10000\gamma &&
   \end{flalign}
    \vspace{-1.5\baselineskip}
   \begin{flalign}
    & \text{s.t.} & x_v + x_w   & \geq  0                 && \forall \{v,w\} \in E && \\
    &             & y_3         & \geq 0                  && \forall e\in E        && \\
    &             & (\delta(U)) & \geq \frac{1}{2}(|U|-1) && \forall U \subseteq V
   \end{flalign}~
\end{minipage}

Notice that we can reference line~\ref{this line can be referenced}
and both block~\ref{My first LP Block} and block~\ref{My second LP Block}
\end{document}

What would be nice is if there were a commands \lefttag and \righttag to temporarily override document defaults.

You can also easily create a command to do the work of the left-hand box.

\newcommand{\LPblocktag}[2]{\settowidth{\LPlhbox}{(#1)}%
                            \parbox{\LPlhbox}{\begin{align}\tag{#1}#2\end{align}}%
                            \hspace*{\fill}}

I've written the second argument as I have because I don't want to assume you'll be referencing every such block.

So the first block above can be written as

\noindent%
\LPblocktag{P.3}{\label{My third LP Block}}%
\begin{minipage}{\linewidth-2cm}
    \begin{flalign}\notag
     & \makebox[0pt][l]{$\displaystyle{}\max \sum\limits_{v \in V} x_v + \sum\limits_{e \in E} y_e + 10000\gamma$} \\
    \label{this line can be referenced}
     & \text{s.t.} & x_v + x_w   & \geq  0                 && \forall \{v,w\} \in E && \\
     &             & y_3         & \geq 0                  && \forall e\in E        && \\
     &             & (\delta(U)) & \geq \frac{1}{2}(|U|-1) && \forall U \subseteq V
    \end{flalign}~
\end{minipage}

I can reference \ref{My third LP Block}

enter image description here

Related Question