%% This is part of OpTeX project, see http://petr.olsak.net/optex \_codedecl \magstep {Macros from plain TeX <2020-02-14>} % preloaded in format \_chardef\_active = 13 \_def\_dospecials {\do\ \do\\\do\{\do\}\do\$\do\&% \do\#\do\^\do\^^K\do\^^A\do\%\do\~} \_public \dospecials \active ; \_def \_magstephalf{1095 } \_def \_magstep#1{\_ifcase#1 1000\_or 1200\_or 1440\_or 1728\_or 2074\_or 2488\_fi\_space} \_public \magstephalf \magstep ; \_def\_normalbaselines{\_lineskip=\_normallineskip \_baselineskip=\_normalbaselineskip \_lineskiplimit=\_normallineskiplimit} \_def\_frenchspacing{\_sfcode`\.=1000 \sfcode`\?=1000 \sfcode`\!=1000 \sfcode`\:=1000 \sfcode`\;=1000 \sfcode`\,=1000 } \_def\_nonfrenchspacing{\_sfcode`\.=3000 \sfcode`\?=3000 \sfcode`\!=3000 \sfcode`\:=2000 \sfcode`\;=1500 \sfcode`\,=1250 } \_public \normalbaselines \frenchspacing \nonfrenchspacing ; \_normalbaselines % baseline setting \_def\^^M{\ } % control = control \_def\^^I{\ } % same for \_def\lq{`} \def\rq{'} \_def\lbrack{[} \_def\rbrack{]} \_chardef\active=13 % \catcode`\^^L=\active \outer\def^^L{\par} % ascii form-feed is "\outer\par" % obsolete \_let\_endgraf=\_par \_let\_endline=\_cr \_public \endgraf \endline ; % In \obeylines, we say `\let^^M=\par' instead of `\def^^M{\par}' % since this allows, for example, `\let\par=\cr \obeylines \halign{...' {\_catcode`\^^M=13 % these lines must end with % \_gdef\_obeylines{\_catcode`\^^M=13\_let^^M\_par}% \_global\_let^^M=\par} % this is in case ^^M appears in a \write \_def\_obeyspaces{\_catcode`\ =13 } {\_obeyspaces\_global\_let =\_space} \_public \obeylines \obeyspaces ; \_protected\_def\_thinspace {\_kern .16667em } \_protected\_def\_negthinspace {\_kern-.16667em } \_protected\_def\_enspace {\_kern.5em } \_protected\_def\_enskip {\_hskip.5em\_relax} \_protected\_def\_quad {\_hskip1em\_relax} \_protected\_def\_qquad {\_hskip2em\_relax} \_protected\_def\_smallskip {\_vskip\_smallskipamount} \_protected\_def\_medskip {\_vskip\_medskipamount} \_protected\_def\_bigskip {\_vskip\_bigskipamount} \_def\_nointerlineskip {\_prevdepth=-1000pt } \_def\_offinterlineskip {\_baselineskip=-1000pt \_lineskip=0pt \_lineskiplimit=\_maxdimen} \_public \thinspace \negthinspace \enspace \enskip \quad \qquad \smallskip \medskip \bigskip \nointerlineskip \offinterlineskip ; \_def\_topglue {\_nointerlineskip\_vglue-\_topskip\_vglue} % for top of page \_def\_vglue {\_afterassignment\_vglA \_skip0=} \_def\_vglA {\_par \_dimen0=\prevdepth \_hrule height0pt \_nobreak\_vskip\_skip0 \_prevdepth=\_dimen0 } \_def\_hglue {\_afterassignment\_hglA \_skip0=} \_def\_hglA {\_leavevmode \_count255=\_spacefactor \_vrule width0pt \_nobreak\_hskip\_skip0 \_spacefactor=\_count255 } \_protected\def~{\penalty10000 \ } % tie \_protected\_def\_slash {/\_penalty\_exhyphenpenalty} % a `/' that acts like a `-' \_public \topglue \vglue \hglue \slash ; \_protected\_def \_break {\_penalty-10000 } \_protected\_def \_nobreak {\_penalty10000 } \_protected\_def \_allowbreak {\_penalty0 } \_protected\_def \_filbreak {\_par\_vfil\_penalty-200\_vfilneg} \_protected\_def \_goodbreak {\_par\_penalty-500 } \_protected\_def \_eject {\_par\_break} \_protected\_def \_supereject {\_par\_penalty-20000 } \_protected\_def \_dosupereject {\_ifnum \_insertpenalties>0 % something is being held over \_line{}\_kern-\_topskip \_nobreak \_vfill \_supereject \_fi} \_def \_removelastskip {\_ifdim\_lastskip=0pt \_else \_vskip-\_lastskip \_fi} \_def \_smallbreak {\_par\_ifdim\_lastskip<\_smallskipamount \_removelastskip \_penalty-50 \_smallskip \_fi} \_def \_medbreak {\_par\_ifdim\_lastskip<\_medskipamount \_removelastskip \_penalty-100 \_medskip \_fi} \_def \_bigbreak {\_par\_ifdim\_lastskip<\_bigskipamount \_removelastskip \_penalty-200 \_bigskip \_fi} \_public \break \nobreak \allowbreak \filbreak \goodbreak \eject \supereject \dosupereject \removelastskip \smallbreak \medbreak \bigbreak ; \_def \_line {\_hbox to\_hsize} \_def \_leftline #1{\_line{#1\_hss}} \_def \_rightline #1{\_line{\_hss#1}} \_def \_centerline #1{\_line{\_hss#1\_hss}} \_def \_rlap #1{\_hbox to0pt{#1\_hss}} \_def \_llap #1{\_hbox to0pt{\_hss#1}} \_public \line \leftline \rightline \centerline \rlap \llap ; \_def\_underbar #1{$\_setbox0=\_hbox{#1}\dp0=0pt \_math \_underline{\_box0}$} \_public \underbar ; \_newbox\_strutbox \_setbox\_strutbox=\_hbox{\_vrule height8.5pt depth3.5pt width0pt} \_def \_strut {\_relax\_ifmmode\_copy\_strutbox\_else\_unhcopy\_strutbox\_fi} \_public \strutbox \strut ; \_def \_hidewidth {\_hskip\_hideskip} % for alignment entries that can stick out \_def \_ialign{\_everycr={}\_tabskip=\_zoskip \_halign} % initialized \halign \_newcount\_mscount \_def \_multispan #1{\_omit \_mscount=#1\_relax \_loop \_ifnum\_mscount>1 \_spanA \_repeat} \_def \_spanA {\_span\_omit \_advance\_mscount by-1 } \_public \hidewidth \ialign \multispan ; % tabbing macros ommited \_def \_hang {\_hangindent\_parindent} \_def \_textindent #1{\_indent\_llap{#1\_enspace}\_ignorespaces} \_def \_item {\_par\_hang\_textindent} \_def \_itemitem {\_par\_indent \_hangindent2\_parindent \_textindent} \_def \_narrower {\_advance\_leftskip\_parindent \_advance\_rightskip\_parindent} \_def \_raggedright {\_rightskip=0pt plus2em \_spaceskip=.3333em \_xspaceskip=.5em\_relax} \_def \_ttraggedright {\_tt \_rightskip=0pt plus2em\_relax} % for use with \tt only \_public \hang \textindent \item \itemitem \narrower \raggedright \ttraggedright ; %\chardef\%=`\% \_let\% = \_pcent % more natural, can be used in lua codes. \_chardef\&=`\& \_chardef\#=`\# \_chardef\$=`\$ \_chardef\ss="FF \_chardef\ae="E6 \_chardef\oe="F7 \_chardef\o="F8 \_chardef\AE="C6 \_chardef\OE="D7 \_chardef\O="D8 \_chardef\i="11 \chardef\j="12 % dotless letters \_chardef\aa="E5 \_chardef\AA="C5 \_chardef\S="9F \_def\l{\_errmessage{\_usedirectly ł}} \_def\L{\_errmessage{\_usedirectly Ł}} \def\_{\_ifmmode \_kern.06em \_vbox{\hrule width.3em}\_else _\fi} % obsolete \_def\dag{\_errmessage{\_usedirectly †}} \_def\ddag{\_errmessage{\_usedirectly ‡}} %\_def\copyright{\_errmessage{\_usedirectly ©}} \_def\copyright{©} %\_def\Orb{\_mathhexbox20D} % obsolete (part of Copyright) %\_def\P{\_mathhexbox27B} % obsolete \_def \_usedirectly #1{Load Unicoded font by \string\fontfam\space and use directly #1} \_def \_leavevmode {\_unhbox\_voidbox} % begins a paragraph, if necessary \_def \_mathhexbox #1#2#3{\_leavevmode \_hbox{$\_math \_mathchar"#1#2#3$}} \_public \leavevmode \mathhexbox ; \_def \_oalign #1{\_leavevmode\_vtop{\_baselineskip=0pt \_lineskip=.25ex \_ialign{##\_crcr#1\_crcr}}} \_def \_oalignA {\_lineskiplimit=0pt \_oalign} \_def \_ooalign {\_lineskiplimit=-\_maxdimen \_oalign} % chars over each other \_def \_shiftx #1{\_dimen0=#1\_kern\_ea\_ignorept \_the\_fontdimen1\_font \_dimen0 } % kern by #1 times the current slant \_def \d #1{{\_oalignA{\_relax#1\_crcr\_hidewidth\_shiftx{-1ex}.\_hidewidth}}} \_def \b #1{{\_oalignA{\_relax#1\_crcr\_hidewidth\_shiftx{-3ex}% \_vbox to.2ex{\_hbox{\_char\_macron}\_vss}\_hidewidth}}} \_def \_c #1{{\_setbox0=\_hbox{#1}\_ifdim\_ht0=1ex\_accent\_cedilla #1% \_else\_ooalign{\_unhbox0\_crcr\_hidewidth\_cedilla\_hidewidth}\_fi}} \_def\_dots{\_relax\_ifmmode\_ldots\_else$\_math\_ldots\_thinsk$\_fi} \_public \oalign \ooalign \d \b \c \dots ; \def \_oldaccents {% \_def\`##1{{\_accent\_tgrave ##1}}% \_def\'##1{{\_accent\_tacute ##1}}% \_def\v##1{{\_accent\_caron ##1}}% \_def\u##1{{\_accent\_tbreve ##1}}% \_def\=##1{{\_accent\_macron ##1}}% \_def\^##1{{\_accent\_circumflex ##1}}% \_def\.##1{{\_accent\_dotaccent ##1}}% \_def\H##1{{\_accent\_hungarumlaut ##1}}% \_def\~##1{{\_accent\_ttilde ##1}}% \_def\"##1{{\_accent\_dieresis ##1}}% \_def\r##1{{\_accent\_ring ##1}}% } \_public \oldaccents ; % ec-lmr encoding (will be changed after \fontfam macro): \_chardef\_tgrave=0 \_chardef\_tacute=1 \_chardef\_circumflex=2 \_chardef\_ttilde=3 \_chardef\_dieresis=4 \_chardef\_hungarumlaut=5 \_chardef\_ring=6 \_chardef\_caron=7 \_chardef\_tbreve=8 \_chardef\_macron=9 \_chardef\_dotaccent=10 \_chardef\_cedilla=11 \_def \_uniaccents {% accents with Unicode \_chardef\_tgrave="0060 \_chardef\_tacute="00B4 \_chardef\_circumflex="005E \_chardef\_ttilde="02DC \_chardef\_dieresis="00A8 \_chardef\_hungarumlaut="02DD \_chardef\_ring="02DA \_chardef\_caron="02C7 \_chardef\_tbreve="02D8 \_chardef\_macron="00AF \_chardef\_dotaccent="02D9 \_chardef\_cedilla="00B8 \_chardef\_ogonek="02DB \_let \_uniaccents=\_relax } \_def \_hrulefill {\_leaders\_hrule\_hfill} \_def \_dotfill {\_cleaders\_hbox{$\_math \_mkern1.5mu.\_mkern1.5mu$}\_hfill} \_def \_rightarrowfill {$\_math\_smash-\_mkern-7mu% \_cleaders\_hbox{$\_mkern-2mu\_smash-\_mkern-2mu$}\_hfill \_mkern-7mu\_mathord\_rightarrow$} \_def \_leftarrowfill {$\_math\_mathord\_leftarrow\_mkern-7mu% \_cleaders\_hbox{$\_mkern-2mu\_smash-\_mkern-2mu$}\_hfill \_mkern-7mu\_smash-$} \_public \hrulefill \dotfill \rightarrowfill \leftarrowfill ; % \_downbracefil \_upbracefil will be re-defined when Unicode-math is used \_mathchardef \_braceld="37A \_mathchardef \_bracerd="37B \_mathchardef \_bracelu="37C \_mathchardef \_braceru="37D \_def \downbracefill {$\_math \_setbox0=\_hbox{$\_braceld$}% \_braceld \_leaders\_vrule height\_ht0 depth0pt \_hfill \_braceru \_bracelu \_leaders\_vrule height\_ht0 depth0pt \_hfill \_bracerd$} \_def \upbracefill {$\_math \_setbox0=\_hbox{$\_braceld$}% \_bracelu \_leaders\_vrule height\_ht0 depth0pt \_hfill \_bracerd \_braceld \_leaders\_vrule height\_ht0 depth0pt \_hfill \_braceru$} \_def \_magnification {\_afterassignment \_magA \_count255 } \_def \_magA {\_mag=\_count255 \_truedimen\_hsize \_truedimen\_vsize \_dimen\_footins=8truein } % only for backward compatibility, but \margins macro is preferred. \_public \magnification ; \_def \_showhyphens #1{\_setbox0=\_vbox{\_parfillskip=0pt \_hsize=\_maxdimen \_tenrm \_pretolerance=-1 \tolerance=-1 \hbadness=0 \showboxdepth=0 \ #1}} \_def \_bye {\_par \_vfill \_supereject \_end} \_public \bye ; \_endcode % ------------------------------------- All macros from plain TeX are rewritten here. Differences are mentioned in the documentation below. The `\dospecials` works like in plin TeX but does nothing with `_`. If you need to do the same with this character, you can re-define: \begtt \addto \dospecials{\do\_} \endtt The shortcuts like `\chardef\@one` is not defined in \OpTeX/. Use normal numbers instead of such obscurities. The `\magstep` is defined with \space, no with \relax, in order to be expandable. The `\strutbox` is declared as 10pt size dependent (like in plainTeX), but the macro `\setbaselineskip` (from OPmac) redefines it. Few character codes are set for backward compatibility. But old obscurities (from plain TeX) are not supported -- an error message about directly using of the desired character is prepared instead). User can re-define the control sequences `\l`, `\L`, `\aa`, `\copyright` etc. of course. The accents commands like `\v`, `\.`, `\H`, etc. are not defined. Use the accented characters directly -- it is best solution. But you can use the macro `\oldaccents` which defines accented macros.