为了编写一个文本别名包,使得编写更接近输出的输入成为可能,我遇到了以下问题:创建一个控制序列,比如说,\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
。这意味着你需要更多的\expandafter
s。但我有一个新的想法。你可以使用这个\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
诀窍。