commit 646f7f64013c195bd1d9a2e0ca542a59c4eee6ff
parent f52925e8f0c1d8f73d88004cca2cfa733e09cf7a
Author: Robert Russell <robertrussell.72001@gmail.com>
Date: Tue, 20 Sep 2022 09:59:47 -0700
Add transitional macros
Some of these changes are not fit for the final r3tex.
Diffstat:
| M | math.tex | | | 140 | ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++----------------- |
| M | mathenc.tex | | | 4 | ++-- |
| M | text.tex | | | 29 | +++++++++++++++++++---------- |
| M | util.tex | | | 29 | +++++++++++++++++------------ |
4 files changed, 149 insertions(+), 53 deletions(-)
diff --git a/math.tex b/math.tex
@@ -26,6 +26,9 @@
\def\le{\leq}
\def\ge{\geq}
+\def\:{\colon\,} % For use in $f\: X \to Y$
+\def\divides{\mid}
+\def\notdivides{\nmid}
\def\to{\rightarrow}
\def\mapsto{\mapstochar\rightarrow}
@@ -33,7 +36,7 @@
\def\<{\langle} \def\>{\rangle}
\def\{{\lbrace} \def\}{\rbrace}
\def\lc{\lceil} \def\rc{\rceil}
-\def\lr{\lfoor} \def\rf{\rfloor}
+\def\lf{\lfloor} \def\rf{\rfloor}
\def\joinrel{\mathrel{\mkern-3mu}}
\def\relbar{\mathrel{\smash-}} % \smash, because - has the same height as +
@@ -49,7 +52,10 @@
\def\longmapsto{\mapstochar\longrightarrow}
\def\longleftrightarrow{\leftarrow\joinrel\rightarrow}
\def\Longleftrightarrow{\Leftarrow\joinrel\Rightarrow}
-\def\iff{\;\Longleftrightarrow\;}
+\def\Iff{\mskip\thickmuskip \Longleftrightarrow \mskip\thickmuskip}
+\def\Imp{\mskip\thickmuskip \Longrightarrow \mskip\thickmuskip}
+\def\iff{\mskip\thickmuskip \Leftrightarrow \mskip\thickmuskip}
+\def\imp{\mskip\thickmuskip \Rightarrow \mskip\thickmuskip}
\def\ldots{\mathinner{\ldotp\ldotp\ldotp}}
\def\cdots{\mathinner{\cdotp\cdotp\cdotp}}
@@ -57,6 +63,8 @@
\baselineskip=4pt \lineskiplimit=0pt
\kern6pt \hbox{.}\hbox{.}\hbox{.}%
}}
+\def\tightvdots{\vbox{\baselineskip=4pt \lineskiplimit=0pt
+ \def\.{\hbox{.}}\.\.\.}}
\def\ddots{\mathinner{%
\mkern1mu
\raise7pt\vbox{\kern7pt\hbox{.}}%
@@ -66,6 +74,15 @@
\raise1pt\hbox{.}%
\mkern1mu
}}
+\def\iddots{\mathinner{%
+ \mkern1mu
+ \raise\p@\hbox{.}%
+ \mkern2mu
+ \raise4\p@\hbox{.}%
+ \mkern2mu
+ \raise7\p@\vbox{\kern7\p@\hbox{.}}%
+ \mkern1mu
+}}
% \def\overrightarrow#1{\vbox{\m@th\ialign{##\crcr
% \rightarrowfill\crcr\noalign{\kern-\p@\nointerlineskip}
@@ -76,9 +93,24 @@
% \def\overbrace#1{\mathop{\vbox{\m@th\ialign{##\crcr\noalign{\kern3\p@}
% \downbracefill\crcr\noalign{\kern3\p@\nointerlineskip}
% $\hfil\displaystyle{#1}\hfil$\crcr}}}\limits}
-% \def\underbrace#1{\mathop{\vtop{\m@th\ialign{##\crcr
- % $\hfil\displaystyle{#1}\hfil$\crcr\noalign{\kern3\p@\nointerlineskip}
- % \upbracefill\crcr\noalign{\kern3\p@}}}}\limits}
+\def\overbrace#1{%
+ \mathop{\vbox{\m@th\ialign{%
+ ##\crcr
+ \noalign{\kern1pt}%
+ \downbracefill\crcr
+ \noalign{\kern3pt\nointerlineskip}%
+ $\hfil\displaystyle{#1}\hfil$\crcr
+ }}}\limits
+}
+\def\underbrace#1{%
+ \mathop{\vtop{\m@th\ialign{%
+ ##\crcr
+ $\hfil\displaystyle{#1}\hfil$\crcr
+ \noalign{\kern3pt\nointerlineskip}%
+ \upbracefill\crcr
+ \noalign{\kern1pt}%
+ }}}\limits
+}
% Primes (with nice syntax)
% TODO: simplify with \isnextchar<char>{true}{false} macro; see optex
@@ -101,8 +133,8 @@
\def\@root#1#2{%
\setbox0=\hbox{$\m@th\sty#1\sqrt{#2}$}%
\dimenA=\dimexpr\ht0 - \dp0\relax
- % XXX hard-coded dimens --- probably specific to CM surd
- \mkern5mu \raise.6\dimenA\copy\@rootbox \mkern-10mu \box0
+ % XXX hard-coded dimens
+ \mkern4mu \raise.82\dimenA\copy\@rootbox \mkern-10.5mu \box0
}
\def\mathstrut{\vphantom(}
@@ -121,17 +153,17 @@
% \def\Big#1{{\hbox{$\left#1\vbox to11.5\p@{}\right.\n@space$}}}
% \def\bigg#1{{\hbox{$\left#1\vbox to14.5\p@{}\right.\n@space$}}}
% \def\Bigg#1{{\hbox{$\left#1\vbox to17.5\p@{}\right.\n@space$}}}
-\def\n@space{\nulldelimiterspace\z@ \m@th}
+\def\n@space{\nulldelimiterspace=0pt \m@th}
\def\choose{\atopwithdelims()}
\def\brack{\atopwithdelims[]}
\def\brace{\atopwithdelims\{\}}
-% \def\cong{\mathrel{\mathpalette\@vereq\sim}}
-% \def\@vereq#1#2{\lower.5\p@\vbox{\lineskiplimit\maxdimen\lineskip-.5\p@
- % \ialign{$\m@th#1\hfil##\hfil$\crcr#2\crcr=\crcr}}}
-% \def\notin{\mathrel{\mathpalette\c@ncel\in}}
-% \def\c@ncel#1#2{\m@th\ooalign{$\hfil#1\mkern1mu/\hfil$\crcr$#1#2$}}
+\def\cong{\mathrel{\mathpalette\@vereq\sim}}
+\def\@vereq#1#2{\lower.5pt \vbox{\lineskiplimit\maxdimen\lineskip-.5pt
+ \ialign{$\m@th\sty#1\hfil##\hfil$\crcr#2\crcr=\crcr}}}
+\def\notin{\mathrel{\mathpalette\c@ncel\in}}
+\def\c@ncel#1#2{\m@th\ooalign{$\hfil\sty#1\mkern1mu/\hfil$\crcr$\sty#1#2$}}
% \def\rightleftharpoons{\mathrel{\mathpalette\rlh@{}}}
% \def\rlh@#1{\vcenter{\m@th\hbox{\ooalign{\raise2pt
% \hbox{$#1\rightharpoonup$}\crcr
@@ -139,6 +171,26 @@
% \def\buildrel#1\over#2{\mathrel{\mathop{\kern\z@#2}\limits^{#1}}}
% \def\doteq{\buildrel\textstyle.\over=}
+% Customizable \overline.
+% \barx<sty><top space><thickness><clearance><left trim><right trim><atom>
+% All units are in mu relative to sty.
+\newdimen\@stymu
+\def\barx#1#2#3#4#5#6#7{\hbox{%
+ \@stymu=\dimexpr\styfontdimen{#1}{2}{6}/18\relax % get mu size
+ \kern#5\@stymu
+ \vbox{%
+ \boxmaxdepth=\maxdimen
+ \kern#2\@stymu
+ \hrule height#3\@stymu
+ \kern#4\@stymu
+ \hbox{\kern-#5\@stymu$\m@th\sty#1{#7}$\kern-#6\@stymu}%
+ }%
+ \kern#6\@stymu
+}}
+\def\bartrim#1#2#3{\mathpalette\@bartrim{{#1}{#2}{#3}}}
+\def\@bartrim#1#2{\barx#1{.5}12#2} % TODO: hardcoded values
+\def\overbar{\bartrim11}
+
% XXX hard-coded \rm; should be font specific to operators
\def\log{\mathop{\rm log}\nolimits}
\def\lg{\mathop{\rm lg}\nolimits}
@@ -173,16 +225,54 @@
\def\gcd{\mathop{\rm gcd}}
\def\deg{\mathop{\rm deg}\nolimits}
+% TODO: review
+\def\openup{\afterassignment\@penup \dimenA=}
+\def\@penup{\advance\lineskip\dimenA
+ \advance\baselineskip\dimenA
+ \advance\lineskiplimit\dimenA}
+\let\dsty\displaystyle
+\def\@malign{\hfil\strut$\dsty{##}$\tabskip=0pt&$\dsty{{}##}$\hfil}
+\def\eqalignskip{\qquad}
+\def\eqalign#1{\null\,\vcenter{\openup1\jot \m@th
+ \ialign{\cspan\@malign&&\eqalignskip\cspan\@malign\crcr #1\crcr}}\,}
+\newif\ifdt@p
+\def\displ@y{\global\dt@ptrue\openup\jot\m@th
+ \everycr{\noalign{\ifdt@p \global\dt@pfalse \ifdim\prevdepth>-1000pt
+ \vskip-\lineskiplimit \vskip\normallineskiplimit \fi
+ \else \penalty\interdisplaylinepenalty \fi}}}
+\def\@lign{\tabskip0pt \everycr={}} % restore inside \displ@y
+\def\exalignno#1{\displ@y \tabskip=\centering
+ \halign to\displaywidth{%
+ \hfil$\@lign\dsty{##}$\tabskip=0pt&$\@lign\dsty{{}##}$\hfil&
+ \qquad\hbox{\rm##}\hfil\tabskip=\centering&
+ \llap{$\@lign##$}\tabskip=0pt\crcr #1\crcr}}
+\def\eqalignno#1{\displ@y \tabskip\centering
+ \halign to\displaywidth{\hfil$\@lign\displaystyle{##}$\tabskip0pt
+ &$\@lign\displaystyle{{}##}$\hfil\tabskip\centering
+ &\llap{$\@lign##$}\tabskip0pt\crcr
+ #1\crcr}}
+\def\displaylines#1{\displ@y \tabskip0pt
+ \halign{\hbox to\displaywidth{$\@lign\hfil\displaystyle##\hfil$}\crcr
+ #1\crcr}}
+
% \def\bmod{\nonscript\mskip-\medmuskip\mkern5mu
% \mathbin{\rm mod}\penalty900\mkern5mu\nonscript\mskip-\medmuskip}
-% \def\pmod#1{\allowbreak\mkern18mu({\rm mod}\,\,#1)}
-
-% \def\cases#1{\left\{\,\vcenter{\normalbaselines\m@th
- % \ialign{$##\hfil$&\quad##\hfil\crcr#1\crcr}}\right.}
-% \def\matrix#1{\null\,\vcenter{\normalbaselines\m@th
- % \ialign{\hfil$##$\hfil&&\quad\hfil$##$\hfil\crcr
- % \mathstrut\crcr\noalign{\kern-\baselineskip}
- % #1\crcr\mathstrut\crcr\noalign{\kern-\baselineskip}}}\,}
+\def\mod#1{\allowbreak\ifinner\ \else\mkern18mu\fi({\rm mod}\,\,#1)}
+
+\def\cases#1{\left\{\,\vcenter{\normalbaselines\m@th % XXX: \m@th here is wrong; should be inside leftmost column
+ \ialign{$##\hfil$&\quad##\hfil\crcr#1\crcr}}\right.}
+\def\matrix#1{%
+ \null\,\vcenter{%
+ \normalbaselines\m@th
+ \ialign{%
+ \hfil$##$\hfil&&\quad\hfil$##$\hfil\crcr
+ \mathstrut\crcr \noalign{\kern-\baselineskip}%
+ #1\crcr
+ \mathstrut\crcr \noalign{\kern-\baselineskip}%
+ }%
+ }\,%
+}
+\def\bmatrix#1{\left[\matrix{#1}\right]}
% \def\pmatrix#1{\left(\matrix{#1}\right)}
% \newdimen\p@renwd
% \setbox0=\hbox{\tenex B} \p@renwd=\wd0 % width of the big left (
@@ -212,14 +302,6 @@
% \vskip-\lineskiplimit \vskip\normallineskiplimit \fi
% \else \penalty\interdisplaylinepenalty \fi}}}
% \def\@lign{\tabskip\z@skip\everycr{}} % restore inside \displ@y
-% \def\displaylines#1{\displ@y \tabskip\z@skip
- % \halign{\hbox to\displaywidth{$\@lign\hfil\displaystyle##\hfil$}\crcr
- % #1\crcr}}
-% \def\eqalignno#1{\displ@y \tabskip\centering
- % \halign to\displaywidth{\hfil$\@lign\displaystyle{##}$\tabskip\z@skip
- % &$\@lign\displaystyle{{}##}$\hfil\tabskip\centering
- % &\llap{$\@lign##$}\tabskip\z@skip\crcr
- % #1\crcr}}
% \def\leqalignno#1{\displ@y \tabskip\centering
% \halign to\displaywidth{\hfil$\@lign\displaystyle{##}$\tabskip\z@skip
% &$\@lign\displaystyle{{}##}$\hfil\tabskip\centering
diff --git a/mathenc.tex b/mathenc.tex
@@ -235,12 +235,12 @@
\def\acute{\mathaccent"7013 }
\def\grave{\mathaccent"7012 }
\def\ddot{\mathaccent"707F }
-\def\tilde{\mathaccent"707E }
+\def\tilde{\mathaccent"7003 }
\def\bar{\mathaccent"7016 }
\def\breve{\mathaccent"7015 }
\def\check{\mathaccent"7014 }
\def\hat{\mathaccent"705E }
-\def\vec{\mathaccent"017E }
+\def\vec{\Umathaccent"0"02"AE }
\def\dot{\mathaccent"705F }
\def\widetilde{\mathaccent"0365 }
\def\widehat{\mathaccent"0362 }
diff --git a/text.tex b/text.tex
@@ -19,7 +19,7 @@
\lineskip=\normallineskip
\lineskiplimit=\normallineskiplimit
}
-\def\@constlineskip{%
+\def\@constlineskip{% TODO helper isn't needed here
\baselineskip=-1000pt
\lineskip=\skipA
\lineskiplimit=\maxdimen
@@ -145,6 +145,24 @@
\def\multispan#1{\omit \mscount=#1\relax \loop\ifnum\mscount>1 \@cspan \repeat}
\def\@cspan{\cspan\omit \decr\mscount}
+\mathchardef\braceld="37A \mathchardef\bracerd="37B
+\mathchardef\bracelu="37C \mathchardef\braceru="37D
+\def\downbracefill{%
+ $\m@th
+ \setbox0=\hbox{$\braceld$}%
+ \braceld \leaders\vrule height\ht0 depth0pt \hfill \braceru
+ \bracelu \leaders\vrule height\ht0 depth0pt \hfill \bracerd
+ $%
+}
+\def\upbracefill{%
+ $\m@th
+ \setbox0=\hbox{$\braceld$}%
+ \bracelu \leaders\vrule height\ht0 depth0pt \hfill \bracerd
+ \braceld \leaders\vrule height\ht0 depth0pt \hfill \braceru
+ $%
+}
+\def\dots{\relax\ifmmode\ldots\else$\m@th\ldots\,$\fi}
+
\endinput
@@ -159,7 +177,6 @@
% \def\bigbreak{\par\ifdim\lastskip<\bigskipamount
% \removelastskip\penalty-200\bigskip\fi}
-% \def\dots{\relax\ifmmode\ldots\else$\m@th\ldots\,$\fi}
% \def\TeX{T\kern-.1667em\lower.5ex\hbox{E}\kern-.125emX}
% \def\hrulefill{\leaders\hrule\hfill}
@@ -170,13 +187,5 @@
% \def\leftarrowfill{$\m@th\mathord\leftarrow\mkern-7mu%
% \cleaders\hbox{$\mkern-2mu\smash-\mkern-2mu$}\hfill
% \mkern-7mu\smash-$}
-% \mathchardef\braceld="37A \mathchardef\bracerd="37B
-% \mathchardef\bracelu="37C \mathchardef\braceru="37D
-% \def\downbracefill{$\m@th \setbox\z@\hbox{$\braceld$}%
- % \braceld\leaders\vrule height\ht\z@ depth\z@\hfill\braceru
- % \bracelu\leaders\vrule height\ht\z@ depth\z@\hfill\bracerd$}
-% \def\upbracefill{$\m@th \setbox\z@\hbox{$\braceld$}%
- % \bracelu\leaders\vrule height\ht\z@ depth\z@\hfill\bracerd
- % \braceld\leaders\vrule height\ht\z@ depth\z@\hfill\braceru$}
% \outer\def\bye{\par\vfill\supereject\end}
diff --git a/util.tex b/util.tex
@@ -1,6 +1,8 @@
+% TODO: is there a meaningful difference between abbreviation and alias?
% Primitive abbreviations
\let\g=\global
\let\ea=\expandafter
+\let\nx=\noexpand % TODO: replace noexpand with nx
\let\attr=\attribute
\let\attrdef=\attributedef
\let\cctab=\catcodetable
@@ -10,6 +12,7 @@
\let\endcs=\endcsname
\let\ifcs=\ifcsname
\let\beggroup=\begingroup
+\let\easn=\immediateassignment
% Primitive aliases
\let\rescan=\scantextokens
@@ -29,7 +32,7 @@
\def\empty{}
\def\space{ }
\def\tab{^^I}
-\def\m@th{\mathsurround=0pt }
+\def\m@th{\mathsurround=0pt } % XXX: \mathsurroundskip and \mathsurroundmode
% Special constants
\chardef\maxchar=1114111
@@ -39,8 +42,11 @@
\newbox\voidbox
% Expansion control
-\def\nea{\noexpand\ea}
\def\eonce#1{\unexpanded\ea{#1}}
+% XXX: are these useful?
+\def\deferfi#1#2\fi{#2\fi#1}
+\def\afterfi#1\fi{\fi#1}
+\def\jumpfi#1#2\fi{\fi#1}
% Caution: \incr\count0 does not do what you'd hope. We use the "by" keyword
% to catch this error.
@@ -83,11 +89,13 @@
\ea\newtoks\begcs hooks:#2\endcs \cs{hooks:#2}={}%
}
\protected\def\event[#1]{%
+ \relax % events can appear in weird places (e.g., the standard \par event)
\begcs event:#1\ea\endcs\ea{\the\cs{hooks:#1}}%
\@hooks
}
\protected\def\addhook[#1]#2{\cs{hooks:#1}\ea{\the\cs{hooks:#1}#2}}
+\def\swap#1#2{#2#1}
\def\selectx#1{} % \gobble
\def\selecto#1{#1}
\def\selectxx#1#2{} % \gobbletwo
@@ -143,6 +151,7 @@
% Generalized mathpalette---gives number to be used with \ifcase
\def\mathpalette#1#2{\mathchoice{#10{#2}}{#11{#2}}{#12{#2}}{#13{#2}}}
+% XXX: protect or start with \relax?
\def\sty#1{%
\ifcase\numexpr#1\relax
\displaystyle
@@ -159,6 +168,8 @@
\or\scriptscriptfont
\fi
}
+% \styfontdimen<sty><fam><number>
+\def\styfontdimen#1#2#3{\fontdimen\numexpr#3\relax\styfont{#1}\numexpr#2\relax}
{\catcode`\p=12 \catcode`\t=12 \gdef\csA#1pt{#1}}
\let\rempt=\csA
@@ -188,19 +199,13 @@
% register assignments, the tokens are placed after the entire assignment,
% unlike with \afterassignment. \deferasn does not use any temporary registers.
\newcount\@grouplevel
+\def\@checkgrouplevel{\ifnum\currentgrouplevel>\@grouplevel \ea\aftergroup \fi}
+\def\@savegrouplevel{\@grouplevel\currentgrouplevel}
+\def\@deferasnA{\@checkgrouplevel\@deferasnB}
\protected\def\deferasn#1{%
- \@grouplevel=\currentgrouplevel
+ \@savegrouplevel
\def\@deferasnB{#1}%
- \def\@deferasnA{%
- \ifnum\currentgrouplevel>\@grouplevel \ea\aftergroup \fi
- \@deferasnB
- }%
\afterassignment\@deferasnA
}
-% XXX: are these useful?
-\def\deferfi#1#2\fi{#2\fi#1}
-\def\afterfi#1\fi{\fi#1}
-\def\jumpfi#1#2\fi{\fi#1}
-
\endinput