将以下 58 个方程式输入到 LaTeX 中的最佳方法是什么?

将以下 58 个方程式输入到 LaTeX 中的最佳方法是什么?

对于应用数学设置,我需要将多个不等式约束写入 LaTeX 报告中,它们都采用以下形式

x_{i} + x_{j} \ge 1.

我在 Excel 表中将“i”和“j”输入为平行列。我想知道是否有办法循环遍历这些值来生成 58 个方程式,这将节省大量输入(并且如果我们需要 500 个方程式,它也会真正使其具有可扩展性)?

例如: 在此处输入图片描述

答案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

使用 ExcelCONCAT函数

在 Excel 中执行此操作可能最容易,尤其是一次性操作时。Excel 有几种文本处理函数,我经常发现这是一种生成几行相似文本或代码的非常方便的方法。 CONCAT(text1,text2,...)将一堆文本和数据值连接成一个文本输出。

如果列A包含你的值,在单元格中输入以下内容C1

=CONCAT("x_{", A1, "} + x{", B1, "} \ge 1.")

然后按 Enter。然后您可以将该函数复制并粘贴到列的下方C并得到您想要的结果。然后您可以选择列中的所有输出单元格C并粘贴到您的文本编辑器中。

在此处输入图片描述

答案4

我一直认为,执行此类循环的最简单方法是/foreach在 PGF ( \usepackage{pgffor}) 中构造。最简单的使用方法如下:

\foreach \i/\j in {1/2, 1/3, 2/39} {$x_{\i} + x_{\j} \ge 1$ \quad}

它将所有内容放在一行上,并以\quads 分隔。

如果您想要格式化它,您可能需要将大于号对齐,例如在对齐环境中。不幸的是,仅\foreach在对齐中执行循环会中断,因为它无法\\正确处理换行符。相反,我们可以使用循环\foreach来构建宏,然后在对齐环境中包装该宏。下面(示例 2)我使用\xapptoetoolbox 包以这种方式构建\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}

其结果为: 乳胶渲染

相关内容