对于某些字符,将 #1^#2 定义为 \overset{#2}{#1}

对于某些字符,将 #1^#2 定义为 \overset{#2}{#1}

当我用 写数学公式时xelatex,我喜欢这样的符号:

$x \overset{ℝ}{+} y$  
$x \overset{f}{↦} y $  
$x \overset{(1)}{=} y$

但是,由于我经常输入此类内容,因此我希望输入速度更快,并使源代码更易于阅读(在快速扫描代码的意义上)。我想到三件事,但我不知道该怎么做(或者是否可能):

  1. 定义#1^#2为何\overset{#2}{#1}#1∈{+,↦,=,→}甚至更多
  2. 对所有情况#1^^#2都定义\overset{#2}{#1}#1
  3. 对所有情况#1↖#2都定义\overset{#2}{#1}#1

我更喜欢选项 1,但我不确定这是否可行。我认为这应该是可行的\sum,因为 ,\int并且\prod已经以这种方式行事。

答案1

我不确定你是否真的想要这个;但是,它在这里。

\documentclass{article}
\usepackage{amsmath}
\usepackage{unicode-math}

\ExplSyntaxOn
\NewDocumentCommand{\defineoversetchar}{m}
 {
  \clist_map_inline:nn { #1 } { \kasper_define_overset_char:n { ##1 } }
 }
\cs_new_protected:Nn \kasper_define_overset_char:n
 {
  \cs_new_protected:cn { kasper_#1_active: }
   {
    \peek_catcode_remove_ignore_spaces:NTF \c_math_superscript_token
     {
      \kasper_overset:nn { #1 }
     }
     {
      \use:c { kasper_#1_inactive: }
     }
   }
  \char_set_active_eq:Nc #1 { kasper_#1_active: }
  \AtBeginDocument
   {
    \cs_new:cx { kasper_#1_inactive: } { \Umathcharnum \the\Umathcodenum`#1 }
    \char_set_mathcode:nn { `#1 } { "8000 }
   }
 }
\cs_new_protected:Nn \kasper_overset:nn
 {
  \overset{#2}{\use:c { kasper_#1_inactive: }}
 }
\ExplSyntaxOff

\defineoversetchar{+,↦,=,→}

\begin{document}

$x ℝ^{+} y$

$x ↦^f y ↦ z$

$x →^f y → z$

$x =^{(1)} y = z$

\end{document}

在此处输入图片描述

请注意,上标(或下标)中使用的特殊字符应该放在括号中。

相关内容