我正在尝试使用包定义新命令xparse
。具体来说,我正尝试将积分从此简化\int\limits_{a}^{b}\ f(x)\ \mathrm{d}x
为更易于阅读的形式\dint[a,b]{f(x)}{x}
。
我有代码,\ExplSyntax
这样我就可以用它\use_i
来访问我的第一个参数的元素[a,b]
,这些元素\SplitArgument
被拆分成一个列表。我现在面临的问题是,它\use_i
似乎在里面不起作用\limits
;代码运行良好,没有使用,\limits
所以我的实现\use_i
应该没问题,如果我省略,代码也会运行\use_i
,因此\Explsyntax
env 只使用两个不同的封闭参数而不是组合参数。
我目前正在使用的代码:
\documentclass{scrartcl}
\usepackage{xparse}
% Version 1, preferred but does not work
\ExplSyntaxOn
\NewDocumentCommand{\dint}{>{\SplitArgument{1}{,}}r[] m m}{%
\int\limits_{\use_i:nn#1}^{\use_ii:nn#1}\ #2\ \mathrm{d}#3%
}
\ExplSyntaxOff
% Version 2, does run but is just to narrow down the error
\ExplSyntaxOn
\NewDocumentCommand{\dintt}{>{\SplitArgument{1}{,}}r[] m m}{%
\int \use_i:nn#1^{\use_ii:nn#1}\ #2\ \mathrm{d}#3%
}
\ExplSyntaxOff
% Version 3, works but
\NewDocumentCommand{\dinttt}{r[] r[] m m}{%
\int\limits_{#1}^{#2}\ #3\ \mathrm{d}#4%
}
\begin{document}
% Example 1: \( \dint[a,b]{f(x)}{x} \) % Fails with error
Example 2: \( \dintt[a,b]{f(x)}{x} \) % works, but is just for testing
Example 3: \( \dinttt[a][b]{f(x)}{x} \) % Works, but slightly annoying
\end{document}
这可能是因为在Latex3
环境中函数的处理方式不同吗?这是我第一次接触Latex3
语法,所以请耐心等待 ;)
答案1
问题就出\limits_
在第一个代码中,因为_
不是下标字符。
\ExplSyntaxOn
\NewDocumentCommand{\dint}{>{\SplitArgument{1}{,}}r[] m m}
{
\int
\limits
\c_math_subscript_token { \use_i:nn #1 }
\c_math_superscript_token { \use_ii:nn #1 }
#2
\,
\mathrm{d}#3
}
\ExplSyntaxOff
这两个\
命令是错误的:第一个命令在积分和函数之间产生了太多空间,第二个命令在函数和微分之间产生了太多空间。
比较下图:上面是您的版本,下面是我的版本。
完整示例。
\documentclass{article}
\usepackage{amsmath}
\ExplSyntaxOn
\NewDocumentCommand{\dint}{>{\SplitArgument{1}{,}}r[] m m}
{
\int
\limits
\c_math_subscript_token { \use_i:nn #1 }
\c_math_superscript_token { \use_ii:nn #1 }
#2
\,
\mathrm{d}#3
}
\ExplSyntaxOff
\begin{document}
\begin{align*}
& \int\limits_{a}^b \ f(x)\ \mathrm{d}x \\
& \int\limits_{a}^b f(x)\, \mathrm{d}x \\
& \dint[a,b]{f(x)}{x}
\end{align*}
\end{document}
注意:\mathrm{d}
即使我反对,我还是留下了可怕的东西。