diff options
author | Norbert Preining <norbert@preining.info> | 2020-05-07 03:01:09 +0000 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2020-05-07 03:01:09 +0000 |
commit | 56bd1f5b8377f54b4af39a114362a7762d27f13c (patch) | |
tree | 882c573288f2a3f158b490ea3de1672fca9e94a9 /macros/luatex/optex/base/alloc.opm | |
parent | 36d8a5cd45b5a96007208a0d5b1f52e708d0fec8 (diff) |
CTAN sync 202005070301
Diffstat (limited to 'macros/luatex/optex/base/alloc.opm')
-rw-r--r-- | macros/luatex/optex/base/alloc.opm | 165 |
1 files changed, 165 insertions, 0 deletions
diff --git a/macros/luatex/optex/base/alloc.opm b/macros/luatex/optex/base/alloc.opm new file mode 100644 index 0000000000..7e03ae77b7 --- /dev/null +++ b/macros/luatex/optex/base/alloc.opm @@ -0,0 +1,165 @@ +%% This is part of OpTeX project, see http://petr.olsak.net/optex + +\_codedecl \newdimen {Allocators for registers <2020-01-23>} % loaded in format + + \_doc ----------------------------- + The limits are set first. + \_cod ----------------------------- + +\_chardef\_maicount = 65535 % Max Allocation Index for counts registers in LuaTeX +\_let\_maidimen = \_maicount +\_let\_maiskip = \_maicount +\_let\_maimuskip = \_maicount +\_let\_maibox = \_maicount +\_let\_maitoks = \_maicount +\_chardef\_mairead = 15 +\_chardef\_maiwrite = 15 +\_chardef\_maifam = 255 + + \_doc ----------------------------- + Each allocation macro needs its own counter. + \_cod ----------------------------- + +\_countdef\_countalloc=10 \_countalloc=255 +\_countdef\_dimenalloc=11 \_dimenalloc=255 +\_countdef\_skipalloc=12 \_skipalloc=255 +\_countdef\_muskipalloc=13 \_muskipalloc=255 +\_countdef\_boxalloc=14 \_boxalloc=255 +\_countdef\_toksalloc=15 \_toksalloc=255 +\_countdef\_readalloc=16 \_readalloc=-1 +\_countdef\_writealloc=17 \_writealloc=-1 +\_countdef\_mathalloc=18 \_mathalloc=3 + + \_doc ----------------------------- + The common allocation macro + \`\_allocator` `\<sequence> {<type>} \<primitive declarator>` + is defined. This idea was used in classical plain \TeX/ by + Donald Knuth too but the macro from plain \TeX/ seems to be + more complicated:). + \_cod ----------------------------- + +\_def\_allocator #1#2#3{% + \_global\_advance\_cs{_#2alloc}by1 + \_ifnum\_cs{_#2alloc}>\_cs{_mai#2}% + \_errmessage{No room for a new \_ea\_string\_csname #2\_endcsname}% + \_else + \_global#3#1=\_cs{_#2alloc}% + \_wlog{\_string#1=\_ea\_string\_csname #2\_endcsname\_the\_cs{_#2alloc}}% + \_fi +} + + \_doc ----------------------------- + The allocation macros + \`\newcount`, \`\newdimen`, \`\newskip`, \`\newmuskip`, \`\newbox`, + \`\newtoks`, \`\newread`, \`\newwrite` and \`\newmath` + are defined here. + \_cod ----------------------------- + +\_def\_newcount #1{\_allocator #1{count}\_countdef} +\_def\_newdimen #1{\_allocator #1{dimen}\_dimendef} +\_def\_newskip #1{\_allocator #1{skip}\_skipdef} +\_def\_newmuskip #1{\_allocator #1{muskip}\_muskipdef} +\_def\_newbox #1{\_allocator #1{box}\_chardef} +\_def\_newtoks #1{\_allocator #1{toks}\_toksdef} +\_def\_newread #1{\_allocator #1{read}\_chardef} +\_def\_newwrite #1{\_allocator #1{write}\_chardef} +\_def\_newmath #1{\_allocator #1{fam}\_chardef} + +\_public \newcount \newdimen \newskip \newmuskip \newbox \newtoks \newread \newwrite \newmath ; + + \_doc ----------------------------- + The \`\newinsert` macro is defined differently than others. + \_cod ----------------------------- + +\_newcount\_insertalloc \_insertalloc=255 +\_chardef\_insertmin = 201 + +\_def\_newinsert #1{% + \_advance\_insertalloc by-1 + \_ifnum\_insertalloc <\_insertmin + \_errmessage {No room for a new \_string\insert}% + \_else + \_global\_chardef#1=\_insertalloc + \_wlog {\_string#1=\_string\_insert\_the\_insertalloc}% + \_fi +} +\_public \newinsert ; + + \_doc ----------------------------- + Other allocation macros \`\newattribute` and \`\newcatodetable` + have their counter allocated by the `\newcount` macro. + \_cod ----------------------------- + +\_newcount \_attributealloc \_attributealloc=0 +\_chardef\_maiattribute=\_maicount +\_def\_newattribute #1{\_allocator #1{attribute}\_attributedef} + +\_newcount \_catcodetablealloc \_catcodetablealloc=10 +\_chardef\_maicatcodetable=32767 +\_def\_newcatcodetable #1{\_allocator #1{catcodetable}\_chardef} + +\_public \newattribute \newcatcodetable ; + + \_doc ----------------------------- + We declare public and private versions of `\tmpnum` and `\tmpdim` + registers separately. They are independent registers. + \_cod ----------------------------- + +\_newcount \tmpnum \_newcount \_tmpnum +\_newdimen \tmpdim \_newdimen \_tmpdim + + \_doc ----------------------------- + A few registers are initialized like in plain\TeX/. Note that `\z@` and `\z@skip` from + plain\TeX/ is `\zo` and `\zoskip` because we absolutely + don't support the `@` category dance. + Note that `\p@` is not defined because we can write 1pt which is more + legible. + \_cod ----------------------------- + +\_newdimen\_maxdimen \_maxdimen=16383.99999pt % the largest legal <dimen> +\_newskip\_hideskip \_hideskip=-1000pt plus 1fill % negative but can grow +\_newskip\_centering \_centering=0pt plus 1000pt minus 1000pt +\_newskip\_zoskip \_zoskip=0pt plus0pt minus0pt +\_newbox\_voidbox % permanently void box register + +\_public \maxdimen \hideskip \centering \zoskip \voidbox ; + +\_endcode %--------------------------------------------------- + +Like plain\TeX, the allocators `\newcount`, `\newwrite`, etc. are defined. +The registers are allocated from 256 to the `\_mai<type>` which is 65535 in +\LuaTeX/. + +Unlike in Plain\TeX/, the mentioned allocators are not `\outer`. + +User can use `\dimen0` to `\dimen200` and similarly for `\skip`, +`\muskip`, `\box` and `\toks` directly. User can use +`\count20` to `\count200` directly too. This is the same +philosophy like in old plain\TeX/, but the range of directly used registers +is wider. + +Inserts are allocated form 254 to 201 using `\newinsert`. + +You can define your own allocation concept (for example for allocation of +arrays) from top of registers array. The example shows a definition of +the array-like declarator of counters. + +\nobreak +\begtt +\newcount \_maicount % redefine maximal allocation index as variable +\_maicount = \maicount % first value is top of the array + +\def\newcountarray #1[#2]{% \newcountarray \foo[100] + \advance\_maicount by -#2\relax + \ifnum \_countalloc > \_maicount + \errmessage{No room for a new array of \string\count}% + \else + \chardef#1=\_maicount + \fi +} +\def\usecount #1[#2]{% \usecount \foo[2] + \count\numexpr#1+#2\relax +} +\endtt + + |