在左侧对线性规划进行编号

在左侧对线性规划进行编号

我想编写一个线性程序,像通常一样在右侧编号,但在左侧也有一个数字。它将更像是一个标签而不是数字,因为我希望它有字母 (P) 或任何其他类型的标签。我已经编写了一些代码,只是我不知道如何在左侧添加 (P) 标签。我该怎么做?

这是代码:

\begin{equation}
\label{lp:primal}
\begin{array}{ll@{}ll}
\text{minimize}  & \displaystyle\sum\limits_{j=1}^{n} &c_{j}x_{j} &\\
\text{subject to}& \displaystyle\sum\limits_{j=1}^{n} &a_{ij}x_{j} \geq b_{i}, &i=1 ,..., m,\\
                 &                                    &x_{j} \geq 0, &j=1 ,..., n.
\end{array}
\end{equation}

它看起来应该是这样的: 在此处输入图片描述

答案1

为了定位左侧标签,我使用了一些zref魔法来自我想将下一行缩进指定的位置,因此解决方案需要至少两次编译才能使引用稳定下来:

在此处输入图片描述

\documentclass{article}
\usepackage{amsmath,xparse,zref-savepos}
\makeatletter
% Some ideas taken from https://tex.stackexchange.com/a/69076/5764
\@ifundefined{zsaveposx}{\let\zsaveposx\zsavepos}{}
\newcounter{hposcnt}
\renewcommand*{\thehposcnt}{hpos\number\value{hposcnt}}
\NewDocumentCommand{\lplabel}{o m}{%
  \stepcounter{hposcnt}%
  \zsaveposx{\thehposcnt l}%
  \zref@refused{\thehposcnt l}%
  \zref@refused{hpos0l}%
  \makebox[0pt][r]{\makebox[\dimexpr\zposx{\thehposcnt l}sp-\zposx{hpos0l}sp][l]{#2}}%
  \IfNoValueF{#1}
    {\def\@currentlabel{#2}\ltx@label{#1}}
}
\makeatother
\AtBeginDocument{\zsaveposx{hpos0l}}

\begin{document}

Consider the linear program~\ref{lp:primal} give by
\begin{alignat}{2}
                          \text{minimize}   \quad \sum_{j=1}^n c_{j}x_{j}  &           & \quad & \nonumber \\
  \lplabel[lp:primal]{(P)}\text{subject to} \quad \sum_{j=1}^n a_{ij}x_{j} & \geq b_i, & \quad & i = 1,\dots,m, \\
                                                                     x_{j} & \geq 0,   & \quad & j = 1,\dots,n.
\end{alignat}

\end{document}

上面的例子提供了根据左文本块边界\lplabel[<label>]{<stuff>}进行打印的功能<stuff>,并且可以被引用\ref{<label>}(如果提供了第一个可选参数)。


这是一个柔和的版本,它将 LP 标签设置到其放置位置的左侧,距离为2em

在此处输入图片描述

\documentclass{article}
\usepackage{amsmath,xparse}
\makeatletter
\NewDocumentCommand{\lplabel}{o m}{%
  \makebox[0pt][r]{#2\hspace*{2em}}%
  \IfNoValueF{#1}
    {\def\@currentlabel{#2}\ltx@label{#1}}
}
\makeatother

\begin{document}

Consider the linear program~\ref{lp:primal} give by
\begin{alignat}{2}
                          \text{minimize}   \quad \sum_{j=1}^n c_{j}x_{j}  &           & \quad & \nonumber \\
  \lplabel[lp:primal]{(P)}\text{subject to} \quad \sum_{j=1}^n a_{ij}x_{j} & \geq b_i, & \quad & i = 1,\dots,m, \\
                                                                     x_{j} & \geq 0,   & \quad & j = 1,\dots,n.
\end{alignat}

\end{document}

showframe提供左/右边界。

答案2

另一个解决方案不需要两次编译。它只是\hbox算术\vbox

\documentclass{article}

\usepackage{amsmath}
\newdimen\prevdp
\def\leftlabel#1{\noalign{\prevdp=\prevdepth
   \kern-\prevdp\nointerlineskip\vbox to0pt{\vss\hbox{#1}}\kern\prevdp}}

\begin{document}

\noindent Consider the linear program~(P) given by
\begin{alignat}{2}
     \text{minimize}   \quad \sum_{j=1}^n c_{j}x_{j}  & & \quad & \nonumber \\
     \text{subject to} \quad \sum_{j=1}^n a_{ij}x_{j} &\geq b_i, & \quad & i = 1,\dots,m, \\
  \leftlabel{(P)}  
                                                x_{j} &\geq 0,   & \quad & j = 1,\dots,n.
\end{alignat}    
\end{document}

相关内容