% \iffalse meta-comment % % Written in 2009, 2010 by Manuel Pégourié-Gonnard and Élie Roux. % % % % This work is under the CC0 license. % % This work consists of the main source file luatexbase-cctb.dtx % and the derived files % luatexbase-cctb.sty luatexbase.cctb.lua % test-cctb-plain.tex test-cctb-latex.tex % % Unpacking: % tex luatexbase-cctb.dtx % Documentation: % pdflatex luatexbase-cctb.dtx % %<*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 % %<*install> \input docstrip.tex \keepsilent \askforoverwritefalse \let\MetaPrefix\relax \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 \let\MetaPrefix\DoubleperCent \generate{% \usedir{tex/luatex/luatexbase}% \file{luatexbase-cctb.sty}{\from{luatexbase-cctb.dtx}{texpackage}}% } \generate{% \usedir{doc/luatex/luatexbase}% \file{test-cctb-plain.tex}{\from{luatexbase-cctb.dtx}{testplain}}% \file{test-cctb-latex.tex}{\from{luatexbase-cctb.dtx}{testlatex}}% } \def\MetaPrefix{-- } \def\luapostamble{% \MetaPrefix^^J% \MetaPrefix\space End of File `\outFileName'.% } \def\currentpostamble{\luapostamble}% \generate{% \usedir{tex/luatex/luatexbase}% \file{luatexbase.cctb.lua}{\from{luatexbase-cctb.dtx}{luamodule}}% } \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-cctb.sty luatexbase.cctb.lua} \Msg{*} \Msg{* Happy TeXing!} \Msg{*} \Msg{************************************************************************} \endbatchfile % %<*ignore> \fi % %<*driver> \documentclass{ltxdoc} \input{lltxb-dtxstyle} \begin{document} \DocInput{luatexbase-cctb.dtx}% \end{document} % % \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-cctb} package} % \date{v0.1 2010-03-26} % \author{% % Manuel P\'egouri\'e-Gonnard \\ \texttt{mpg@elzevir.fr} \and % \'Elie Roux \\ \texttt{elie.roux@telecom-bretagne.eu}} % % \maketitle % % \begin{abstract} % In addition to the registers existing in \tex and \etex, \luatex introduces % a new concept: catcode tables. This package takes care of catcode table % allocation just like Plain TeX and LaTeX do for other registers. % \end{abstract} % % \section{Documentation} % % The main macro defined here is |\newluatexcatcodetable|. It behaves the same % as |\newbox|. Additonally, the newly allocated catcode table is initialised % to the catcodes of Ini\tex. In order to help you define the catcode tables % (once they are allocated), two helper macros are available. % % \begin{quote} % \cs{luatexsetcatcoderange}\marg{from}\marg{to}\marg{value} % \end{quote} % Set all characters code in the range \meta{from}--\meta{to} to the given % catcode \meta{value}. % % \begin{quote} % \cs{setluatexcatcodetable}\marg{table}\marg{catcode statements} % \end{quote} % Set a previously allocated \meta{table} to the catcodes given by executing % \meta{catcode statements}. Note that \meta{table} must not be the current % active catcode table. You may, however, load another catcode table in your % \meta{catcode statements}. % % For your convenience, a few catcode tables are prefined: % \begin{itemize} % \item |\CatcodeTableIniTeX|: Ini\tex catcodes. % \item |\CatcodeTableString|: the catcode regime used by |\string| and % |\meaning|: everything has catcode 12, except space (U+0020) that has % catcode 10. % \item |\CatcodeTableOther|: everything (included space) has catcode 12. % \item |\CatcodeTableLaTeX|: basic \LaTeXe\ catcodes. % \item |\CatcodeTableLaTeXAtLetter|: same as above, but |@| is a letter. % \item |\CatcodeTableExpl|: catcodes used by \latex{}3 with |\ExplSyntaxOn|. % Be aware that this does not provide the exact same environment as % |\ExplSyntaxOn|: most noticibly, some booleans are not set, and % |\endlinechar| is not adjusted (it should be 32). % \end{itemize} % % Various Lua function accept a catcode table number as argument. In order to % use them, the package writer needs to know the number of an allocated % catcode table. Since |\chardef| is used for the definition of the control % sequence, this is rather easy to do. However, for extra ease of use, the % numbers are also directly accessible from Lua as the value of the table % |luatextra.catcodetables|, whose keys is the name of the control sequence % (without any leading backslash). Moreover, nickames are available for the % predefined catcode tables: % \begin{itemize} % \item |CatcodeTableIniTeX| = |ini|, % \item |CatcodeTableString| = |string|, % \item |CatcodeTableOther| = |other|, % \item |CatcodeTableLaTeX| = |latex|, % \item |CatcodeTableLaTeXAtLetter| = |latex-atletter| = |latex-package|, % \item |CatcodeTableExpl| = |expl| = |expl3|, % \end{itemize} % % \section{Implementation} % % \subsection{\tex package} % % \begin{macrocode} %<*texpackage> % \end{macrocode} % % \subsubsection{Preliminaries} % % Reload protection, especially for \plaintex. % % \begin{macrocode} \csname lltxb@cctb@loaded\endcsname \expandafter\let\csname lltxb@cctb@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@cctb@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-cctb}[2010/03/26 v0.1 Catcodetable allocation for LuaTeX (mpg)] % \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-cctb}{LuaTeX is required for this package. Aborting.} \lltxb@cctb@AtEnd \expandafter\endinput \fi % \end{macrocode} % % \subsubsection{Main content} % % Load the supporting Lua module. % % \begin{macrocode} \begingroup\expandafter\expandafter\expandafter\endgroup \expandafter\ifx\csname RequirePackage\endcsname\relax \input luatexbase-loader.sty \else \RequirePackage{luatexbase-loader} \fi \directlua{require('luatexbase.cctb.lua')} % \end{macrocode} % % The allocation macro. Allocate tables starting with 1, since table 0 is % reserved for IniTeX catcodes by LuaTeX. % % \begin{macrocode} \newcount\lltxb@catcodetable@alloc \lltxb@catcodetable@alloc\z@ \def\newluatexcatcodetable#1{% \ifnum\lltxb@catcodetable@alloc<65535\relax \global\advance\lltxb@catcodetable@alloc\@ne \allocationnumber\lltxb@catcodetable@alloc \global\chardef#1\allocationnumber \luatexinitcatcodetable\allocationnumber \begingroup\escapechar\m@ne \expandafter\endgroup \directlua{luatextra.catcodetabledef_from_tex( '\luatexluaescapestring{\string#1}', '\number\allocationnumber')}% \wlog{\string#1=\string\luatexcatcodetable\the\allocationnumber}% \else \errmessage{No room for a new \string\luatexcatcodetable}% \fi} % \end{macrocode} % % A small patch to get two new counters in Plain too. % % \begin{macrocode} \expandafter\ifx\csname @tempcnta\endcsname\relax \csname newcount\endcsname\@tempcnta \fi \expandafter\ifx\csname @tempcntb\endcsname\relax \csname newcount\endcsname\@tempcntb \fi % \end{macrocode} % % Set the catcodes for a range of characters. % % \begin{macrocode} \def\luatexsetcatcoderange#1#2#3{% \edef\luaSCR@temp{% \noexpand\@tempcnta=\the\@tempcnta \noexpand\@tempcntb=\the\@tempcntb \noexpand\count@=\the\count@ \relax}% \@tempcnta=#1\relax \@tempcntb=#2\relax \count@=#3\relax \loop\unless\ifnum\@tempcnta>\@tempcntb \catcode\@tempcnta=\count@ \advance\@tempcnta\@ne \repeat \luaSCR@temp} % \end{macrocode} % % Set a catcode table. % % \begin{macrocode} \def\setluatexcatcodetable#1#2{% \begingroup #2% \luatexsavecatcodetable#1% \endgroup} % \end{macrocode} % % The |IniTeX| catcode table needs no extra initialisation. % % \begin{macrocode} \newluatexcatcodetable\CatcodeTableIniTeX % \end{macrocode} % % The |String| and |Other| catcode tables. % % \begin{macrocode} \newluatexcatcodetable\CatcodeTableString \setluatexcatcodetable\CatcodeTableString{% \luatexcatcodetable\CatcodeTableIniTeX \catcode0 12 % nul \catcode13 12 % carriage return \catcode37 12 % percent \luatexsetcatcoderange{65}{90}{12}% A-Z \luatexsetcatcoderange{97}{122}{12}% a-z \catcode92 12 % backslash \catcode127 12 } % \end{macrocode} % % \begin{macrocode} \newluatexcatcodetable\CatcodeTableOther \setluatexcatcodetable\CatcodeTableOther{% \luatexcatcodetable\CatcodeTableString \catcode32 12 } % \end{macrocode} % % Tables for \LaTeXe. % % \begin{macrocode} \newluatexcatcodetable\CatcodeTableLaTeX \setluatexcatcodetable\CatcodeTableLaTeX{% \luatexcatcodetable\CatcodeTableIniTeX \luatexsetcatcoderange{0}{31}{15}% \catcode9 10 % tab \catcode12 13 % form feed \catcode13 5 % carriage return \catcode35 6 % hash \catcode36 3 % dollar \catcode38 4 % ampersand \catcode94 7 % circumflex \catcode95 8 % underscore \catcode123 1 % brace left \catcode125 2 % brace right \catcode126 13 % tilde \catcode127 15 } % \end{macrocode} % % \begin{macrocode} \newluatexcatcodetable\CatcodeTableLaTeXAtLetter \setluatexcatcodetable\CatcodeTableLaTeXAtLetter{% \luatexcatcodetable\CatcodeTableLaTeX \catcode64=11 } % \end{macrocode} % % A table for \pk{expl3}. % % \begin{macrocode} \newluatexcatcodetable\CatcodeTableExpl \setluatexcatcodetable\CatcodeTableExpl{% \luatexcatcodetable\CatcodeTableLaTeX \catcode126 10 % tilde is a space char \catcode32 9 % space is ignored \catcode9 9 % tab also ignored \catcode95 11 % underscore letter \catcode58 11 % colon letter } % \end{macrocode} % % Finally do the shortcuts. % % \begin{macrocode} \directlua{luatextra.catcodetable_do_shortcuts()} % \end{macrocode} % % That's all, folks! % % \begin{macrocode} \lltxb@cctb@AtEnd % % \end{macrocode} % % \subsection{Lua module} % % \begin{macrocode} %<*luamodule> module('luatextra', package.seeall) % \end{macrocode} % % In the same way, the table \texttt{tex.catcodetablenumber} contains the % numbers of the catcodetables registered with % \texttt{\string\newluacatcodetable}. % % \begin{macrocode} catcodetables = {} tex.catcodetablenumber = catcodetables function catcodetabledef_from_tex(name, number) catcodetables[name] = tonumber(number) end % \end{macrocode} % % With this function we create some shortcuts for a better readability in % lua code. This makes |tex.catcodetablenumber.latex| equivalent to % |tex.catcodetablenumber['CatcodeTableLaTeX']|. % % \begin{macrocode} function catcodetable_do_shortcuts() local cat = luatextra.catcodetables cat['latex'] = cat.CatcodeTableLaTeX cat['latex-package'] = cat.CatcodeTableLaTeXAtLetter cat['latex-atletter'] = cat.CatcodeTableLaTeXAtLetter cat['ini'] = cat.CatcodeTableIniTeX cat['expl3'] = cat.CatcodeTableExpl cat['expl'] = cat.CatcodeTableExpl cat['string'] = cat.CatcodeTableString cat['other'] = cat.CatcodeTableOther end % \end{macrocode} % % \begin{macrocode} % % \end{macrocode} % % \section{Test files} % % The tests done are very basic: we just make sure that the package loads % correctly and the macros don't generate any error, under both LaTeX en % Plain TeX. % % \begin{macrocode} %\input luatexbase-cctb.sty %\RequirePackage{luatexbase-cctb} %<*testplain,testlatex> \newluatexcatcodetable\testcctb \directlua{assert(luatextra.catcodetables.testcctb)} % \end{macrocode} % % Also check that the catcodetable's number is remembered well, % independently of the current value of |\escapechar|. % \begin{macrocode} \begingroup \escapechar64 \newluatexcatcodetable\anothercctb \endgroup \directlua{assert(luatextra.catcodetables.anothercctb)} % \end{macrocode} % % Now, play a little bit with predefined tables. % % \begin{macrocode} \luatexcatcodetable\CatcodeTableLaTeXAtLetter \ifnum\catcode64=11 \else \ERROR \fi \luatexcatcodetable\CatcodeTableLaTeX \ifnum\catcode64=12 \else \ERROR \fi %\documentclass{minimal} \directlua{% tex.sprint('\string\\setbox0=\string\\hbox{') tex.sprint(luatextra.catcodetables.string, "\string\\undef # _^&") tex.sprint('}') } % \end{macrocode} % % \begin{macrocode} % %\bye %\stop % \end{macrocode} % % \Finale \endinput