当我用 写数学公式时xelatex
,我喜欢这样的符号:
$x \overset{ℝ}{+} y$
$x \overset{f}{↦} y $
$x \overset{(1)}{=} y$
但是,由于我经常输入此类内容,因此我希望输入速度更快,并使源代码更易于阅读(在快速扫描代码的意义上)。我想到三件事,但我不知道该怎么做(或者是否可能):
- 定义
#1^#2
为何\overset{#2}{#1}
时#1∈{+,↦,=,→}
甚至更多 - 对所有情况
#1^^#2
都定义\overset{#2}{#1}
#1
- 对所有情况
#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}
请注意,上标(或下标)中使用的特殊字符应该放在括号中。