我想编写一个对和符号进行转换的宏。
当我写:
\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^\infty
with_
和^
token 还是不错的。因此,我们可以使用接口将代码添加到下标前面,或者可以为此类上标添加预定义的字距,等等。