我想用传统方式来表述线性规划问题。以下代码
\documentclass[11pt]{article}
\usepackage[utf8]{inputenc}
\usepackage{setspace}
\usepackage{multirow}
\usepackage{amsmath}
\begin{document}
\[\setstretch{1.8}
(LP)
\begin{cases}
\begin{split}
\max \qquad &\sum_{\{i|(i,e)\in\mathcal{A}\}} x_{i,e}\\ \\
\text{ subject to}\qquad &\sum_{\{i|(i,k)\in\mathcal{A}\}} x_{i,k} = \sum_{\{j|(k,j)\in\mathcal{A}\}} x_{k,j} & \forall k\in(\mathcal{N}\setminus\{s,e\})\\
&\sum_{\{j|(s,j)\in\mathcal{A}\}} x_{s,j} = \sum_{\{i|(i,e)\in\mathcal{A}\}} x_{i,e}\\
&0 \le x_{i,j} \le b_{i,j} &\raggedleft \forall(i,j)\in\mathcal{A}
\end{split}
\end{cases}
\]
\end{document}
生产
有没有办法让\forall
量词左对齐而不是右对齐?也就是说,我希望它们按第一个字符对齐,而不是按最后一个字符对齐。
答案1
和array
:
\documentclass[11pt]{article}
\usepackage{amsmath}
\usepackage{array}
\begin{document}
\[\setlength\arraycolsep{1pt}
\renewcommand\arraystretch{1.8}
(LP)\left\{
\begin{array}{r@{\qquad}c>{\displaystyle}r>{\displaystyle}ll}
\max
&&\sum_{\{i|(i,e)\in\mathcal{A}\}} x_{i,e} & & \\[5ex]
\text{subject to}
&&\sum_{\{i|(i,k)\in\mathcal{A}\}} x_{i,k}
& = \sum_{\{j|(k,j)\in\mathcal{A}\}} x_{k,j}
&\quad \forall k\in(\mathcal{N}\setminus\{s,e\})\\
&&\sum_{\{j|(s,j)\in\mathcal{A}\}} x_{s,j}
& = \sum_{\{i|(i,e)\in\mathcal{A}\}} x_{i,e} & \\
&&0 \le x_{i,j} \le b_{i,j}
& &\quad \forall(i,j)\in\mathcal{A}
\end{array}
\right.
\]
\end{document}
使用mathrlap
该包mathtools
您可以获得:
\documentclass[11pt]{article}
\usepackage{mathtools}
\usepackage{array}
\begin{document}
\[\setlength\arraycolsep{1pt}
\renewcommand\arraystretch{1.8}
(LP)\left\{
\begin{array}{r@{\quad}c>{\displaystyle}r>{\displaystyle}ll}
\max
&&\sum_{\{i|(i,e)\mathrlap{\in\mathcal{A}\}}} x_{i,e} & & \\[5ex]
\text{subject to}
&&\sum_{\{i|(i,k)\mathrlap{\in\mathcal{A}\}}} x_{i,k}
& = \sum_{\{j|(k,j)\mathrlap{\in\mathcal{A}\}}} x_{k,j}
&\quad \forall k\in(\mathcal{N}\setminus\{s,e\})\\
&&\sum_{\{j|(s,j)\mathrlap{\in\mathcal{A}\}}} x_{s,j}
& = \sum_{\{i|(i,e)\mathrlap{\in\mathcal{A}\}}} x_{i,e} & \\
&& 0 \le x_{i,j} \le b_{i,j}
& & \quad \forall(i,j)\in\mathcal{A}
\end{array}
\right.
\]
\end{document}
答案2
我将向你展示一个避免滥用的技巧setspace
。
环境aligned
将行间距增加一个称为 的尺寸jot
。其默认值为 3pt,但可以将其设置为其他值。
\documentclass[11pt]{article}
\usepackage{amsmath}
\begin{document}
\[
\setlength{\jot}{1.5ex} % some more vertical space
(LP)
\begin{cases}
\begin{aligned}
\max \quad &\! \sum_{\{i|(i,e)\in\mathcal{A}\}} x_{i,e}\\[2ex]
\text{ subject to}\quad
&\! \sum_{\{i\mid(i,k)\in\mathcal{A}\}} x_{i,k} =
\sum_{\{j\mid(k,j)\in\mathcal{A}\}} x_{k,j}
&& \forall k\in(\mathcal{N}\setminus\{s,e\})\\
&\! \sum_{\{j\mid(s,j)\in\mathcal{A}\}} x_{s,j} =
\sum_{\{i\mid(i,e)\in\mathcal{A}\}} x_{i,e}\\
& 0 \le x_{i,j} \le b_{i,j}
&& \forall(i,j)\in\mathcal{A}
\end{aligned}
\end{cases}
\]
\end{document}
一些注释。
竖线应该被称为\mid
,这是一个关系符号;在当前情况下,输出是相同的,但使用正确的语义很重要。
&
和之间\sum
应该有一个负的细空格,因为在偶数列中amsmath
隐式添加{}
会导致在后面跟着运算符和时插入一个细空格,而在这种特殊情况下我们并不想要它。
答案3
这种对齐方式怎么样alignedat
?
\documentclass[11pt]{article}
\usepackage[utf8]{inputenc}
\usepackage{setspace}
\usepackage{multirow}
\usepackage{mathtools}
\begin{document}
\[ \setstretch{1.8}
(LP)
\begin{cases}
\begin{alignedat}{2}
\max \quad\smashoperator[r]{\sum_{\{i\mid (i,e)\in\mathcal{A}\}}} x_{i,e} & \phantom{ =}\\[1ex]%\\
\text{ subject to} \quad\smashoperator[r]{\sum_{\{i\mid (i,k)\in\mathcal{A}\}}} x_{i,k} & = \smashoperator{\sum_{\{j\mid (k,j)\in\mathcal{A}\}}} x_{k,j} &\qquad & \forall k\in(\mathcal{N}\setminus\{s,e\})\\
\smashoperator[r]{\sum_{\{j\mid (s,j)\in\mathcal{A}\}}} x_{s,j} & = \smashoperator{\sum_{\{i\mid (i,e)\in\mathcal{A}\}}} x_{i,e}\\
0 \le x_{i,j} & \le b_{i,j} & & \forall(i,j)\in\mathcal{A}
\end{alignedat}
\end{cases}
\]
\end{document}