我想编写一个线性程序,像通常一样在右侧编号,但在左侧也有一个数字。它将更像是一个标签而不是数字,因为我希望它有字母 (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}