自定义求和符号宏

自定义求和符号宏

我想编写一个对和符号进行转换的宏。

当我写:

\csum_{i = 1000000}^{n}

它应该转换为这样:

\sum_{\mathclap{i = 1000000}}^{n} \;

我怎样才能做到这一点?

答案1

像这样的事情???

我根本不喜欢这个_^语法,所以我放弃了它。\sum

如果省略,则可选参数\csum设置为计数索引。i

我保留了\mathclap

\documentclass{article}

\usepackage{xparse}
\usepackage{mathtools}


\NewDocumentCommand{\csum}{+O{i}+m+m}{%
\ensuremath{\sum\limits_{\mathclap{#1=#2}}^{#3}}%
}%


\begin{document}
\[ \csum{100000}{m} = 17 \]

\[ \csum[k]{100000}{m} = 17 \]
\end{document}

在此处输入图片描述

编辑——版本带有可选的第三个参数,而不是强制的

xparse及其宏的最大好处\NewDocumentCommand是与 相比具有更好的参数处理能力\newcommand。将上标参数定义为可选参数非常容易:

\csum[summation variable]{start value}[upper limit]

由于等可以\sum\limits_{}在没有默认可选空参数值的情况下工作。^{}

\documentclass{article}

\usepackage{xparse}
\usepackage{mathtools}

\NewDocumentCommand{\csum}{+O{i}+m+O{}}{%
\ensuremath{\sum\limits_{\mathclap{#1=#2}}^{#3}}%
}%


\begin{document}
\[ \csum{100000}[m] = 17 \]

\[ \csum[k]{1}[N] = \dfrac{N \left({N+1}\right)}{2} \]

\[ \csum[k]{1} k = 5050 \]

\end{document}

在此处输入图片描述

答案2

编辑

如果你确实后面会有下标和上标每一个 \csum总是…这样一来,我认为就更容易了:

\def\csum_#1^#2{\sum_{\mathclap{#1}}^{#2}}

但是你总是必须用它们两个来输入。

如果你想说,有时候\csum x_i,这是一种非常脆弱的方法。

原来的

非常脆弱,但这是第一步

\documentclass{scrartcl}
\usepackage{mathtools,xparse}

\NewDocumentCommand\csum{t_ g t^ g}
 {\sum
  \IfBooleanT{#1}
    {_{\mathclap{#2}}}
  \IfBooleanT{#3}
    {^{#4}}
  \IfBooleanTF{#1}{\;}{\IfBooleanT{#3}{\;}}}

\begin{document}
First, what we want,
\[
  \sum_{i = 1000000}^{n} x_i \quad \text{should change to} \quad \sum_{\mathclap{i = 1000000}}^{n} \; x_i
\]
And here we try with our new fragile-defined-easily-breakable command
\[
  \csum_{i = 1000000}^{n} x_i \qquad \text{Hurray!}
\]
\end{document}

在此处输入图片描述

显然,限制:不能\sum直接在后面加上括号(如\sum {x_n};如果给出,则下标必须用括号括起来(例如,这不起作用:\sum_{i=1}^n你必须\sum_{i=1}^{n}

将来,如果 expl3 包提供数学宏,那么它也能提供更“稳健”的方式来配置 sub 和下标,那就太好了。使用可选参数定义此类宏很容易,但使用\sum_i^\inftywith_^token 还是不错的。因此,我们可以使用接口将代码添加到下标前面,或者可以为此类上标添加预定义的字距,等等。

相关内容