我写的几乎每个下标都必须用\text{..}
,因此,为了整洁,最好能够用例如x_<high>
来代替x_\text{high}
。
(缩短为\t{..}
就不那么美观了。)
有一个关于为此目的使用§...§符号的类似问题,因此\def
从那里接受的答案给出了一个半解决方案。但问题是我需要\lt
和\gt
映射到<
并且>
这不会依次展开。我不确定这里要使用什么机器。
答案1
\makeatletter
\begingroup\lccode`~=`_\lowercase{\endgroup\def~}{\extendedsb}
\def\extendedsb{\@ifnextchar<\textsb\sb}
\def\textsb<#1>{\sb{\textnormal{#1}}}
\AtBeginDocument{\catcode`_=12 \mathcode`_="8000 }
\makeatother
答案2
其实很简单。当您定义某个宏(或使用\let
它来分配它)时,定义或分配左侧的当前 catcode 会固定下来,因此您可以执行以下操作:
\documentclass{article}
\usepackage{amsmath}
\let\lt=<
\let\gt=>
{
\catcode`\<=\active
\gdef<#1>{{\text{#1}}}
}
\AtBeginDocument{%
\catcode`\<=\active
}
\begin{document}
\[
A_<op>\lt B_<op>
\]
\end{document}
该\AtBeginDocument
部分延迟了实际的 catcode 切换,这可以帮助一些需要旧类别的包(例如使用 比较数字\ifnum
)。