答案1
这是一种可能的实现;分隔符可以改变。
\documentclass{article}
\usepackage{amsmath,multicol}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\constraints}{omO{x}}
{
\IfValueTF{#1}{\begin{multicols}{#1}\centering}{\begin{center}}
\egreg_costraints:nn { #2 } { #3 }
\IfValueTF{#1}{\end{multicols}}{\end{center}}
}
\seq_new:N \l__egreg_constraints_seq
\cs_new_protected:Nn \egreg_costraints:nn
{
\seq_set_split:Nnn \l__egreg_constraints_seq { \\ } { #1 }
\seq_map_inline:Nn \l__egreg_constraints_seq
{
\__egreg_constraints_item:nn { ##1 } { #2 }
}
}
\cs_new_protected:Nn \__egreg_constraints_item:nn
{
\tl_if_blank:nF { #1 }
{
$#2\sb{\clist_item:nn { #1 } { 1 }} + #2\sb{\clist_item:nn { #1 } { 2 }}\ge1$ \\
}
}
\ExplSyntaxOff
\begin{document}
\constraints{
1,2 \\ 3,4 \\ 5,6
}
\constraints{
1,2 \\ 3,4 \\ 5,6
}[y]
\constraints[3]{
1,2 \\ 3,4 \\ 5,6 \\
1,2 \\ 3,4 \\ 5,6 \\
1,2 \\ 3,4 \\ 5,6 \\
1,2 \\ 3,4 \\ 5,6 \\
1,2 \\ 3,4 \\ 5,6 \\
1,2 \\ 3,4 \\ 5,6 \\
1,2 \\ 3,4 \\ 5,6 \\
1,2 \\ 3,4 \\ 5,6 \\
1,2 \\ 3,4 \\ 5,6 \\
}
\end{document}
答案2
您可以通过将 Excel 电子表格导出到逗号分隔文件(例如subscripts.csv
)并使用以下方式自动执行此作业:readarray
包裹。
平均能量损失
假设的内容subscripts.csv
是:
1,2
1,3
2,39
7,5
26,5
以下代码:
\documentclass{article}
\usepackage{readarray}
\usepackage{forloop}
\newcommand\constraint[2]{$x_{#1} + x_{#2} \ge 1$}
\begin{document}
\readarraysepchar{,}
\readdef{subscripts.csv}{\MyMacro}
\readarray\MyMacro\MyData[-,\ncols]
\newcounter{MyCounter}
\forloop{MyCounter}{1}{\value{MyCounter} < \MyDataROWS}
{
\constraint{\MyData[\theMyCounter,1]}{\MyData[\theMyCounter,2]}\par
}
\end{document}
渲染:
答案3
答案4
我一直认为,执行此类循环的最简单方法是/foreach
在 PGF ( \usepackage{pgffor}
) 中构造。最简单的使用方法如下:
\foreach \i/\j in {1/2, 1/3, 2/39} {$x_{\i} + x_{\j} \ge 1$ \quad}
它将所有内容放在一行上,并以\quad
s 分隔。
如果您想要格式化它,您可能需要将大于号对齐,例如在对齐环境中。不幸的是,仅\foreach
在对齐中执行循环会中断,因为它无法\\
正确处理换行符。相反,我们可以使用循环\foreach
来构建宏,然后在对齐环境中包装该宏。下面(示例 2)我使用\xappto
etoolbox 包以这种方式构建\constraintlist
宏。
通过在宏中构建内容,我们可以发挥创造力。在示例 3 中,我使用库pgfmath
仅\\
在每第三个约束(否则添加)后添加到宏中&
,这为我们提供了三列约束,所有约束都很好地对齐在大于号上。
代码如下:
\documentclass{article}
\usepackage{pgffor} % \foreach
\usepackage{amsmath} % align* environment
\usepackage{etoolbox} % \xappto and \gappto
\usepackage{pgfmath} % \pgfmathparse and \pgfmathresult
\begin{document}
Example 1:
\begin{center}
\foreach \i/\j in {
1/2,
1/3,
2/39,
2019/2020
}{$x_{\i} + x_{\j} \ge 1$ \\}
\end{center}
Example 2:
\def\constraintlist{}
\foreach \i/\j in {1/2, 1/3, 2/39, 2019/2020}{
\xappto\constraintlist{x_{\i} + x_{\j} &\ge 1 \noexpand\\}
}
\begin{align*}
\constraintlist
\end{align*}
Example 3:
\def\constraintlist{}
\foreach \i/\j [count = \index] in {1/2, 1/3, 2/39, 2019/2020, a/b, foo/bar}{
\xappto\constraintlist{x_{\i} + x_{\j} &\ge 1}
\pgfmathparse{mod(\index, 3)==0}
\ifnum\pgfmathresult=1
\gappto\constraintlist{\\}
\else
\gappto\constraintlist{&}
\fi
}
\begin{align*}
\constraintlist
\end{align*}
\end{document}