使用 \systeme 包在 LaTeX 中编写线性程序

使用 \systeme 包在 LaTeX 中编写线性程序

我正在尝试使用 LaTeX 来呈现一些较长的线性规划,以解决优化问题。使用该\systeme软件包可以让我自动将变量和不等式相互对齐,但我无论如何也想不出如何正确地将文本格式化到左侧。理想情况下,文本“min”应直接位于目标函数(第一行)的左侧,文本“st”应直接位于第一个约束(第一个不等式)的左侧。下面是一些示例代码。

如果有人能建议如何将文本“st”与数组中其框的顶部对齐,我将不胜感激。谢谢!

\documentclass[12pt]{article}  
\usepackage{systeme}

\begin{document}

\\[  
\begin{array}{lc}  
min & -0.3x_1-0.7x_2-1.1x_3+0.08x_4-0.32x_5-0.72x_6+1.2x_7+0.8x_8 \\  
s.t. &  
\sysdelim..  
\systeme[][:]{0.1x_1 - 0.2x_2 \geq 0 :  
            0.25x_4 - 0.05x_5 \geq 0 :  
            -0.4x_1 - 0.4x_2 + 0.6x_3 \geq 0 :  
            -0.2x_4 - 0.2x_5 +0.8x_6 \geq 0 :  
            -x_3 - x_6 +0.6x_7 + 0.3x_8 \geq 0 :  
            -x_1-x_2-x_3-x_4-x_5-x_6 \geq -3000 :  
            x_1+x_2+x_3 \geq 1000 :  
            -x_1-x_2-x_3 \geq -1500 :  
            0.9x_4+0.9x_5+0.9x_6 \geq 1000 :  
            -0.9x_4-0.9x_5-0.9x_6 \geq -2000 :  
            -x_7-x_8 \geq -2000}\\  
& \vec{x} \geq \vec{0}  
\end{array}  
\\]  

\end{document}  

答案1

\systeme没有规定根据上下文改变垂直对齐方式:它总是使用\vcenter

您可以(本地或全局)修补它以使用\vtop(用于顶部对齐)或\vbox(用于底部对齐)。

\documentclass{article}
\usepackage{amsmath}
\usepackage{systeme}
\usepackage{xpatch}

\makeatletter
\newcommand\patchsysteme[1]{%
  \xpatchcmd{\SYS@systeme@iii}{\vcenter}{#1}{}{}%
}
\makeatother

\begin{document}

\[  
\begin{array}{lc}
\min & -0.3x_1-0.7x_2-1.1x_3+0.08x_4-0.32x_5-0.72x_6+1.2x_7+0.8x_8 \\[2ex]
\text{s.t.} &
  \patchsysteme{\vtop}
  \sysdelim..  
  \systeme[][:]{0.1x_1 - 0.2x_2 \geq 0 :  
            0.25x_4 - 0.05x_5 \geq 0 :  
            -0.4x_1 - 0.4x_2 + 0.6x_3 \geq 0 :  
            -0.2x_4 - 0.2x_5 +0.8x_6 \geq 0 :  
            -x_3 - x_6 +0.6x_7 + 0.3x_8 \geq 0 :  
            -x_1-x_2-x_3-x_4-x_5-x_6 \geq -3000 :  
            x_1+x_2+x_3 \geq 1000 :  
            -x_1-x_2-x_3 \geq -1500 :  
            0.9x_4+0.9x_5+0.9x_6 \geq 1000 :  
            -0.9x_4-0.9x_5-0.9x_6 \geq -2000 :  
            -x_7-x_8 \geq -2000}\\
& \vec{x} \geq \vec{0}
\end{array}  
\]  

\end{document}  

在此处输入图片描述

我会使用l第二列对齐。


如果您只需要顶部对齐,这里有一个\systeme*提供它的定义,而未装饰的\systeme继续进行中心对齐。

\documentclass{article}
\usepackage{amsmath}
\usepackage{systeme}
\usepackage{xpatch}

\makeatletter
\xpatchcmd{\SYS@systeme@iii}{\vcenter}{\systeme@center@top}{}{}%
\let\systeme@original\systeme
\let\systeme@center@top\vcenter
\renewcommand{\systeme}{%
  \begingroup
  \@ifstar{\systeme@top}{\systeme@make}%
}
\newcommand{\systeme@top}{%
  \let\systeme@center@top\vtop
  \systeme@make
}
\def\systeme@make#1#{%
  \def\systeme@options{#1}%
  \systeme@@make
}
\def\systeme@@make#1{%
  \expandafter\systeme@original\systeme@options{#1}%
  \endgroup
}
\makeatother

\begin{document}

\[  
\begin{array}{lc}
\min & -0.3x_1-0.7x_2-1.1x_3+0.08x_4-0.32x_5-0.72x_6+1.2x_7+0.8x_8 \\[2ex]
\text{s.t.} &
  \sysdelim..  
  \systeme*[][:]{0.1x_1 - 0.2x_2 \geq 0 :  
            0.25x_4 - 0.05x_5 \geq 0 :  
            -0.4x_1 - 0.4x_2 + 0.6x_3 \geq 0 :  
            -0.2x_4 - 0.2x_5 +0.8x_6 \geq 0 :  
            -x_3 - x_6 +0.6x_7 + 0.3x_8 \geq 0 :  
            -x_1-x_2-x_3-x_4-x_5-x_6 \geq -3000 :  
            x_1+x_2+x_3 \geq 1000 :  
            -x_1-x_2-x_3 \geq -1500 :  
            0.9x_4+0.9x_5+0.9x_6 \geq 1000 :  
            -0.9x_4-0.9x_5-0.9x_6 \geq -2000 :  
            -x_7-x_8 \geq -2000}\\
& \vec{x} \geq \vec{0}
\end{array}  
\]  

\end{document}  

相关内容