我想制定一个线性规划,但我找不到我想要的。它应该类似于此图:
主要区别在于我想要在右侧自动编号(像等式一样)并在左侧贴上标签,即(LP)
我需要至少 5 列(+编号)
我应该从哪里开始array
?equation
,,alignat
或align
?如何实现这一点?
最终结果 这是最终的代码(Werner 代码的修改版本)。我写了一些新命令,现在每个人都可以使用这些简单的命令,而不必关心正确的对齐方式。谢谢 Werner。
\documentclass{article}
\usepackage[a4paper,margin=1in]{geometry}
\usepackage{mathtools,zref-savepos}
% Linear Programm Tex Example
\newcommand{\objective}[2] { & \text{#1} \quad \mathrlap{#2}}
% includes s.t. in front
\newcommand{\stconstraint}[4] { & \text{s.t.} & #1 & \quad #2 \quad #3 && \quad #4}
\newcommand{\constraint}[4] { & & #1 & \quad #2 \quad #3 && \quad #4}
\newcommand{\lpnamereset}{\noindent\zsavepos{text-left-margin}}
\newcommand{\lpnamebegin}{\zsavepos{top-lp}}
\newcommand{\lpnameend}[1]{ \zsavepos{bottom-lp}
\raisebox{0.5\dimexpr\zposy{top-lp}sp-\zposy{bottom-lp}sp}[0pt][0pt]{%
\makebox[0pt][r]{\rlap{(#1)}\hspace*{\dimexpr\zposx{bottom-lp}sp-\zposx{text-left-margin}sp}}}}
% End Linear Programm Tex Example
\begin{document}
\setlength{\jot}{10pt}
\lpnamereset
\begin{alignat}{4}
\lpnamebegin
\objective{min}{\sum_{a \in A} k_a u_a + \sum_{r \in R} \sum_{a \in A} f_a^r y_a^r} \\
\stconstraint{\smashoperator{\sum_{a \in \delta_i^+}} y_a^r - \smashoperator{\sum_{a \in \delta_i^-}} y_a^r}{=}{\left\{\begin{array}{@{}rl@{}}
1, & \text{falls $i = O^r$} \\
-1, & \text{falls $i = D^r$} \\
0, & \text{sonst} \\
\end{array}\right.}{(\forall r \in R)(\forall i \in V)} \\
\constraint{y_a^r}{\leq}{ u_a}{ (\forall r \in R)(\forall a \in A)} \\
\constraint{u_a}{\in}{\{0,1\}}{(\forall a \in A)} \\
\constraint{y_a^r}{\in}{[0,1}{(\forall r \in R)(\forall a \in A)}
\lpnameend{LP}
\end{alignat}
\end{document}
答案1
线性规划的设置很简单,使用。如果您还想包含 提供的自动编号方程式样式,则 左侧alignat
的放置会更困难。为此,我使用了中的模块(LP)
alignat
savepos
zref
存储某些元素的水平位置,然后将标签移动(LP)
到位;水平靠左边距(用作text-left-margin
参考);垂直位于第一行/top-lp
和最后一行/之间的中间位置bottom-lp
):
\documentclass{article}
\usepackage[a4paper,margin=1in]{geometry}
\usepackage{mathtools,zref-savepos}
\begin{document}
\noindent\zsavepos{text-left-margin}%
Here is some text.
%\setlength{\jot}{10pt}
\begin{alignat}{4}
& \zsavepos{top-lp}\text{min} \quad \mathrlap{\sum_{a \in A} k_a u_a + \sum_{r \in R} \sum_{a \in A} f_a^r y_a^r} \\
& \text{s.t.} \quad & \smashoperator{\sum_{a \in \delta_i^+}} y_a^r - \smashoperator{\sum_{a \in \delta_i^-}} y_a^r
&= \left\{\begin{array}{@{}rl@{}}
1, & \text{falls $i = O^r$} \\
-1, & \text{falls $i = D^r$} \\
0, & \text{sonst}
\end{array}\right. & \quad & (\forall r \in R)(\forall i \in V) \\
& & y_a^r &\leq u_a && (\forall r \in R)(\forall a \in A) \\
& & u_a &\in \{0,1\} && (\forall a \in A) \\
& & y_a^r &\in [0,1] && (\forall r \in R)(\forall a \in A)\zsavepos{bottom-lp}
\raisebox{0.5\dimexpr\zposy{top-lp}sp-\zposy{bottom-lp}sp}[0pt][0pt]{%
\makebox[0pt][r]{\rlap{(LP)}\hspace*{\dimexpr\zposx{bottom-lp}sp-\zposx{text-left-margin}sp}}}
\end{alignat}
\end{document}
由于zref
使用 (La)TeX 的\label
-\ref
系统,因此第一次运行时至少需要编译两次。此后,只要有完整的.aux
,一切就应该顺利运行。
答案2
答案3
systeme 包提供了一种编写显式方程组(或不等式)的方法。它的文档是法语的,如何完成一些工作远非直观。但它工作得很好。尝试:
\begin{equation}
\sysdelim.. % No '{' or other decorations
\systeme[x_1x_2s_1s_2s_3z]{ % Order for the variables
x_1 + x_2 + s_1 = \phantom{0}9,
x_1 + 3 x_2 + s_2 = 12,
- x_1 + 2 x_2 + s_3 = \phantom{0}2,
- x_1 - 2 x_2 + z = \phantom{0}0
}