diff options
Diffstat (limited to 'Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx')
-rw-r--r-- | Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx | 305 |
1 files changed, 163 insertions, 142 deletions
diff --git a/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx b/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx index b510b1036ce..2fddc7e68e3 100644 --- a/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx +++ b/Master/texmf-dist/source/latex/l3kernel/l3bootstrap.dtx @@ -57,7 +57,7 @@ \begingroup \catcode 32 = 10 % \GetIdInfoAuxI - } + }% % \end{macrocode} % A first check for a completely empty \textsc{svn} field. If that is % not the case, there is a second case when a file created using @@ -90,7 +90,7 @@ \fi \tempa \GetIdInfoLog - } + }% % \end{macrocode} % Here, |#1| is |Id|, |#2| is the file name, |#3| is the extension, % |#4| is the version, |#5| is the check in date and |#6| is the check in @@ -119,14 +119,14 @@ }% \fi \tempa - } + }% % \end{macrocode} % Convert an \textsc{svn}-style date into a \LaTeX{}-style one. % \begin{macrocode} \csname protected\endcsname\gdef\GetIdInfoAuxIII$#1-#2-#3$% {% \def\ExplFileDate{#1/#2/#3}% - } + }% % \end{macrocode} % During loading of \pkg{expl3}, module information is added to the log. % This function gets redefined once loading is complete. @@ -138,15 +138,15 @@ L3 Module: \ExplFileName\space \ExplFileDate\space v\ExplFileVersion\space \ExplFileDescription - } - } + }% + }% \endgroup % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} -\GetIdInfo$Id: l3bootstrap.dtx 6213 2015-10-18 09:48:17Z joseph $ - {L3 Bootstrap code} +\GetIdInfo$Id: l3bootstrap.dtx 6320 2015-12-15 09:49:47Z joseph $ + {L3 Bootstrap code}% %</driver|package> %<*driver> \documentclass[full]{l3doc} @@ -267,10 +267,10 @@ % some pretty basic character codes set up. % \begin{macrocode} %<*initex> -\catcode `\{ = 1 \relax -\catcode `\} = 2 \relax -\catcode `\# = 6 \relax -\catcode `\^ = 7 \relax +\catcode `\{ = 1\relax +\catcode `\} = 2\relax +\catcode `\# = 6\relax +\catcode `\^ = 7\relax %</initex> % \end{macrocode} % @@ -278,7 +278,7 @@ % safe side. % \begin{macrocode} %<*initex> -\catcode `\^^I = 10 \relax +\catcode `\^^I = 10\relax %</initex> % \end{macrocode} % @@ -291,7 +291,7 @@ \begingroup\expandafter\expandafter\expandafter\endgroup \expandafter\ifx\csname directlua\endcsname\relax \else - \directlua{tex.enableprimitives("", tex.extraprimitives())} + \directlua{tex.enableprimitives("", tex.extraprimitives())}% \fi %</initex> % \end{macrocode} @@ -325,7 +325,7 @@ %</package> % \end{macrocode} % -% \subsection{The \tn{pdfstrcmp} primitive with \XeTeX{} and \LuaTeX{}} +% \subsection{The \tn{pdfstrcmp} primitive in \XeTeX{}} % % Only \pdfTeX{} has a primitive called \tn{pdfstrcmp}. The \XeTeX{} % version is just \tn{strcmp}, so there is some shuffling to do. As @@ -337,149 +337,74 @@ \fi % \end{macrocode} % -% If \LuaTeX{} is in use then no primitive \tn{pdfstrcmp} is available. -% However, it can be emulated using some Lua code. In earlier versions of -% the code, the \pkg{pdftexcmds} package was loaded to do this task. However, -% that raises some issues in \enquote{generic} (it fails with Con\TeX{}t -% MkIV), and also adds a hardly-needed dependency. Note that \LuaTeX{} -% prior to version $0.36$ is not supported by \pkg{expl3}: here that means -% simply skipping the definition, which will then be picked up later. This -% definition may need to be done twice: one \enquote{now} and once at the -% start of every job. The latter can occur in package mode if for example a -% custom format is being constructed. To achieve this while not requiring a -% separate file, the Lua code is saved into a macro then used twice. -% (In the long term, the Lua code here may be best moved to a separate -% file.) -% -% No macro definition is given just yet: that is left until \pkg{l3basics}. +% \subsection{Loading support \Lua{} code} +% +% When \LuaTeX{} is used there are various pieces of \Lua{} code which need to +% be loaded. The code itself is defined in \pkg{l3luatex} and is extracted into +% a separate file. Thus here the task is to load the \Lua{} code both now and +% (if required) at the start of each job. % \begin{macrocode} -\begingroup - \expandafter\ifx\csname directlua\endcsname\relax +\begingroup\expandafter\expandafter\expandafter\endgroup +\expandafter\ifx\csname directlua\endcsname\relax +\else + \ifnum\luatexversion<70 % \else - \ifnum\luatexversion<36 % - \else - \catcode`\_=11 % - \catcode`\:=11 % - \def\tempa - {% - l3kernel = l3kernel or { } - function l3kernel.strcmp(A, B) - if A == B then - tex.write("0") - elseif A < B then - tex.write("-1") - else - tex.write("1") - end - end - } - \directlua{\tempa} % \end{macrocode} -% A test for \LuaTeX{} in Ini\TeX{} mode. +% In package mode a category code table is needed: either use a pre-loaded +% allocator or provide one using the \LaTeXe{}-based generic code. In format +% mode the table used here can be hard-coded into the \Lua{}. % \begin{macrocode} - \ifnum 0% - \directlua - {% - if status.ini_version then - tex.write("1") - end - }>0 % - \global\everyjob\expandafter - {% - \the\expandafter\everyjob - \expandafter\lua_now_x:n\expandafter{\tempa}% - } - \fi +%<*package> + \begingroup\expandafter\expandafter\expandafter\endgroup + \expandafter\ifx\csname newcatcodetable\endcsname\relax + \input{ltluatex}% \fi - \fi -\endgroup + \newcatcodetable\ucharcat@table + \directlua{ + l3kernel = l3kernel or { } + local charcat_table = \number\ucharcat@table + l3kernel.charcat_table = charcat_table + }% +%</package> + \directlua{require("expl3")}% % \end{macrocode} -% -% \subsection{Emulating \tn{Ucharchar} in \LuaTeX{}} -% -% Expandably creating character tokens can be done in macros but for the -% full Unicode range requires engine support in practical terms. That is -% available in \XeTeX{} as \tn{Ucharcat} but in \LuaTeX{} some Lua code -% is required. That is set up here, following the model above. Note that -% we do not try to emulate the syntax of the primitive (doable with \LuaTeX{} -% 0.80 or later, but not required by our use case). -% -% One minor wrinkle is that a catcode table is needed to return values. -% For format mode, long-term we can simply take an arbitrary one and make -% sure this is never allocated. In package mode use the same approach -% (and table) as \pkg{ucharcat}: look for an allocator and use it if available, -% or use a table unlikely to clash with any other use. We use the same table -% as \pkg{ucharcat} but as this is \enquote{disposable} we are safe. +% As the user might be making a custom format, no assumption is made about +% matching package mode with only loading the \Lua{} code once. Instead, a +% query to \Lua{} will reveal what mode is in operation. % \begin{macrocode} -\begingroup - \expandafter\ifx\csname directlua\endcsname\relax - \else - \ifnum\luatexversion<70 % - \else -%<*initex> - % TEMP - \catcode`\@=11 % - \chardef\ucharcat@table="8000 % -%</initex> -%<*package> - \begingroup\expandafter\expandafter\expandafter\endgroup - \expandafter\ifx\csname newcatcodetable\endcsname\relax - \directlua{tex.enableprimitives("",{"initcatcodetable"})} - \chardef\ucharcat@table"7000 % - \initcatcodetable\ucharcat@table - \else - \newcatcodetable\ucharcat@table - \fi -%</package> - \catcode`\_=11 % - \catcode`\:=11 % - \def\tempa - {% - l3kernel = l3kernel or { } - local utf8_char = unicode.utf8.char - function l3kernel.charcat(charcode, catcode) - tex.setcatcode(\number\ucharcat@table, charcode, catcode) - tex.sprint(\number\ucharcat@table, utf8_char(charcode)) - end - } - \directlua{\tempa} - \ifnum 0% - \directlua - {% - if status.ini_version then - tex.write("1") - end - }>0 % - \global\everyjob\expandafter - {% - \the\expandafter\everyjob - \expandafter\lua_now_x:n\expandafter{\tempa}% - } - \fi + \ifnum 0% + \directlua{ + if status.ini_version then + tex.write("1") + end + }>0 % + \everyjob\expandafter{% + \the\expandafter\everyjob + \csname\detokenize{lua_now_x:n}\endcsname{require("expl3")}% + }% \fi \fi -\endgroup +\fi % \end{macrocode} % % \subsection{Engine requirements} % -% The code currently requires functionality equivalent to \tn{pdfstrcmp} -% in addition to \eTeX{}. This is picked up by testing for the \tn{pdfstrcmp} -% primitive or a version of \LuaTeX{} capable of emulating it. +% The code currently requires \eTeX{} and functionality equivalent to +% \tn{pdfstrcmp}, and also driver and Unicode character support. This is +% available in a reasonably-wide range of engines. % \begin{macrocode} \begingroup \def\next{\endgroup}% \def\ShortText{Required primitives not found}% \def\LongText% {% - LaTeX3 requires the e-TeX primitives and \string\pdfstrcmp.\LineBreak - Direct PDF production also requires additional primitives listed in the - README.\LineBreak + LaTeX3 requires the e-TeX primitives and additional functionality as + described in the README file. \LineBreak These are available in the engines\LineBreak - pdfTeX v1.40\LineBreak - XeTeX v0.9994\LineBreak - - LuaTeX v0.40\LineBreak + - LuaTeX v0.70\LineBreak - e-(u)pTeX mid-2012\LineBreak or later.\LineBreak \LineBreak @@ -523,7 +448,7 @@ \def\PackageError#1#2#3% {% \errhelp{#3}% - \errmessage{#1 Error: #2} + \errmessage{#1 Error: #2}% }% \fi \edef\next @@ -565,15 +490,15 @@ % \begin{macrocode} %<*package> \begingroup - \def\@tempa{LaTeX2e} - \def\next{} + \def\@tempa{LaTeX2e}% + \def\next{}% \ifx\fmtname\@tempa \expandafter\ifx\csname extrafloats\endcsname\relax \def\next {% \RequirePackage{etex}% \csname reserveinserts\endcsname{32}% - } + }% \fi \fi \expandafter\endgroup @@ -581,6 +506,102 @@ %</package> % \end{macrocode} % +% \subsection{Character data} +% +% \TeX{} needs various pieces of data to be set about characters, in particular +% which ones to treat as letters and which \tn{lccode} values apply as these +% affect hyphenation. It makes most sense to set this and related information +% up in one place. Whilst for \LuaTeX{} hyphenation patterns can be read +% anywhere, other engines have to build them into the format and so we +% \emph{must} do this set up before reading the patterns. For the Unicode +% engines, there are shared loaders available to obtain the relevant +% information irectly from the Unicode Consortium data files. These need +% standard (Ini)\TeX{} category codes and primitive availablity and must +% therefore loaded \emph{very} early. This has a knock-on effect on the +% $8$-bit set up: it makes sense to do the defintions for those here as +% well so it is all in one place. +% +% For \XeTeX{} and \LuaTeX{}, which are natively Unicode engines, simply +% load the Unicode data. +% \begin{macrocode} +%<*initex> +\ifdefined\Umathcode + \input load-unicode-data % +\else +% \end{macrocode} +% For the $8$-bit engines an encoding scheme must be chosen. At present, +% this is the EC (|T1|) scheme, with the assumption that languages for which +% this is not appropriate will be used with one of the Unicode engines. +% \begin{macrocode} + \begingroup +% \end{macrocode} +% Lower case chars: map to themselves when lower casing and down by |"20| when +% upper casing. (The characters |a|--|z| are set up correctly by Ini\TeX{}.) +% \begin{macrocode} + \def\temp{% + \ifnum\count0>\count2 % + \else + \global\lccode\count0 = \count0 % + \global\uccode\count0 = \numexpr\count0 - "20\relax + \advance\count0 by 1 % + \expandafter\temp + \fi + } + \count0="A0 % + \count2="BC % + \temp + \count0="E0 % + \count2="FF % + \temp +% \end{macrocode} +% Upper case chars: map up by |"20| when lower casing, to themselves when upper +% casing and require an \tn{sfcode} of $999$. (The characters |A|--|Z| are set +% up correctly by Ini\TeX{}.) +% \begin{macrocode} + \def\temp{% + \ifnum\count0>\count2 % + \else + \global\lccode\count0 = \numexpr\count0 + "20\relax + \global\uccode\count0 = \count0 % + \global\sfcode\count0 = 999 % + \advance\count0 by 1 % + \expandafter\temp + \fi + } + \count0="80 % + \count2="9C % + \temp + \count0="C0 % + \count2="DF % + \temp +% \end{macrocode} +% A few special cases where things are not as one might expect using the above +% pattern: dotless-I, dotless-J, dotted-I and d-bar. +% \begin{macrocode} + \global\lccode`\^^Y = `\^^Y % + \global\uccode`\^^Y = `\I % + \global\lccode`\^^Z = `\^^Z % + \global\uccode`\^^Y = `\J % + \global\lccode"9D = `\i % + \global\uccode"9D = "9D % + \global\lccode"9E = "9E % + \global\uccode"9E = "D0 % +% \end{macrocode} +% Allow hyphenation at a zero-width glyph (used to break up ligatures or +% to place accents between characters). +% \begin{macrocode} + \global\lccode23 = 23 % + \endgroup +\fi +% \end{macrocode} +% In all cases it makes sense to set up |-| to map to itself: this allows +% hyphenation of the rest of a word following it (suggested by +% Lars Helstr\"om). +% \begin{macrocode} +\global\lccode`\-=`\- % +%</initex> +% \end{macrocode} +% % \subsection{The \LaTeX3 code environment} % % The code environment is now set up. @@ -592,7 +613,7 @@ % \cs{ExplSyntaxOn} is used. For format mode, there is no need to save % category codes so that step is skipped. % \begin{macrocode} -\protected\def\ExplSyntaxOff{} +\protected\def\ExplSyntaxOff{}% %<*package> \protected\edef\ExplSyntaxOff {% @@ -608,7 +629,7 @@ \catcode 126 = \the\catcode 126\relax \endlinechar = \the\endlinechar\relax \chardef\csname\detokenize{l__kernel_expl_bool}\endcsname = 0\relax - } + }% %</package> % \end{macrocode} % \end{macro} @@ -630,7 +651,7 @@ % \begin{variable}{\l__kernel_expl_bool} % The status for experimental code syntax: this is on at present. % \begin{macrocode} -\chardef\l__kernel_expl_bool = 1 ~ +\chardef\l__kernel_expl_bool = 1\relax % \end{macrocode} %\end{variable} % |