summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/source/luatex/luatexbase/luatexbase-regs.dtx
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/source/luatex/luatexbase/luatexbase-regs.dtx')
-rw-r--r--Master/texmf-dist/source/luatex/luatexbase/luatexbase-regs.dtx485
1 files changed, 485 insertions, 0 deletions
diff --git a/Master/texmf-dist/source/luatex/luatexbase/luatexbase-regs.dtx b/Master/texmf-dist/source/luatex/luatexbase/luatexbase-regs.dtx
new file mode 100644
index 00000000000..313af007c97
--- /dev/null
+++ b/Master/texmf-dist/source/luatex/luatexbase/luatexbase-regs.dtx
@@ -0,0 +1,485 @@
+% \iffalse meta-comment
+%
+% Written in 2009, 2010 by Manuel Pégourié-Gonnard and Élie Roux.
+% <mpg@elzevir.fr>
+% <elie.roux@telecom-bretagne.eu>
+%
+% This work is under the CC0 license.
+%
+% This work consists of the main source file luatexbase-regs.dtx
+% and the derived files
+% luatexbase-regs.pdf luatexbase-regs.sty
+% test-regs-plain.tex test-regs-latex.tex
+%
+% Unpacking:
+% tex luatexbase-regs.dtx
+% Documentation:
+% pdflatex luatexbase-regs.dtx
+%
+% The class ltxdoc loads the configuration file ltxdoc.cfg
+% if available. Here you can specify further options, e.g.
+% use A4 as paper format:
+% \PassOptionsToClass{a4paper}{article}
+%
+%<*ignore>
+\begingroup
+ \def\x{LaTeX2e}%
+\expandafter\endgroup
+\ifcase 0\ifx\install y1\fi\expandafter
+ \ifx\csname processbatchFile\endcsname\relax\else1\fi
+ \ifx\fmtname\x\else 1\fi\relax
+\else\csname fi\endcsname
+%</ignore>
+%<*install>
+\input docstrip.tex
+
+\keepsilent
+\askforoverwritefalse
+
+\preamble
+
+Written in 2009, 2010 by Manuel Pegourie-Gonnard and Elie Roux.
+
+This work is under the CC0 license.
+See source file '\inFileName' for details.
+
+\endpreamble
+
+\generate{%
+ \usedir{tex/luatex/luatexbase}%
+ \file{luatexbase-regs.sty}{\from{luatexbase-regs.dtx}{texpackage}}%
+}
+
+\generate{%
+ \usedir{doc/luatex/luatexbase}%
+ \file{test-regs-plain.tex}{\from{luatexbase-regs.dtx}{testplain}}%
+ \file{test-regs-latex.tex}{\from{luatexbase-regs.dtx}{testlatex}}%
+}
+
+\obeyspaces
+\Msg{************************************************************************}
+\Msg{*}
+\Msg{* To finish the installation you have to move the following}
+\Msg{* files into a directory searched by TeX:}
+\Msg{*}
+\Msg{* luatexbase-regs.sty}
+\Msg{*}
+\Msg{* Happy TeXing!}
+\Msg{*}
+\Msg{************************************************************************}
+
+\endbatchfile
+%</install>
+%<*ignore>
+\fi
+%</ignore>
+%<*driver>
+\NeedsTeXFormat{LaTeX2e}
+\documentclass{ltxdoc}
+\input lltxb-dtxstyle.tex
+\EnableCrossrefs
+\CodelineIndex
+\begin{document}
+ \DocInput{luatexbase-regs.dtx}%
+\end{document}
+%</driver>
+% \fi
+%
+% \CheckSum{0}
+%
+% \CharacterTable
+% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
+% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
+% Digits \0\1\2\3\4\5\6\7\8\9
+% Exclamation \! Double quote \" Hash (number) \#
+% Dollar \$ Percent \% Ampersand \&
+% Acute accent \' Left paren \( Right paren \)
+% Asterisk \* Plus \+ Comma \,
+% Minus \- Point \. Solidus \/
+% Colon \: Semicolon \; Less than \<
+% Equals \= Greater than \> Question mark \?
+% Commercial at \@ Left bracket \[ Backslash \\
+% Right bracket \] Circumflex \^ Underscore \_
+% Grave accent \` Left brace \{ Vertical bar \|
+% Right brace \} Tilde \~}
+%
+% \title{The \pk{luatexbase-regs} package}
+% \date{v0.2 2010/05/12}
+% \author{%
+% Manuel P\'egouri\'e-Gonnard \\ \email{mpg@elzevir.fr} \and
+% \'Elie Roux \\ \email{elie.roux@telecom-bretagne.eu}}
+%
+% \maketitle
+%
+% \begin{abstract}
+% This package extends the register allocation scheme of \plaintex and
+% \latex to take advantage of the increased number of registers available in
+% \luatex.
+% \end{abstract}
+%
+% \tableofcontents
+%
+% \section{Documentation}
+%
+% Since the \plaintex and \latex formats are both frozen, they fail to take
+% into account the extended resources provided by newer \tex-like engines.
+% This package focuses on the allocation scheme for registers. \texe provides
+% $6$ kinds or registers: count, dimen, skip, muskip, box and toks and has
+% $256$ registers of each kind. \eTeX\ and most of its descendants add one
+% kind of register (marks) and offers $2^{15} = 32768$ of each kind. \luatex
+% provides $2^{16} = 65536$ registers of each kind. (It also provides new
+% register-like resources, but this package addresses only the resources
+% inherited from \eTeX.)
+%
+% More precisely, \pk{luatexbase-regs} loads the \pk{etex} package (or
+% makes sure it is preloaded in the format) and then adapts it to the new
+% limits of \luatex. Thus, all macros defined by the \pk{etex} package are
+% made available (most notably, |\loccount|, |\globcountblk|,
+% |\loccountblk| and alike). However, if a register of some kind has been
+% locally allocated before this package is loaded, then the number of
+% allocatable registers of this kind will not be extended to $65536$. To avoid
+% this, load \pk{luatexbase-regs} earlier.
+%
+% The \plaintex and \latex formats define a new kind of resource:
+% \emph{inserts} which are merely a family (count, dimen, skip, box) of
+% registers with the same number. Inserts allocation begins at $255$ and goes
+% toward $0$. Thus we can make room for more inserts by making allocation of
+% count-, dimen-, skip- and box-registers start from $256$. With real \etex,
+% it may be a bad idea since registers with index greater than $256$ have
+% degraded performance due to implementation details, but with \luatex the
+% performance is uniform, so we just do it.
+%
+% \section{Implementation}
+%
+% \begin{macrocode}
+%<*texpackage>
+% \end{macrocode}
+%
+% \subsection{Preliminaries}
+%
+% Reload protection, especially for \plaintex.
+%
+% \begin{macrocode}
+ \csname lltxb@regs@loaded\endcsname
+\expandafter\let\csname lltxb@regs@loaded\endcsname\endinput
+% \end{macrocode}
+%
+% Catcode defenses.
+%
+% \begin{macrocode}
+\begingroup
+ \catcode123 1 % {
+ \catcode125 2 % }
+ \catcode 35 6 % #
+ \toks0{}%
+ \def\x{}%
+ \def\y#1 #2 {%
+ \toks0\expandafter{\the\toks0 \catcode#1 \the\catcode#1}%
+ \edef\x{\x \catcode#1 #2}}%
+ \y 123 1 % {
+ \y 125 2 % }
+ \y 35 6 % #
+ \y 10 12 % ^^J
+ \y 34 12 % "
+ \y 36 3 % $ $
+ \y 39 12 % '
+ \y 40 12 % (
+ \y 41 12 % )
+ \y 42 12 % *
+ \y 43 12 % +
+ \y 44 12 % ,
+ \y 45 12 % -
+ \y 46 12 % .
+ \y 47 12 % /
+ \y 60 12 % <
+ \y 61 12 % =
+ \y 64 11 % @ (letter)
+ \y 62 12 % >
+ \y 95 12 % _ (other)
+ \y 96 12 % `
+ \edef\y#1{\endgroup\edef#1{\the\toks0\relax}\x}%
+\expandafter\y\csname lltxb@regs@AtEnd\endcsname
+% \end{macrocode}
+%
+% Package declaration.
+%
+% \begin{macrocode}
+\begingroup
+ \expandafter\ifx\csname ProvidesPackage\endcsname\relax
+ \def\x#1[#2]{\immediate\write16{Package: #1 #2}}
+ \else
+ \let\x\ProvidesPackage
+ \fi
+\expandafter\endgroup
+\x{luatexbase-regs}[2010/05/12 v0.2 Registers allocation for LuaTeX]
+% \end{macrocode}
+%
+% Make sure \luatex is used.
+%
+% \begin{macrocode}
+\begingroup\expandafter\expandafter\expandafter\endgroup
+\expandafter\ifx\csname RequirePackage\endcsname\relax
+ \input ifluatex.sty
+\else
+ \RequirePackage{ifluatex}
+\fi
+\ifluatex\else
+ \begingroup
+ \expandafter\ifx\csname PackageWarningNoLine\endcsname\relax
+ \def\x#1#2{\begingroup\newlinechar10
+ \immediate\write16{Package #1 warning: #2}\endgroup}
+ \else
+ \let\x\PackageWarningNoLine
+ \fi
+ \expandafter\endgroup
+ \x{luatexbase-regs}{LuaTeX is required for this package. Aborting.}
+ \lltxb@regs@AtEnd
+ \expandafter\endinput
+\fi
+% \end{macrocode}
+%
+% \subsection{Ensure etex.sty is loaded}
+%
+% If running \latex, load \file{etex.sty}. If not, either
+% \file{etex.src} was loaded at format generation time, or we cannot do
+% anything.
+%
+% \begin{macrocode}
+\begingroup\expandafter\expandafter\expandafter\endgroup
+\expandafter\ifx\csname RequirePackage\endcsname\relax \else
+ \RequirePackage{etex}[1998/03/26]
+\fi
+% \end{macrocode}
+%
+% To the best of my (mpg) knowledge, all Plain-based formats built with
+% \etex-enabled engines in \texlive load \file{etex.src}. However,
+% let's be careful and check that \file{etex.sty} or \file{etex.src} is
+% loaded.
+%
+% \begin{macrocode}
+\begingroup\expandafter\expandafter\expandafter\endgroup
+\expandafter\ifx\csname et@xins\endcsname\relax
+ \begingroup
+ \expandafter\ifx\csname PackageWarningNoLine\endcsname\relax
+ \def\x#1#2{\begingroup\newlinechar10
+ \immediate\write16{Package #1 warning: #2}\endgroup}
+ \else
+ \let\x\PackageWarningNoLine
+ \fi
+ \expandafter\endgroup
+ \x{luatexbase-regs}{etex macros not loaded!^^J
+ Registers allocation scheme will not be extended.}
+\else
+% \end{macrocode}
+%
+% \subsection{Adapt range}
+%
+% First, increase the upper bound for all kinds of registers. Copy code to
+% avoid defining a macro.
+%
+% \begin{macrocode}
+ \ifnum\count270=32768 \count270=65536 \fi
+ \ifnum\count271=32768 \count271=65536 \fi
+ \ifnum\count272=32768 \count272=65536 \fi
+ \ifnum\count273=32768 \count272=65536 \fi
+ \ifnum\count273=32768 \count273=65536 \fi
+ \ifnum\count274=32768 \count274=65536 \fi
+ \ifnum\count275=32768 \count275=65536 \fi
+ \ifnum\count276=32768 \count276=65536 \fi
+% \end{macrocode}
+%
+% \subsection{Patch macros that used \cs{mathchardef}}
+%
+% |\box| registers and |\mark|s were previously defined
+% using |\mathchardef| since it had the biggest range under \etex
+% (15-bit number). However, this is not enough for \luatex's extended
+% registers. Fortunately, |\chardef|'s range is extended, and now large
+% enough, so use it everywhere instead of |\mathchardef|. Do this
+% inside a group and use |\toks0| to store the list of actions.
+%
+% \begin{macrocode}
+ \begingroup \toks0{}
+ \def\@namedef #1{\expandafter \def\csname#1\endcsname}
+ \def\@outerdef#1{\expandafter\outer\expandafter\def\csname#1\endcsname}
+% \end{macrocode}
+%
+% Notice that the auxiliary macros will automatically expand to the desired
+% level when necessary, see below.
+%
+% First, here are the definitions from \file{etex.src}, in a form adapted
+% to our needs.
+%
+% \begin{macrocode}
+ \def\def@globbox #1#2{\@outerdef{#1}{\et@xglob 4 \box #2}}
+ \def\def@locbox #1#2{\@namedef {#1}{\et@xloc 4 \box #2}}
+ \def\def@globmarks #1#2{\@outerdef{#1}{\et@xglob 6 \marks #2}}
+ \def\def@locmarks #1#2{\@namedef {#1}{\et@xloc 6 \marks #2}}
+ \def\def@et@xgblk#1#2{\@namedef{#1}##1##2##3##4%
+ {\et@xchkblk ##1##2{##4}%
+ {\allocationnumber=\count 26##1
+ \global \advance \count 26##1 by ##4%
+ \global #2##3=\allocationnumber
+ \wlog {\string ##3=\string ##2blk{\number ##4}
+ at \the \allocationnumber}%
+ }%
+ }}
+ \def\def@et@xlblk#1#2{\@namedef{#1}##1##2##3##4%
+ {\et@xchkblk ##1##2{##4}%
+ {\advance \count 27##1 by -##4%
+ \allocationnumber=\count 27##1
+ #2##3=\allocationnumber
+ \wlog {\string ##3=\string ##2blk{\number ##4}
+ at \the \allocationnumber \space (local)%
+ }%
+ }%
+ }}
+% \end{macrocode}
+%
+% Then, the definitions from \file{etex.sty} since they are subtly
+% different (|\outer| status, but also optional spaces or |=|
+% signs).
+%
+% \begin{macrocode}
+ \def\alt@globbox #1#2{\@namedef{#1}{\et@xglob 4\box #2}}
+ \def\alt@locbox #1#2{\@namedef{#1}{\et@xloc 4\box #2}}
+ \def\alt@globmarks #1#2{\@namedef{#1}{\et@xglob 6\marks #2}}
+ \def\alt@locmarks #1#2{\@namedef{#1}{\et@xloc 6\marks #2}}
+ \def\alt@et@xgblk#1#2{\@namedef{#1}##1##2##3##4%
+ {\et@xchkblk##1##2{##4}%
+ {\allocationnumber\count26##1%
+ \global\advance\count26##1by##4%
+ \global#2##3\allocationnumber
+ \wlog{\string##3=\string##2blk{\number##4} at
+ \the\allocationnumber}%
+ }%
+ }}
+ \def\alt@et@xlblk#1#2{\@namedef{#1}##1##2##3##4%
+ {\et@xchkblk##1##2{##4}%
+ {\advance\count27##1-##4%
+ \allocationnumber\count27##1%
+ #2##3\allocationnumber
+ \et@xwlog{\string##3=\string##2blk{\number##4} at
+ \the\allocationnumber\space(local)}%
+ }%
+ }}
+% \end{macrocode}
+%
+% Now, a macro checking the definitions, and making the appropriate
+% re-definition.
+%
+% \begin{macrocode}
+ \def\check@def#1{%
+ \csname def@#1\endcsname{test@#1}\mathchardef
+ \expandafter\ifx\csname test@#1\expandafter\endcsname
+ \csname #1\endcsname
+ \expandafter\let\csname #1\endcsname\relax
+ \toks0\expandafter{\the\toks0\csname def@#1\endcsname{#1}\chardef}
+ \else
+ \csname alt@#1\endcsname{test@#1}\mathchardef
+ \expandafter\ifx\csname test@#1\expandafter\endcsname
+ \csname #1\endcsname
+ \toks0\expandafter{\the\toks0\csname alt@#1\endcsname{#1}\chardef}
+ \else
+ \expandafter\show\csname BAD#1\endcsname
+ \fi
+ \fi}
+% \end{macrocode}
+%
+% Now, actually do it.
+%
+% \begin{macrocode}
+ \check@def{globbox}
+ \check@def{locbox}
+ \check@def{globmarks}
+ \check@def{locmarks}
+ \check@def{et@xgblk}
+ \check@def{et@xlblk}
+ \expandafter \endgroup
+ \the\toks0
+% \end{macrocode}
+%
+% \subsection{Make room for inserts}
+%
+% Finally, make allocation of |\count|, |\dimen|, |skip| and
+% |\box| start with numbers $>255$, in order to free the lower numbers
+% for insertions. Be careful with |\new...| macros which are
+% |\outer| in Plain, since we're in the middle of an |\if| test.
+%
+% \begin{macrocode}
+ \expandafter\let\csname newcount\endcsname\globcount
+ \expandafter\let\csname newdimen\endcsname\globdimen
+ \expandafter\let\csname newskip\endcsname\globskip
+ \expandafter\let\csname newbox\endcsname\globbox
+\fi
+% \end{macrocode}
+%
+% That's all folks!
+%
+% \begin{macrocode}
+\lltxb@regs@AtEnd
+%</texpackage>
+% \end{macrocode}
+%
+% \section{Test files}
+%
+% Here we test only the two main formats: \plaintex (with \file{etex.src}
+% loaded) and \latex, both with the \luatex engine. Those correspond to
+% the \cmdname{luatex} and \cmdname{lualatex} commands in \texlive.
+%
+% We want to make sure we can globally and locally allocate $30000$
+% registers of each kind, and still globally allocate $100$ |\insert|s.
+% Next we globally allocate a bloc of $3000$ registers of each kind, and
+% locally a block of $1000$. (Those numbers are not optimal, but they
+% should be enough for testing purposes.)
+%
+% \begin{macrocode}
+%<testplain>\input luatexbase-regs.sty
+%<testlatex>\RequirePackage{luatexbase-regs}
+%<*testplain,testlatex>
+\def\checkregister#1{%
+ \edef\newregister{\expandafter\noexpand\csname new#1\endcsname}%
+ \edef\locregister{\expandafter\noexpand\csname loc#1\endcsname}%
+ \count0 1
+ \loop
+ \newregister\dummy
+ \locregister\dummy
+ \ifnum\count0<30000
+ \advance\count0 1
+ \repeat}
+\checkregister{count}
+\checkregister{dimen}
+\checkregister{skip}
+\checkregister{muskip}
+\checkregister{box}
+\checkregister{toks}
+\checkregister{marks}
+
+\count0 1
+\loop \ifnum\count0<100
+ \csname newinsert\endcsname\dummy
+ \advance\count0 1
+\repeat
+
+\globcountblk \dummy{3000}
+\globdimenblk \dummy{3000}
+\globskipblk \dummy{3000}
+\globmuskipblk\dummy{3000}
+\globboxblk \dummy{3000}
+\globtoksblk \dummy{3000}
+\globmarksblk \dummy{3000}
+
+\loccountblk \dummy{1000}
+\locdimenblk \dummy{1000}
+\locskipblk \dummy{1000}
+\locmuskipblk \dummy{1000}
+\locboxblk \dummy{1000}
+\loctoksblk \dummy{1000}
+\locmarksblk \dummy{1000}
+%</testplain,testlatex>
+%<testplain>\bye
+%<testlatex>\stop
+% \end{macrocode}
+%
+%
+% \Finale
+\endinput