我想定义也可以用于上标的数学关系。例如,我想使用
\newcommand\mesh{\mathrel{\#}}
和 都是A\mesh B
。A^\mesh
除非我写 ,否则后者会出错A^{\mesh}
,但我不想记住到处都加上括号。这可能吗?
谢谢您的任何提示!
答案1
答案2
^
您可以在数学模式下激活上标字符(请参阅特克斯常见问题例如)。
首先,提醒一下猫代码:
- catcode
7
对应于“上标”,它是 的默认 catcode^
, - catcode
12
对应于“其他”(如数字和标点符号), - catcode
13
对应“active”,该角色表现得像一个宏。
^
通过将数学模式中的设置\mathcode
为的价值"8000
。此特殊代码意味着将使用 的活动定义 (catcode 13
) ^
,即使其实际 catcode 不同。但我们还需要将 的 catcode 更改^
为12
(其他) 以使其处于非活动状态,因为上标将使用宏处理。
在里面\AtBeginDocument
,将的原始含义保存^
在命令中,比如说\my@standardsup
,并^
在数学模式下激活:
\AtBeginDocument{%
\begingroup % save standard superscript definition
\catcode`\^=7
\global\let\my@standardsup=^
\endgroup
\catcode`\^=12 % set ^ catcode to other
\mathcode`\^="8000 % make ^ active in math mode
}
当设置时\my@standardsup
,我们需要确保^
有其标准定义(catcode 7
),以防其他包已经对其进行了修改(事实上\begingroup
和\endgroup
在这里是没用的,因为我们紧接着重新定义了 catcode)。
现在可以定义 的活动定义来^
支撑其参数并将其放在上标中:
\begingroup
\lccode`\~=`\^
\lowercase{\endgroup%
\def~}#1{\my@standardsup{#1}%
}%
这里使用了一些\lowercase
技巧,可以在不实际更改 catcode 的情况下做到这一点(请参阅特克斯常见问题了解详情)。
您还需要重新定义\pr@m@s
宏(在 中定义latex.ltx
并由素数 char 使用'
),因为 的 catcode^
现在是12
。因此,在设置 catcode 后,只需复制其定义即可。这可以避免Double superscript
在使用素数(如在x'^a
和 中x''^a
)时出错:
\begingroup \catcode`\^=12%
\gdef\pr@m@s{% copy of \@pr@m@s code from latex.ltx
\ifx'\@let@token
\expandafter\pr@@@s
\else
\ifx^\@let@token
\expandafter\expandafter\expandafter\pr@@@t
\else
\egroup
\fi
\fi}
\endgroup
完整示例(使用\makeatletter
和\makeatother
处理@
字符):
\documentclass{article}
\usepackage{amsmath}
\makeatletter
\AtBeginDocument{%
\begingroup % save standard superscript definition
\catcode`\^=7
\global\let\my@standardsup=^
\endgroup
\catcode`\^=12 % set ^ catcode to other
\mathcode`\^="8000 % make ^ active in math mode
}
%% brace ^ argument
\begingroup
\lccode`\~=`\^
\lowercase{\endgroup%
\def~}#1{\my@standardsup{#1}%
}%
%% fix prime symbol
\begingroup \catcode`\^=12%
\gdef\pr@m@s{% copy of \@pr@m@s code from latex.ltx
\ifx’\@let@token
\expandafter\pr@@@s
\else
\ifx^\@let@token
\expandafter\expandafter\expandafter\pr@@@t
\else
\egroup
\fi
\fi}
\endgroup
\makeatother
\newcommand\mesh{\mathrel{\#}}
\newcommand\smallplus{\mathbin{\texttt{+}}}
\newcommand\indep{\mathrel{\perp\!\!\!\perp}}
\newcommand\myrel{\mathrel{\overset{\textsf{a.e.}}{\sim}}}
\begin{document}
\begin{align*}
A \mesh B & & A^\mesh & & A^{\mesh} & & A'^\mesh & & A'^{\mesh} \\
A \smallplus B & & A^\smallplus & & A^{\smallplus} & & A'^\smallplus & & A'^{\smallplus} \\
A \indep B & & A^\indep & & A^{\indep} & & A'^\indep & & A'^{\indep} \\
A \myrel B & & A^\myrel & & A^{\myrel} & & A'^\myrel & & A'^{\myrel}
\end{align*}
\end{document}