我一直在使用 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}