在积分极限中使用 mathclap 作为默认值

在积分极限中使用 mathclap 作为默认值

我想改变的默认行为limits以包括\mathclap

而不是每次都写

\int\limits_{\mathclap{verylonglimit}} x \, dx

我想简单地写一下

\int\limits_{verylonglimit} x \, dx

并获得相同的行为。

我尝试过(以及类似形式):

\let\oldlimits\limits
\renewcommand{\limits_}[1]{\oldlimits_{\mathclap{#1}}}

问题是我不知道如何处理下划线。

答案1

不要重新定义\limits— — 这可能会在您的文档的其他地方造成很多麻烦 — — 我建议您定义一个新命令,比如说,\mclimits(“mathclap limits”的缩写...)如下:

\def\mclimits_#1{\limits_{\mathclap{#1}}}

请注意,使用此定义,任何\mclimits不使用字符的用法_都会导致语法错误,因为 TeX 将扫描输入材料以查找此字符,以便“知道”宏的参数(" "#1部分)应该是什么。此限制在实践中不应成为问题,因为您将使用_字符来指示应放置在全积分表达式的下限部分的材料的开始。

以下是使用宏的 MWE 的输出\mclimits

在此处输入图片描述

\documentclass{article}
\usepackage{mathtools}

\def\mclimits_#1{\limits_{\mathclap{#1}}}

\begin{document}
\[
\int\mclimits_{\text{verylonglimit}}\! f(x)\,dx
\]
\end{document}

答案2

这似乎有点小题大做……但这就是xparse工作原理。

使用“复杂代码”,我所做的就是定义新类型的参数,,,,,,xparsek是和下标的对应项。其他的都已解释KabABaA这里

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

\ExplSyntaxOn
\cs_new_protected:Npn \__xparse_count_type_k:w #1
 {
  \__xparse_single_token_check:n { #1 }
  \quark_if_recursion_tail_stop_do:Nn #1 { \__xparse_bad_arg_spec:wn }
  \__xparse_count_mandatory:N
 }
\cs_new_protected:Npn \__xparse_count_type_K:w #1 #2
 {
  \__xparse_single_token_check:n { #1 }
  \quark_if_recursion_tail_stop_do:nn { #2 } { \__xparse_bad_arg_spec:wn }
  \__xparse_count_mandatory:N
 }
\cs_new_protected:Npn \__xparse_add_type_k:w #1
 { \exp_args:NNo \__xparse_add_type_K:w #1 { \c__xparse_no_value_tl } }
\cs_new_protected:Npn \__xparse_add_type_K:w #1 #2
 {
  \__xparse_flush_m_args:
  \__xparse_add_grabber_optional:N K
  \tl_put_right:Nn \l__xparse_signature_tl { #1 { #2 } }
  \__xparse_prepare_signature:N
 }
\cs_new_protected:Npn \__xparse_add_expandable_type_k:w #1
 {
  \exp_args:NNo \__xparse_add_expandable_type_K:w #1 { \c__xparse_no_value_tl }
 }
\cs_new_protected_nopar:Npn \__xparse_add_expandable_type_K:w #1 #2
 {
  \__msg_kernel_error:nnx { xparse } { invalid-expandable-argument-type } { K }
  \__xparse_add_expandable_type_m:w % May be create this?
 }
\cs_new_protected:Npn \__xparse_grab_K:w #1 #2 #3 \l__xparse_args_tl
 {
  \__xparse_grab_K_aux:NnnNn #1 { #2 } { #3 } \cs_set_protected_nopar:Npn
   { _ignore_spaces }
 }
\cs_new_protected:Npn \__xparse_grab_K_long:w #1 #2 #3 \l__xparse_args_tl
 {
  \__xparse_grab_K_aux:NnnNn #1 { #2 } { #3 } \cs_set_protected:Npn
   { _ignore_spaces }
 }
\cs_new_protected:Npn \__xparse_grab_K_trailing:w #1 #2 #3 \l__xparse_args_tl
 {
  \__xparse_grab_K_aux:NnnNn #1 { #2 } { #3 } \cs_set_protected_nopar:Npn
   { _ignore_spaces }
 }
\cs_new_protected:Npn \__xparse_grab_K_long_trailing:w #1 #2 #3 \l__xparse_args_tl
 {
  \__xparse_grab_K_aux:NnnNn #1 { #2 } { #3 } \cs_set_protected:Npn
   { _ignore_spaces }
 }
\cs_new_protected:Npn \__xparse_grab_K_aux:NnnNn #1 #2 #3 #4 #5
 {
  \exp_after:wN #4 \l__xparse_fn_tl ##1
   {
    \__xparse_add_arg:n { ##1 }
    #3 \l__xparse_args_tl
   }    
  \use:c { peek_meaning_remove #5 :NTF } #1
   { \l__xparse_fn_tl }
   {
    \__xparse_add_arg:n { #2 }
    #3 \l__xparse_args_tl
   }
 }

\prop_put:Nnn \c__xparse_shorthands_prop { a } { k \sb }
\prop_put:Nnn \c__xparse_shorthands_prop { b } { k \sp }
\prop_put:Nnn \c__xparse_shorthands_prop { A } { K \sb }
\prop_put:Nnn \c__xparse_shorthands_prop { B } { K \sp }
\ExplSyntaxOff

\let\originalint\int
\RenewDocumentCommand\int{ t\limits a }
 {\originalint\IfBooleanT{#1}{\limits}\IfValueT{#2}{_{\mathclap{#2}}}}

\begin{document}
\[
  \int\limits_{verylonglimit} x \, dx
\]
\end{document}

在此处输入图片描述

\int首先重新定义命令以吞噬(并使用)\limits其后的任何命令(如果您想要不同的行为,可以进行更改,例如,如果您想要他们全部\limits所以\int_a相等\int\limits_{\mathclap{a}})然后命令检查是否存在下标像_{whatever}然后whatever作为第二个参数传递,然后我们将其自动传递给它_{\mathclap{#2}}

相关内容