用户定义宏中的数学换行符

用户定义宏中的数学换行符

我一直在使用 NewDocumentCommand 定义数学公式。这种方法效果很好,但我确实遇到了换行符。

下面是一个最小的工作示例。部分构造借鉴自将可变长度的逗号分隔列表解析为命令(Peter Grill 的回答)。

\documentclass{article}

\usepackage{amsmath}
\usepackage{pgffor}
\usepackage{xparse}

\NewDocumentCommand{\formulaEx}{m}{
    \gdef\separator{}
    \gdef\formula{}
    \foreach \x in {1,...,#1} {%
        \xdef\formula{\formula \separator \frac{1}{(1+\x)^{\x}} }
        \gdef\separator{ + }
    }
    \formula
    \gdef\formula{}
}

\begin{document}

\begin{align*}
 P &= \formulaEx{10}
\end{align*}

\end{document}

这不会产生任何换行符。++ \\或替换+ \newline会产生错误。我也尝试使用包breqn但这是无效的(没有错误,但没有换行)。

我尝试了许多解决方法(例如采用这里提出的解决方案使用带有单独宏的 breqn 包时超出 tex 容量),但这些都毫无用处。

非常感谢您的帮助。

答案1

这确实是一次象征性的地狱,但是山头已经被占领了,长官。

\documentclass{article}
\usepackage{lipsum}
\usepackage{amsmath}
\usepackage{pgffor}
\usepackage{xparse}
\newcommand\addtoformula[1]{\global\formula\expandafter{\the\formula#1}}
\newcommand\exaddtoformula[1]{\expandafter\global\expandafter\addtoformula\expandafter{#1}}
\newtoks\formula
\newtoks\formx
\NewDocumentCommand{\formulaEx}{m}{
    \gdef\separator{}
    \formula{}
    \foreach \x in {1,...,#1} {%
      \exaddtoformula{\separator\allowbreak\dfrac{1}}%
      \formx{}%
      \formx\expandafter\expandafter\expandafter{\expandafter\expandafter\expandafter(%
        \expandafter\expandafter\expandafter1\expandafter\expandafter\expandafter+%
          \expandafter\x\expandafter)\expandafter^\expandafter{\x}}
      \expandafter\addtoformula\expandafter{\expandafter{\the\formx}}%
      \gdef\separator{ +\rule[-4ex]{0pt}{0pt}}% PROVIDES EXTRA INTERLINE VERTICAL SPACE
    }
    \the\formula\vspace{-2ex}% UNDOES EXTRA SPACE ON LAST LINE
}
\begin{document}
\lipsum[1]
\begin{center}
$P = \formulaEx{10}$
\end{center}
\lipsum[2]
\end{document}

在此处输入图片描述

某种aligned风格的呈现可以通过如下调用来实现:

\begin{center}
$P = \parbox[t]{4in}{$\formulaEx{10}$}$
\end{center}

在此处输入图片描述

当然,虽然我努力在上述解决方案中构建标记列表,但在内联模式下追求事物时确实没有必要这样做,而是可以直接输出每个分数。

\documentclass{article}
\usepackage{lipsum}
\usepackage{amsmath}
\usepackage{pgffor}
\usepackage{xparse}
\NewDocumentCommand{\formulaEx}{m}{
    \gdef\separator{}
    \foreach \x in {1,...,#1} {%
      \separator \dfrac{1}{(1+\x)^{\x}} 
      \gdef\separator{ +\rule[-4ex]{0pt}{0pt}}% PROVIDES EXTRA INTERLINE VERTICAL SPACE
    }
    \vspace{-2ex}% UNDOES EXTRA SPACE ON LAST LINE
}
\begin{document}
\lipsum[1]
\begin{center}
$P = \formulaEx{10}$
\end{center}
\lipsum[2]
\end{document}

答案2

如果您愿意,可以使用breqn。另一方面,为包构建它比直接输入整个公式要花费更多时间。

\documentclass{article}
\usepackage{breqn}
\usepackage{xparse}

\ExplSyntaxOn
\seq_new:N \l__isanco_formula_temp_seq

\NewDocumentCommand{\FormulaEx}{mmm}
 {% #1 = times to repeat, #2 = control sequence, #3 = formula
  \cs_set_protected:Nn \__isanco_formula_repeat:n { #3 }
  \int_step_inline:nnnn { 1 } { 1 } { #1 }
   {
    \seq_put_right:Nx \l__isanco_formula_temp_seq
     {
      \exp_not:o { \__isanco_formula_repeat:n { ##1 } }
     }
   }
  \tl_new:N #2
  \tl_set:Nx #2 { \seq_use:Nn \l__isanco_formula_temp_seq { + } }
 }
\ExplSyntaxOff

\FormulaEx{10}{\formulaA}{\frac{1}{(1+#1)^{#1}}}

\begin{document}

\begin{dmath*}
P=\formulaA
\end{dmath*}

\end{document}

在此处输入图片描述

相关内容