自动格式化具有多个条件的方程式

自动格式化具有多个条件的方程式

对于 Atom 包,我试图将 GAMS 模型产生的方程显示为 Latex 输出(类似于在用于常规 Latex 命令)。考虑以下 GAMS 方程:

Objf.. NetReturn
       =E=
       Sum((Pixel,CropRot,Mana)
         $DataPrd(Pixel,CropRot,Mana,"NReturn"),
       DataPrd(Pixel,CropRot,Mana,"NReturn") *
       CropProd(Pixel,CropRot,Mana))

    +  Sum((Pixel,CropRot,Mana,PolPrem)
         $(DataPrd(Pixel,CropRot,Mana,"NReturn") and
           PolData(Mana,PolPrem)),
       PolData(Mana,PolPrem) *
       CropProd(Pixel,CropRot,Mana))
          ;

来自gams2tex转换器,我得到以下输出: overflow

\begin{equation}
    NetReturn = \sum\limits_{Pixel,CropRot,Mana\thinspace \operatorname{if} \thinspace DataPrd_{Pixel,CropRot,Mana,\mathrm{NReturn}}  } \left( DataPrd_{Pixel,CropRot,Mana,\mathrm{NReturn}}  \cdot CropProd_{Pixel,CropRot,Mana} \right)  +  \sum\limits_{Pixel,CropRot,Mana,PolPrem\thinspace \operatorname{if} \thinspace DataPrd_{Pixel,CropRot,Mana,\mathrm{NReturn}}  and  PolData_{Mana,PolPrem}  } \left( PolData_{Mana,PolPrem}  \cdot CropProd_{Pixel,CropRot,Mana} \right)  \mspace{40mu}  
    \label{eq:Objf}
\end{equation}

此输出可以(并且必须)更改,因为它现在溢出了页面,不太可读。在 gams2tex 转换器中,输出是通过 Dust.js 模板从抽象语法树生成的。

{<equation} 
  {~n}
  {@getGamsSymbol data=structure field="desc" property=name/}
  {~n}{~n}
  \begin{~lb}equation{~rb}{~n}{~s}{~s}{~s}{~s}
      {+"{leftHand.type}" exp=leftHand setMode="index" /} 
      {operator|s} 
      {+"{rightHand.type}" exp=rightHand setMode="index" /} 
      \mspace{40mu}
      {?setsAndConditions.sets}{~n}{~s}{~s}{~s}{~s}\forall\thinspace{~lb}{+sets sets=setsAndConditions.sets conditions=setsAndConditions.conditions setMode="set" /}{~rb}{/setsAndConditions.sets}  
      {~n}{~s}{~s}{~s}{~s}
      \label{~lb}eq:{name}{~rb}{~n}
  \end{~lb}equation{~rb} {~n}{~n}{~n}
{/equation}

关于从 GAMS 转换而来的方程的一个主要问题是方程中的条件数量相对较多。我的第一个想法是使用 breqn 包在合适的地方自动分解方程。此外,我想去掉条件(forall 或 if),并将它们放在实际方程下方的单独表格中: breqn

\begin{dmath}
    NetReturn = \sum\limits_{Pixel,CropRot,Mana ^{1}} \left( DataPrd_{Pixel,CropRot,Mana,\mathrm{NReturn}}  \cdot CropProd_{Pixel,CropRot,Mana} \right)  +  \sum\limits_{Pixel,CropRot,Mana,PolPrem ^{2}} \left( PolData_{Mana,PolPrem}  \cdot CropProd_{Pixel,CropRot,Mana} \right)  
    \label{eq:Objf}
\end{dmath} 

where
\begin{align*}
1 &= \forall \ DataPrd_{Pixel,CropRot,Mana,\mathrm{NReturn}} \\
2 &= \forall \ DataPrd_{Pixel,CropRot,Mana,\mathrm{NReturn}}  \text{ and } PolData_{Mana,PolPrem}
\end{align*}

这种输出提高了方程的可读性(在我看来),但我不确定这是否是解决问题的最佳方法。此外,由于导出是通过使用 Dust.js 模板自动完成的,我不知道如何自动创建表格和方程中的参考符号(示例中为 1、2)。解决方案需要相当通用,并且应该适用于所有类型的方程。

如果有人能有一个好主意来解决这个问题我将不胜感激!

更新:这是 MWE:

\documentclass[a4paper,landscape]{article}
\usepackage[landscape]{geometry}
\usepackage[utf8]{inputenc}
\usepackage{amsmath}
\usepackage{breqn}
\setkeys{breqn}{breakdepth={1}}


\begin{document}

% The output generated by the GAMS to Latex converter
% without any changes
\begin{equation}
    NetReturn = \sum\limits_{Pixel,CropRot,Mana\thinspace \operatorname{if} \thinspace DataPrd_{Pixel,CropRot,Mana,\mathrm{NReturn}}  } \left( DataPrd_{Pixel,CropRot,Mana,\mathrm{NReturn}}  \cdot CropProd_{Pixel,CropRot,Mana} \right)  +  \sum\limits_{Pixel,CropRot,Mana,PolPrem\thinspace \operatorname{if} \thinspace DataPrd_{Pixel,CropRot,Mana,\mathrm{NReturn}}  and  PolData_{Mana,PolPrem}  } \left( PolData_{Mana,PolPrem}  \cdot CropProd_{Pixel,CropRot,Mana} \right)  \mspace{40mu}  
    \label{eq:Objf}
\end{equation}

% My first proposal, however I don't know how I could automate this setup
% through a Dust.js template
% I'd really welcome better approaches

\begin{dmath}
    NetReturn = \sum\limits_{Pixel,CropRot,Mana ^{1}} \left( DataPrd_{Pixel,CropRot,Mana,\mathrm{NReturn}}  \cdot CropProd_{Pixel,CropRot,Mana} \right)  +  \sum\limits_{Pixel,CropRot,Mana,PolPrem ^{2}} \left( PolData_{Mana,PolPrem}  \cdot CropProd_{Pixel,CropRot,Mana} \right)  
    \label{eq:Objf}
\end{dmath} 

where
\begin{align*}
1 &= \forall \ DataPrd_{Pixel,CropRot,Mana,\mathrm{NReturn}} \\
2 &= \forall \ DataPrd_{Pixel,CropRot,Mana,\mathrm{NReturn}}  \text{ and } PolData_{Mana,PolPrem}
\end{align*}


\end{document}

相关内容