累积下标/上标?

累积下标/上标?

为了编写一个文本别名包,使得编写更接近输出的输入成为可能,我遇到了以下问题:创建一个控制序列,比如说,\subscript它的行为就像,_除了它会累积,即将$a\subscript b \subscript c$被解释为$a\subscript{bc}$

(是的,我知道unicode-math。这里的目的非常不同 - 不是支持 Unicode,而是利用 Unicode 来编写更短、更清晰的输入。)

这是一个展示潜在好处的最小例子。

\documentclass{minimal}
\usepackage[utf8]{inputenc}

\DeclareUnicodeCharacter{00B2}{^2}   % ² 
\DeclareUnicodeCharacter{00B9}{^1}   % ¹ 
\DeclareUnicodeCharacter{1D62}{_i}   % ᵢ
\DeclareUnicodeCharacter{207B}{^-}   % ⁻ 
\DeclareUnicodeCharacter{207F}{^n}   % ⁿ 
\DeclareUnicodeCharacter{2080}{_0}   % ₀ 
\DeclareUnicodeCharacter{208C}{_=}   % ₌ 
\DeclareUnicodeCharacter{2211}{\sum} % ∑ 

\begin{document}
\[
  ∑ᵢ₌₀ⁿ⁻¹ 2i+1 = n²
\]
\end{document}

答案1

我可以向你展示这是可能的。但是使用csplain,没有 LaTeX。我不知道在 LaTeX 中该怎么做,因为[utf8]{inputenc}使用时有非常复杂的扩展。

\def\declchar#1#2{%
   \expandafter\mubyte\csname\string#2\endcsname#1\endmubyte
   \expandafter\def\csname\string#2\endcsname{#2}%
}
\mubytein=0
\declchar{²}{\mysupu 2}
\declchar{¹}{\mysupu 1}
\declchar{ᵢ}{\mysupd i}
\declchar{⁻}{\mysupu -}
\declchar{ⁿ}{\mysupu n}
\declchar{₀}{\mysupd 0}
\declchar{₌}{\mysupd =}
\declchar{∑}{\sum}
\mubytein=1

\def\mysuplist{}
\def\addto#1#2{\expandafter\def\expandafter#1\expandafter{#1#2}}
\def\mysupu#1{\addto\mysuplist{#1}\expandafter\futurelet
   \expandafter\next\expandafter\mysupuA}
\def\mysupuA{\ifx\next\mysupu \else ^{\mysuplist}\gdef\mysuplist{}\fi}
\def\mysupd#1{\addto\mysuplist{#1}\expandafter\futurelet
   \expandafter\next\expandafter\mysupdA}
\def\mysupdA{\ifx\next\mysupd \else _{\mysuplist}\gdef\mysuplist{}\fi}

$$
  ∑ᵢ₌₀ⁿ⁻¹ 2i+1 = n²
$$

\bye

编辑我考虑了你的评论,为什么 LaTeX 更复杂。因为从 UTF-8 代码的活动表示到 中声明的内容有更多的扩展步骤\DeclareUnicodeCharacter。这意味着你需要更多的\expandafters。但我有一个新的想法。你可以使用这个\rommannumeral-`\.技巧,它扩展到零,并对下一个标记进行完全扩展,直到出现空格或不可扩展的标记。并且在数学模式下,空格被忽略。所以,LaTeX 有一个解决方案:

宣布:

\DeclareUnicodeCharacter{00B2}{ \mysupu 2}   % ² 
\DeclareUnicodeCharacter{00B9}{ \mysupu 1}   % ¹ 
\DeclareUnicodeCharacter{1D62}{ \mysupd i}   % ᵢ
\DeclareUnicodeCharacter{207B}{ \mysupu -}   % ⁻ 
\DeclareUnicodeCharacter{207F}{ \mysupu n}   % ⁿ 
\DeclareUnicodeCharacter{2080}{ \mysupd 0}   % ₀ 
\DeclareUnicodeCharacter{208C}{ \mysupd =}   % ₌ 
\DeclareUnicodeCharacter{2211}{\sum} % ∑ 

\mysupu请注意,在或!之前有一个重要的空格\mysupd。并使用我的宏进行以下修改:

\def\mysuplist{}
\def\addto#1#2{\expandafter\def\expandafter#1\expandafter{#1#2}}
\def\mysupu#1{\addto\mysuplist{#1}\expandafter\futurelet
   \expandafter\next\expandafter\mysupuA\romannumeral-`\.}
\def\mysupuA{\ifx\next\mysupu \else ^{\mysuplist}\gdef\mysuplist{}\fi}
\def\mysupd#1{\addto\mysuplist{#1}\expandafter\futurelet
   \expandafter\next\expandafter\mysupdA\romannumeral-`\.}
\def\mysupdA{\ifx\next\mysupd \else _{\mysuplist}\gdef\mysuplist{}\fi}

注意\romannumeral诀窍。

相关内容