扩展 xparse 以接受新参数

扩展 xparse 以接受新参数

我正在寻找一种方法来将下标和上标作为 xparse 中命令的可选参数。也就是说,\foo_{a}^{b}a作为可选参数和b另一个可选参数接收。这样做的好处是,我们可以控制 TeX 的一个基本功能,而我们现在无法控制它。

答案1

好吧,我在 LaTeX-L 列表上询问过,但后来决定尝试一下,从包中到处复制,最后我得到了这个(如果没有错误,我会向列表发送一条消息,但至少在这里我可以编辑和纠正错别字)。

此代码添加了一种新类型的参数kK(为什么?我真的不知道,如果你有更好的建议,你可以告诉我。目前G拉布,r移动,oken 等已被占用,所以我决定en —我不想使用著名的 eX特拉X从每一个X包—)。第一个后面必须跟要检查的标记(与t参数完全一样),后面K必须跟标记和默认参数,例如K*{<default>}。我试图遵循我在 xparse 中看到的标准(除了“不要吞噬空格以寻找尾随的可选参数”)。啊,没有可扩展的,因为我现在不需要它,所以我跳过了它。

此参数类型检查是否存在标记,如果存在,则将其删除并采用下一个参数(单个标记或括号参数)。例如

  • \NewDocumentCommand\foo{mk*}将抓住\foo{a}#1= a#2= -NoValue-),并且
  • \foo{a}*{b}#1= a#2= b

具体来说,我希望将其用于下标和上标,因此我创建了两个“简写” a=k_b= k^(以及类似的Aand B)。

以下是带有一些示例的代码。

\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 }

\prop_put:Nnn \c__xparse_shorthands_prop { 1 } { m                 }
\prop_put:Nnn \c__xparse_shorthands_prop { 2 } { m m               }
\prop_put:Nnn \c__xparse_shorthands_prop { 3 } { m m m             }
\prop_put:Nnn \c__xparse_shorthands_prop { 4 } { m m m m           }
\prop_put:Nnn \c__xparse_shorthands_prop { 5 } { m m m m m         }
\prop_put:Nnn \c__xparse_shorthands_prop { 6 } { m m m m m m       }
\prop_put:Nnn \c__xparse_shorthands_prop { 7 } { m m m m m m m     }
\prop_put:Nnn \c__xparse_shorthands_prop { 8 } { m m m m m m m m   }
\prop_put:Nnn \c__xparse_shorthands_prop { 9 } { m m m m m m m m m }
\ExplSyntaxOff

\NewDocumentCommand\foo{ O{bigg} 3 a b }
 {
  \csname#1l\endcsname(
    #2 \csname#1m\endcsname| \frac{#3}{#4}
  \csname#1r\endcsname)
  \IfValueT{#5}{_{\mkern-5mu \mathrm{#5}}}
  \IfValueT{#6}{^{\mkern-5mu \{#6\}}}
 }
\NewDocumentCommand\baz{ a b }
 {\iiiint\limits\IfValueT{#1}{_{#1}}\IfValueT{#2}{^{\quad#2}}}
\NewDocumentCommand\lint{ A{a} B{b} }{\underline{\int_{#1}^{#2}}}
\NewDocumentCommand\uint{ A{a} B{b} }{\overline{\int_{#1}^{#2}}}

\begin{document}
\[
  \foo{X}{Y}{Z}_{min}^{bc} \quad
  \lint f(t) \, dt \quad
  \uint_{a(s)}^{b(s)} f(t) \, dt \quad
  \iiiint\limits_{aaa}^{bbb} \xi \quad
  \baz_{aaa}^{bbb} \zeta
\]
\end{document}

在此处输入图片描述

也许将来我会尝试创建类似的东西,t{*,-,+,!}以便命令可以获取列表中的一个标记\foo*\foo-或者无需。\foo+\foo!t* t- t+ t!

相关内容