有人能帮助我在乳胶中陈述一个满足以下要求的线性程序吗?
LP 本身应在左侧编号(尽管在其余文档中,方程式的标签在右侧),并带有特定标记,例如“(P)”,该标记应与方程式标签相关联。
LP部分由5列组成:
- 对于“最大”和“受制于”
- 对于约束的左侧
- 对于关系 $\leq$ 等
- 对于约束的右侧
- 用于量化(例如 $\forall v \in V$)
目标函数(没有 lhs/rhs)可能很宽,并且应该跨越中间三个列。
每一行本身都应该有一个右对齐的方程标签。
到目前为止,我结合使用了方程式环境、数组环境和多列命令来获得正确的布局。但约束标签在这里不起作用。另一方面,使用对齐似乎没有帮助,因为即使是宽目标也不太好用(我使用了 \mathclap)。
下图显示了它的样子
这个http://www.math.uni-magdeburg.de/~walter/downloads/latex-lp-labels.png
这是 MWE 渲染居中部分 - 但我不知道如何添加单个方程标签或左对齐方程标签,因为其他方程都是右对齐的。
\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}
答案1
我在解释您在此处尝试实现的目标时做了一些改动。例如,我假设您将手动创建 LP 块的标签名称。此外,我认为我的解决方案缺乏一定的优雅性:特别是,每个这样的块都必须单独创建。我真的不喜欢这样。
总体思路如下:创建两个以基线为中心的相邻框,其中一个包含虚拟方程,用于为整个块创建标签。框后的间距有点奇怪。因此,我~
在最后一个flalign
环境后添加。(缺点:您还必须手动调整第一个环境的宽度,parbox
以使标签正确定位。)
您似乎希望第一行以某种方式与 LP 对齐。我对此有两个解决方案。第一个将第一行放入零宽度的框中。(缺点:您必须在此框内重新进入数学模式。)第二个将第一行放在其自己的flalign
环境中。(缺点:您必须调整两个环境之间的垂直间距。)
\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}
如果有命令可以暂时覆盖文档默认值,那就太好\lefttag
了\righttag
。
您还可以轻松创建命令来执行左侧框的工作。
\newcommand{\LPblocktag}[2]{\settowidth{\LPlhbox}{(#1)}%
\parbox{\LPlhbox}{\begin{align}\tag{#1}#2\end{align}}%
\hspace*{\fill}}
我已经写了第二个参数,因为我不想假设你会引用每个这样的块。
因此上面的第一个块可以写成
\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}
答案2
我已经修改了上述内容,以创建一个新的环境,该环境将围绕数学方程式环境。我保留了上面的旧解决方案,因为在这里我使用xkeyval
包来允许用户将参数传递给新环境,但也因为此解决方案的方法风格截然不同。我认为这种方法更加通用,并建议进行其他可能有用的修改。
此外,我还采纳了 cmhughes 建议的用法mathtools
。最后,正如所写,此环境似乎需要明确命名左侧框的标签。似乎应该有某种默认方法。但是,我也会将其留给其他人去构思。
这是我重新设想的解决方案:
\documentclass{article}
\usepackage{amsmath,mathtools,calc}
%..%
\usepackage{xkeyval}
\makeatletter
\newlength{\LP@lh@boxwidth} %% width of first box, set automatically within environment
\setlength{\LP@lh@boxwidth}{0pt}
\newlength{\LP@lh@boxsep} %% distance between two boxes. Default is `2em`. Can be overridden by using key `boxsep=<length>`
\setlength{\LP@lh@boxsep}{2em}
\newcommand{\LP@lh@content}{}
\newcommand{\LP@lh@tagname}{} %% set by user using key `tagname=<name of tag>`
\define@key[LP]{lhbox}{boxsep}[2em]{\setlength{\LP@lh@boxsep}{#1}}
\define@key[LP]{lhbox}{content}[]{\renewcommand{\LP@lh@content}{#1}}
\define@key[LP]{lhbox}{tagname}[]{\renewcommand{\LP@lh@tagname}{#1}}
\newenvironment{tagblock}[1][]%
{\setkeys[LP]{lhbox}{tagname,boxsep,#1}\relax%
\settowidth{\LP@lh@boxwidth}{\tagform@\LP@lh@tagname}%
\noindent%
\parbox{\LP@lh@boxwidth}{\begin{align}\tag{\LP@lh@tagname}\LP@lh@content\end{align}}%
\hspace*{\LP@lh@boxsep}%
\begin{minipage}{\linewidth-\LP@lh@boxwidth-\LP@lh@boxsep}}%
{~\end{minipage}}
\makeatother
%..%
\begin{document}
\begin{tagblock}[tagname={P.1},content={\label{My first LP Block}}]
\begin{flalign}\notag
& \mathrlap{\max \sum\limits_{v \in V} x_v + \sum\limits_{e \in E} y_e + 10000\gamma} \\
\label{eq01:first_line}
& \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{tagblock}
\begin{tagblock}[tagname={P.2},content=\label{My second LP Block}]
\begin{flalign}\notag
& \mathrlap{\max \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 && \\
\label{eq02:second_line}
& & y_3 & \geq 0 && \forall e\in E && \\
& & (\delta(U)) & \geq \frac{1}{2}(|U|-1) && \forall U \subseteq V
\end{flalign}
\end{tagblock}
Notice that we can reference line~\ref{eq01:first_line} and line~\ref{eq02:second_line}
and both block~\ref{My first LP Block} and block~\ref{My second LP Block}
\end{document}
答案3
我认为另一个答案会给你你想要的输出。
我的答案满足了您 4 个请求中的 3 个,但(P)
在左侧标记多余的部分比较棘手;我的代码只是演示了如何使用它alignat
来满足您的大部分需求。
\documentclass{article}
\usepackage{amsmath}
\begin{document}
\subsection*{Original}
\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*}
\subsection*{New}
\begin{alignat}{3}
\max & & \sum_{v \in V} x_v + & \sum_{e \in E} y_e + 10000\gamma & & \nonumber \\
\text{s.t.}\qquad & & 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{alignat}
\end{document}