summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/mathsemantics/mathsemantics-syntax.sty
diff options
context:
space:
mode:
Diffstat (limited to 'macros/latex/contrib/mathsemantics/mathsemantics-syntax.sty')
-rw-r--r--macros/latex/contrib/mathsemantics/mathsemantics-syntax.sty428
1 files changed, 428 insertions, 0 deletions
diff --git a/macros/latex/contrib/mathsemantics/mathsemantics-syntax.sty b/macros/latex/contrib/mathsemantics/mathsemantics-syntax.sty
new file mode 100644
index 0000000000..d11cd62405
--- /dev/null
+++ b/macros/latex/contrib/mathsemantics/mathsemantics-syntax.sty
@@ -0,0 +1,428 @@
+\ProvidesPackage{mathsemantics-syntax}[2022/05/06]
+\provideboolean{mathsemantics@syntax@shortbb}
+\setboolean{mathsemantics@syntax@shortbb}{false}% default: false
+\DeclareOption{shortbb}{%
+ \setboolean{mathsemantics@syntax@shortbb}{true}% Some Code
+}
+\ProcessOptions\relax
+\RequirePackage{mathsemantics-commons}
+
+% Define commands for bold upper-case letters in math mode
+\newcommand{\bA}{{\boldsymbol{A}}}
+\newcommand{\bB}{{\boldsymbol{B}}}
+\newcommand{\bC}{{\boldsymbol{C}}}
+\newcommand{\bD}{{\boldsymbol{D}}}
+\newcommand{\bE}{{\boldsymbol{E}}}
+\newcommand{\bF}{{\boldsymbol{F}}}
+\newcommand{\bG}{{\boldsymbol{G}}}
+\newcommand{\bH}{{\boldsymbol{H}}}
+\newcommand{\bI}{{\boldsymbol{I}}}
+\newcommand{\bJ}{{\boldsymbol{J}}}
+\newcommand{\bK}{{\boldsymbol{K}}}
+\newcommand{\bL}{{\boldsymbol{L}}}
+\newcommand{\bM}{{\boldsymbol{M}}}
+\newcommand{\bN}{{\boldsymbol{N}}}
+\newcommand{\bO}{{\boldsymbol{O}}}
+\newcommand{\bP}{{\boldsymbol{P}}}
+\newcommand{\bQ}{{\boldsymbol{Q}}}
+\newcommand{\bR}{{\boldsymbol{R}}}
+\newcommand{\bS}{{\boldsymbol{S}}}
+\newcommand{\bT}{{\boldsymbol{T}}}
+\newcommand{\bU}{{\boldsymbol{U}}}
+\newcommand{\bV}{{\boldsymbol{V}}}
+\newcommand{\bW}{{\boldsymbol{W}}}
+\newcommand{\bX}{{\boldsymbol{X}}}
+\newcommand{\bY}{{\boldsymbol{Y}}}
+\newcommand{\bZ}{{\boldsymbol{Z}}}
+
+% Define commands for bold lower-case letters in math mode
+\newcommand{\ba}{{\boldsymbol{a}}}
+\newcommand{\bb}{{\boldsymbol{b}}}
+\newcommand{\bc}{{\boldsymbol{c}}}
+\newcommand{\bd}{{\boldsymbol{d}}}
+\newcommand{\be}{{\boldsymbol{e}}}
+\let\bf\undefined \newcommand{\bf}{{\boldsymbol{f}}}
+\newcommand{\bg}{{\boldsymbol{g}}}
+\newcommand{\bh}{{\boldsymbol{h}}}
+\let\bi\undefined \newcommand{\bi}{{\boldsymbol{i}}} % Taylor and Francis
+\newcommand{\bj}{{\boldsymbol{j}}}
+\newcommand{\bk}{{\boldsymbol{k}}}
+\newcommand{\bl}{{\boldsymbol{l}}}
+\let\bm\undefined \newcommand{\bm}{{\boldsymbol{m}}} % Taylor and Francis
+\newcommand{\bn}{{\boldsymbol{n}}}
+\newcommand{\bo}{{\boldsymbol{o}}}
+\newcommand{\bp}{{\boldsymbol{p}}}
+\newcommand{\bq}{{\boldsymbol{q}}}
+\newcommand{\br}{{\boldsymbol{r}}}
+\newcommand{\bs}{{\boldsymbol{s}}}
+\newcommand{\bt}{{\boldsymbol{t}}}
+\newcommand{\bu}{{\boldsymbol{u}}}
+\newcommand{\bv}{{\boldsymbol{v}}}
+\newcommand{\bw}{{\boldsymbol{w}}}
+\newcommand{\bx}{{\boldsymbol{x}}}
+\newcommand{\by}{{\boldsymbol{y}}}
+\newcommand{\bz}{{\boldsymbol{z}}}
+
+% Define commands for bold numbers 0, 1 in math mode
+\newcommand{\bnull}{{\boldsymbol{0}}}
+\newcommand{\bone}{{\boldsymbol{1}}}
+
+% Define commands for bold lower-case Greek letters in math mode
+\newcommand{\balpha}{{\boldsymbol{\alpha}}}
+\newcommand{\bbeta}{{\boldsymbol{\beta}}}
+\newcommand{\bgamma}{{\boldsymbol{\gamma}}}
+\newcommand{\bdelta}{{\boldsymbol{\delta}}}
+\newcommand{\bepsilon}{{\boldsymbol{\epsilon}}}
+\newcommand{\bvarepsilon}{{\boldsymbol{\varepsilon}}}
+\newcommand{\bzeta}{{\boldsymbol{\zeta}}}
+\newcommand{\boldeta}{{\boldsymbol{\eta}}} % exception: \boldeta instead of \beta
+\newcommand{\btheta}{{\boldsymbol{\theta}}}
+\newcommand{\bvartheta}{{\boldsymbol{\vartheta}}}
+\newcommand{\biota}{{\boldsymbol{\iota}}}
+\newcommand{\bkappa}{{\boldsymbol{\kappa}}}
+\newcommand{\bvarkappa}{{\boldsymbol{\varkappa}}}
+\newcommand{\blambda}{{\boldsymbol{\lambda}}}
+\newcommand{\bmu}{{\boldsymbol{\mu}}}
+\newcommand{\bnu}{{\boldsymbol{\nu}}}
+\newcommand{\bomicron}{\boldsymbol{o}}
+\newcommand{\bxi}{{\boldsymbol{\xi}}}
+\newcommand{\bpi}{{\boldsymbol{\pi}}}
+\newcommand{\bvarpi}{{\boldsymbol{\varpi}}}
+\newcommand{\brho}{{\boldsymbol{\rho}}}
+\newcommand{\bvarrho}{{\boldsymbol{\varrho}}}
+\newcommand{\bsigma}{{\boldsymbol{\sigma}}}
+\newcommand{\bvarsigma}{{\boldsymbol{\varsigma}}}
+\newcommand{\btau}{{\boldsymbol{\tau}}}
+\newcommand{\bupsilon}{{\boldsymbol{\upsilon}}}
+\newcommand{\bphi}{{\boldsymbol{\phi}}}
+\newcommand{\bvarphi}{{\boldsymbol{\varphi}}}
+\newcommand{\bchi}{{\boldsymbol{\chi}}}
+\newcommand{\bpsi}{{\boldsymbol{\psi}}}
+\newcommand{\bomega}{{\boldsymbol{\omega}}}
+
+% Define commands for bold upper-case Greek letters in math mode
+\newcommand{\bAlpha}{{\boldsymbol{A}}}
+\newcommand{\bBeta}{{\boldsymbol{B}}}
+\newcommand{\bGamma}{{\boldsymbol{\Gamma}}}
+\newcommand{\bDelta}{{\boldsymbol{\Delta}}}
+\newcommand{\bEpsilon}{{\boldsymbol{E}}}
+\newcommand{\bZeta}{{\boldsymbol{Z}}}
+\newcommand{\bEta}{{\boldsymbol{H}}}
+\newcommand{\bTheta}{{\boldsymbol{\Theta}}}
+\newcommand{\bIota}{{\boldsymbol{I}}}
+\newcommand{\bKappa}{{\boldsymbol{K}}}
+\newcommand{\bLambda}{{\boldsymbol{\Lambda}}}
+\newcommand{\bMu}{{\boldsymbol{M}}}
+\newcommand{\bNu}{{\boldsymbol{N}}}
+\newcommand{\bXi}{{\boldsymbol{\Xi}}}
+\newcommand{\bOmicron}{{\boldsymbol{O}}}
+\newcommand{\bPi}{{\boldsymbol{\Pi}}}
+\newcommand{\bRho}{{\boldsymbol{P}}}
+\newcommand{\bSigma}{{\boldsymbol{\Sigma}}}
+\newcommand{\bTau}{{\boldsymbol{T}}}
+\newcommand{\bUpsilon}{{\boldsymbol{\Upsilon}}}
+\newcommand{\bPhi}{{\boldsymbol{\Phi}}}
+\newcommand{\bChi}{{\boldsymbol{X}}}
+\newcommand{\bPsi}{{\boldsymbol{\Psi}}}
+\newcommand{\bOmega}{{\boldsymbol{\Omega}}}
+
+% Define commands for calligraphic upper-case letters in math mode
+\newcommand{\cA}{\mathcal{A}}
+\newcommand{\cB}{\mathcal{B}}
+\newcommand{\cC}{\mathcal{C}}
+\newcommand{\cD}{\mathcal{D}}
+\newcommand{\cE}{\mathcal{E}}
+\newcommand{\cF}{\mathcal{F}}
+\newcommand{\cG}{\mathcal{G}}
+\newcommand{\cH}{\mathcal{H}}
+\newcommand{\cI}{\mathcal{I}}
+\newcommand{\cJ}{\mathcal{J}}
+\newcommand{\cK}{\mathcal{K}}
+\newcommand{\cL}{\mathcal{L}}
+\newcommand{\cM}{\mathcal{M}}
+\newcommand{\cN}{\mathcal{N}}
+\newcommand{\cO}{\mathcal{O}}
+\newcommand{\cP}{\mathcal{P}}
+\newcommand{\cQ}{\mathcal{Q}}
+\newcommand{\cR}{\mathcal{R}}
+\newcommand{\cS}{\mathcal{S}}
+\newcommand{\cT}{\mathcal{T}}
+\newcommand{\cU}{\mathcal{U}}
+\newcommand{\cV}{\mathcal{V}}
+\newcommand{\cW}{\mathcal{W}}
+\newcommand{\cX}{\mathcal{X}}
+\newcommand{\cY}{\mathcal{Y}}
+\newcommand{\cZ}{\mathcal{Z}}
+
+% Define commands for fraktur upper-case letters in math mode
+\newcommand{\fA}{\mathfrak{A}}
+\newcommand{\fB}{\mathfrak{B}}
+\newcommand{\fC}{\mathfrak{C}}
+\newcommand{\fD}{\mathfrak{D}}
+\newcommand{\fE}{\mathfrak{E}}
+\newcommand{\fF}{\mathfrak{F}}
+\newcommand{\fG}{\mathfrak{G}}
+\newcommand{\fH}{\mathfrak{H}}
+\newcommand{\fI}{\mathfrak{I}}
+\newcommand{\fJ}{\mathfrak{J}}
+\newcommand{\fK}{\mathfrak{K}}
+\newcommand{\fL}{\mathfrak{L}}
+\newcommand{\fM}{\mathfrak{M}}
+\newcommand{\fN}{\mathfrak{N}}
+\newcommand{\fO}{\mathfrak{O}}
+\newcommand{\fP}{\mathfrak{P}}
+\newcommand{\fQ}{\mathfrak{Q}}
+\newcommand{\fR}{\mathfrak{R}}
+\newcommand{\fS}{\mathfrak{S}}
+\newcommand{\fT}{\mathfrak{T}}
+\newcommand{\fU}{\mathfrak{U}}
+\newcommand{\fV}{\mathfrak{V}}
+\newcommand{\fW}{\mathfrak{W}}
+\newcommand{\fX}{\mathfrak{X}}
+\newcommand{\fY}{\mathfrak{Y}}
+\newcommand{\fZ}{\mathfrak{Z}}
+
+
+% Define commands for fraktur upper-case letters in math mode
+\newcommand{\sA}{\mathscr{A}}
+\newcommand{\sB}{\mathscr{B}}
+\newcommand{\sC}{\mathscr{C}}
+\newcommand{\sD}{\mathscr{D}}
+\newcommand{\sE}{\mathscr{E}}
+\newcommand{\sF}{\mathscr{F}}
+\newcommand{\sG}{\mathscr{G}}
+\newcommand{\sH}{\mathscr{H}}
+\newcommand{\sI}{\mathscr{I}}
+\newcommand{\sJ}{\mathscr{J}}
+\newcommand{\sK}{\mathscr{K}}
+\newcommand{\sL}{\mathscr{L}}
+\newcommand{\sM}{\mathscr{M}}
+\newcommand{\sN}{\mathscr{N}}
+\newcommand{\sO}{\mathscr{O}}
+\newcommand{\sP}{\mathscr{P}}
+\newcommand{\sQ}{\mathscr{Q}}
+\newcommand{\sR}{\mathscr{R}}
+\newcommand{\sS}{\mathscr{S}}
+\newcommand{\sT}{\mathscr{T}}
+\newcommand{\sU}{\mathscr{U}}
+\newcommand{\sV}{\mathscr{V}}
+\newcommand{\sW}{\mathscr{W}}
+\newcommand{\sX}{\mathscr{X}}
+\newcommand{\sY}{\mathscr{Y}}
+\newcommand{\sZ}{\mathscr{Z}}
+
+% Define commands for lower-case letters with vector accents in math mode
+\newcommand{\va}{\vec{a}}
+\newcommand{\vb}{\vec{b}}
+\newcommand{\vc}{\vec{c}}
+\newcommand{\vd}{\vec{d}}
+\newcommand{\ve}{\vec{e}}
+\newcommand{\vf}{\vec{f}}
+\let\vg\undefined \newcommand{\vg}{\vec{g}} % ESAIM
+\newcommand{\vh}{\vec{h}}
+\newcommand{\vi}{\vec{i}}
+\newcommand{\vj}{\vec{j}}
+\newcommand{\vk}{\vec{k}}
+\newcommand{\vl}{\vec{l}}
+\newcommand{\vm}{\vec{m}}
+\newcommand{\vn}{\vec{n}}
+\newcommand{\vo}{\vec{o}}
+\newcommand{\vp}{\vec{p}}
+\newcommand{\vq}{\vec{q}}
+\newcommand{\vr}{\vec{r}}
+\newcommand{\vs}{\vec{s}}
+\newcommand{\vt}{\vec{t}}
+\newcommand{\vu}{\vec{u}}
+\let\vv\undefined \newcommand{\vv}{\vec{v}} % jnsao
+\newcommand{\vw}{\vec{w}}
+\newcommand{\vx}{\vec{x}}
+\newcommand{\vy}{\vec{y}}
+\newcommand{\vz}{\vec{z}}
+
+% Define commands for upper-case letters with vector accents in math mode
+\newcommand{\vA}{\vec{A}}
+\newcommand{\vB}{\vec{B}}
+\newcommand{\vC}{\vec{C}}
+\newcommand{\vD}{\vec{D}}
+\newcommand{\vE}{\vec{E}}
+\newcommand{\vF}{\vec{F}}
+\newcommand{\vG}{\vec{G}}
+\newcommand{\vH}{\vec{H}}
+\newcommand{\vI}{\vec{I}}
+\newcommand{\vJ}{\vec{J}}
+\newcommand{\vK}{\vec{K}}
+\newcommand{\vL}{\vec{L}}
+\newcommand{\vM}{\vec{M}}
+\newcommand{\vN}{\vec{N}}
+\newcommand{\vO}{\vec{O}}
+\newcommand{\vP}{\vec{P}}
+\newcommand{\vQ}{\vec{Q}}
+\newcommand{\vR}{\vec{R}}
+\newcommand{\vS}{\vec{S}}
+\newcommand{\vT}{\vec{T}}
+\newcommand{\vU}{\vec{U}}
+\newcommand{\vV}{\vec{V}}
+\newcommand{\vW}{\vec{W}}
+\newcommand{\vX}{\vec{X}}
+\newcommand{\vY}{\vec{Y}}
+\newcommand{\vZ}{\vec{Z}}
+
+% Define commands for numbers 0, 1 with vector accents in math mode
+\newcommand{\vnull}{{\vec{0}}}
+\newcommand{\vone}{{\vec{1}}}
+
+% Define commands for lower-case Greek letters with vector accents in math mode
+\newcommand{\valpha}{{\vec{\alpha}}}
+\newcommand{\vbeta}{{\vec{\beta}}}
+\newcommand{\vgamma}{{\vec{\gamma}}}
+\newcommand{\vdelta}{{\vec{\delta}}}
+\newcommand{\vepsilon}{{\vec{\epsilon}}}
+\newcommand{\vvarepsilon}{{\vec{\varepsilon}}}
+\newcommand{\vzeta}{{\vec{\zeta}}}
+\newcommand{\veta}{{\vec{\eta}}}
+\newcommand{\vtheta}{{\vec{\theta}}}
+\newcommand{\vvartheta}{{\vec{\vartheta}}}
+\newcommand{\viota}{{\vec{\iota}}}
+\newcommand{\vkappa}{{\vec{\kappa}}}
+\newcommand{\vvarkappa}{{\vec{\varkappa}}}
+\newcommand{\vlambda}{{\vec{\lambda}}}
+\newcommand{\vmu}{{\vec{\mu}}}
+\newcommand{\vnu}{{\vec{\nu}}}
+\newcommand{\vomicron}{\vec{o}}
+\newcommand{\vxi}{{\vec{\xi}}}
+\newcommand{\vpi}{{\vec{\pi}}}
+\newcommand{\vvarpi}{{\vec{\varpi}}}
+\newcommand{\vrho}{{\vec{\rho}}}
+\newcommand{\vvarrho}{{\vec{\varrho}}}
+\newcommand{\vsigma}{{\vec{\sigma}}}
+\newcommand{\vvarsigma}{{\vec{\varsigma}}}
+\newcommand{\vtau}{{\vec{\tau}}}
+\newcommand{\vupsilon}{{\vec{\upsilon}}}
+\newcommand{\vphi}{{\vec{\phi}}}
+\newcommand{\vvarphi}{{\vec{\varphi}}}
+\newcommand{\vchi}{{\vec{\chi}}}
+\newcommand{\vpsi}{{\vec{\psi}}}
+\newcommand{\vomega}{{\vec{\omega}}}
+
+% Define commands for upper-case Greek letters with vector accents in math mode
+\newcommand{\vAlpha}{{\vec{A}}}
+\newcommand{\vBeta}{{\vec{B}}}
+\newcommand{\vGamma}{{\vec{\Gamma}}}
+\newcommand{\vDelta}{{\vec{\Delta}}}
+\newcommand{\vEpsilon}{{\vec{E}}}
+\newcommand{\vZeta}{{\vec{Z}}}
+\newcommand{\vEta}{{\vec{H}}}
+\newcommand{\vTheta}{{\vec{\Theta}}}
+\newcommand{\vIota}{{\vec{I}}}
+\newcommand{\vKappa}{{\vec{K}}}
+\newcommand{\vLambda}{{\vec{\Lambda}}}
+\newcommand{\vMu}{{\vec{M}}}
+\newcommand{\vNu}{{\vec{N}}}
+\newcommand{\vOmicron}{\vec{O}}
+\newcommand{\vXi}{{\vec{\Xi}}}
+\newcommand{\vPi}{{\vec{\Pi}}}
+\newcommand{\vRho}{{\vec{P}}}
+\newcommand{\vSigma}{{\vec{\Sigma}}}
+\newcommand{\vTau}{{\vec{T}}}
+\newcommand{\vUpsilon}{{\vec{\Upsilon}}}
+\newcommand{\vPhi}{{\vec{\Phi}}}
+\newcommand{\vChi}{{\vec{X}}}
+\newcommand{\vPsi}{{\vec{\Psi}}}
+\newcommand{\vOmega}{{\vec{\Omega}}}
+
+% Define commands for some blackboard characters in math mode, mainly used for sets
+\newcommand{\bbA}{\mathbb{A}}
+\newcommand{\bbB}{\mathbb{B}}
+\newcommand{\bbC}{\mathbb{C}}
+\newcommand{\bbD}{\mathbb{D}}
+\newcommand{\bbE}{\mathbb{E}}
+\newcommand{\bbF}{\mathbb{F}}
+\newcommand{\bbG}{\mathbb{G}}
+\newcommand{\bbH}{\mathbb{H}}
+\newcommand{\bbI}{\mathbb{I}}
+\newcommand{\bbJ}{\mathbb{J}}
+\newcommand{\bbK}{\mathbb{K}}
+\newcommand{\bbL}{\mathbb{L}}
+\newcommand{\bbM}{\mathbb{M}}
+\newcommand{\bbN}{\mathbb{N}}
+\newcommand{\bbO}{\mathbb{O}}
+\newcommand{\bbP}{\mathbb{P}}
+\newcommand{\bbQ}{\mathbb{Q}}
+\newcommand{\bbR}{\mathbb{R}}
+\newcommand{\bbS}{\mathbb{S}}
+\newcommand{\bbT}{\mathbb{T}}
+\newcommand{\bbU}{\mathbb{U}}
+\newcommand{\bbV}{\mathbb{V}}
+\newcommand{\bbW}{\mathbb{W}}
+\newcommand{\bbX}{\mathbb{X}}
+\newcommand{\bbY}{\mathbb{Y}}
+\newcommand{\bbZ}{\mathbb{Z}}
+
+\ifthenelse{\boolean{mathsemantics@syntax@shortbb}}{
+ \providecommand{\C}{\bbC}%
+ \providecommand{\K}{\bbK}%
+ \providecommand{\N}{\bbN}%
+ \providecommand{\Q}{\bbQ}%
+ \providecommand{\R}{\bbR}%
+ \providecommand{\Z}{\bbZ}%
+}{}
+
+
+% Define \enclose command
+% \enclose[a]{b}{c}{d} encloses content (c) in brackets (b,d) where the optional parameter
+% a scales the brackets (big, Big, bigg, Bigg) or (auto)matically scales them.
+% It can also be set to [none] do deactivate the brackets/enclosing
+% \enclosespacing allows for additional spacing before and after the \enclose:d content
+% https://blag.nullteilerfrei.de/2014/01/16/a-dynamic-bracketing-macro-in-latex/
+% The \enclose command is mainly meant for internal use; use \paren instead
+\newcommand{\enclspacing}{}
+\newcommand{\enclose}[4][]{%
+ \ifthenelse{\isempty{#1}}%
+ {\ifthenelse{\equal{#2}{.}}{}{#2}\enclspacing#3\enclspacing#4}%
+ {\ifthenelse{\equal{#1}{auto}}% given auto
+ {\mathopen{}\left#2\enclspacing#3\enclspacing\mathclose{}\right#4}%
+ {\ifthenelse{\equal{#1}{none}}% given none
+ {#3}%
+ {\csname#1l\endcsname#2\enclspacing#3\enclspacing\csname#1r\endcsname#4}%
+ }% end auto
+ }% end #1 empty
+}
+
+% Define \encloseSet command to do { c | e }
+% \enclose[a]{b}{c}{d}{e}{f} encloses content c and e in brackets (b,f) with a center delimiter d, where the optional parameter
+% a scales the brackets (big, Big, bigg, Bigg) or (auto)matically scales them
+% \enclosespacingSet allows for additional spacing before and after the center delimiter, the outer brackets gain a \encloseSpacing as \enclose:
+% https://blag.nullteilerfrei.de/2014/01/16/a-dynamic-bracketing-macro-in-latex/
+% The \enclose command is mainly meant for internal use; use \paren instead
+\newcommand{\enclspacingSet}{\,}
+\newcommand{\encloseSet}[6][]{%
+ \ifthenelse{\isempty{#1}}%
+ {#2\enclspacing#3 \enclspacingSet#4\enclspacingSet #5\enclspacing#6}%
+ {\ifthenelse{\equal{#1}{auto}}%
+ {\left#2\enclspacing#3\enclspacingSet\middle#4\enclspacingSet#5\right#6}%
+ {\csname#1l\endcsname#2\enclspacing#3\enclspacingSet\csname#1\endcsname#4\enclspacingSet#5\enclspacing\csname#1r\endcsname#6}%
+ }%
+ }
+
+% Define \paren command
+% \paren[a]bc{d} encloses content (d) in brackets b,c where the optional parameter
+% a scales the brackets
+\newcommand{\paren}[4][]{\enclose[#1]{#2}{#4}{#3}}
+
+% Define the \clap (complementing \{l,r}lap) and \math{l,c,r}lap commands,
+% which horizontally smash the argument with alignment
+% http://www.tug.org/TUGboat/Articles/tb22-4/tb72perlS.pdf
+\def\clap#1{\hbox to 0pt{\hss#1\hss}}
+\def\mathllap{\mathpalette\mathllapinternal}
+\def\mathrlap{\mathpalette\mathrlapinternal}
+\def\mathclap{\mathpalette\mathclapinternal}
+\def\mathllapinternal#1#2{\llap{$\mathsurround=0pt#1{#2}$}}
+\def\mathrlapinternal#1#2{\rlap{$\mathsurround=0pt#1{#2}$}}
+\def\mathclapinternal#1#2{\clap{$\mathsurround=0pt#1{#2}$}}
+
+% Define the \mrep[a]{b}{c} command, which prints b but reserves the space for c.
+% The optional argument a specifies the alignment {l,c,r}. The command works in text and math modes.
+% https://groups.google.com/forum/?fromgroups#!topic/comp.text.tex/GikFchXJIM0
+\def\my@mathpalette#1#2#3#4{\mathchoice{#1\displaystyle{#2}{#3}{#4}}{#1\textstyle{#2}{#3}{#4}}{#1\scriptstyle{#2}{#3}{#4}}{#1\scriptscriptstyle{#2}{#3}{#4}}}
+\def\mrepinternal#1#2#3#4{\makebox[\widthof{$#1#4$}][#2]{$#1\vphantom{#4}{#3}$}}
+\newcommand{\mrep}[3][l]{\ifmmode\my@mathpalette\mrepinternal{#1}{#2}{#3}\else\makebox[\widthof{#3}][#1]{\vphantom{#3}#2}\fi} \ No newline at end of file