diff options
Diffstat (limited to 'Master/texmf-dist/tex/context/base/font-uni.tex')
-rw-r--r-- | Master/texmf-dist/tex/context/base/font-uni.tex | 535 |
1 files changed, 535 insertions, 0 deletions
diff --git a/Master/texmf-dist/tex/context/base/font-uni.tex b/Master/texmf-dist/tex/context/base/font-uni.tex new file mode 100644 index 00000000000..09fcf22ea5f --- /dev/null +++ b/Master/texmf-dist/tex/context/base/font-uni.tex @@ -0,0 +1,535 @@ +%D \module +%D [ file=font-uni, +%D version=1999.10.10, +%D title=\CONTEXT\ Font Macros, +%D subtitle=\UNICODE\ Initialization, +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright={PRAGMA / Hans Hagen \& Ton Otten}] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +\writestatus{loading}{Context Font Macros / UNICODE Support} + +%D I wrote this module when Wang Lei asked me how to use +%D Chinese in \CONTEXT. From the samples he sent me, I deduced +%D that some mixture of one and two byte encoding was used, +%D which he confirmed. Since \TEX\ normally does not use the +%D characters $>127$, so as long as the two byte characters +%D have a first character with code $>127$, we can use active +%D characters to handle them. In an optimistic mood, I called +%D this module the \UNICODE\ font module. In the module that +%D handles Chinese, we will see that some more interpretation +%D is involved, which is why the macros handling those +%D characters look ahead. + +\startmessages dutch library: fonts + 21: het is veiliger om (pdf)eTeX te gebruiken +\stopmessages + +\startmessages english library: fonts + 21: using (pdf)eTeX is more save +\stopmessages + +\startmessages german library: fonts + 21: Verwenden von (pdf)eTeX ist sicherer +\stopmessages + +\startmessages italian library: fonts + 21: l'uso di (pdf)eTeX è più sicuro +\stopmessages + +\startmessages norwegian library: fonts + 21: å bruke (pdf)eTeX er tryggere +\stopmessages + +\unprotect + +%D \macros +%D {handleunicodeflowglyph, uchar, +%D handleunicodeglyph, insertunicodeglyph, +%D unicodeposition, unicodeone, unicodetwo} +%D +%D For the moment \UNICODE\ support is rather primitive but +%D nevertheless effective. The reference to \UNICODE\ is not +%D entirely correct, since in many cases one will use \quote +%D {older} mappings, but in principle, \UNICODE\ can be +%D supported. +%D +%D We expect each character to come as two eight bit +%D characters. Those doubles are handled by making all +%D characters in the range $>127$ active, so that they can +%D pick up the next one, and act upon both their values. +%D Internally only numbers are used. A first implementation +%D simply internally prefixed the second part of the \UNICODE\ +%D pair with \type {\string} or \type {\char}, but this was +%D not that handy when it came to testing those values. +%D Because in principle we are dealing with an encoding, the +%D making active is handled in \type {enco-uni}. +%D +%D There are two commands to handle unicode characters: +%D +%D \starttyping +%D \handleunicodeflowglyph{number}{character} +%D \uchar{number}{number} +%D \stoptyping +%D +%D The first one can be assigned to an active character, the +%D second one can be used to directly access a glyph. Both +%D command call \type {\handleunicodeglyph} that in turn +%D calls \type {\insertunicodeglyph}. Both can be overruled +%D in specialized modules. The low level command \type +%D {\unicodeglyph} can best be left untouched, which is not +%D so much a problem because there is a hook into this macro: +%D \type {\unicodecharcommand}. +%D +%D In most cases one will redefine \type {\handleunicodeglyph} +%D in such a way that it identifies special situations first, +%D takes some actions next, calls \type {\insertunicodeglyph}, +%D if needed with \type {\unicodecharcommand} changed, and +%D finally does some finishing: +%D +%D \starttyping +%D \def\handleunicodeglyph +%D {take actions based on \unicodeone-two-position cq. \nextglyph +%D redefine \unicodecharcommand if needed +%D expand \insertunicodeglyph +%D take some final actions} +%D \stoptyping + +\newcount\unicodeposition + +% \def\handleunicodeflowglyph#1#2% +% {\def\dohandleunicodeflowglyph{\dodohandleunicodeflowglyphA{#1}{#2}}% +% \futurelet\nextglyph\dohandleunicodeflowglyph} +% +% %D The first alternative (A) takes a character as second +% %D argument and is used in the primary handler introduced +% %D earlier. +% +% \def\dodohandleunicodeflowglyphA#1#2% +% {\bgroup +% \def\unicodeone{#1}% +% \edef\unicodetwo{\number\expandafter`\string#2}% takes also <128 ! +% \unicodeposition=\unicodeone\unicodetwo\relax +% \handleunicodeglyph +% \egroup} +% +% %D The second alternative (B) takes numbers and is used in +% %D the \type {\uchar} command. This command takes two +% %D decimal numbers. +% +% \def\dodohandleunicodeflowglyphB#1#2% +% {\bgroup +% \def\unicodeone{#1}% +% \def\unicodetwo{#2}% +% \unicodeposition=\unicodeone\unicodetwo\relax +% \handleunicodeglyph +% \egroup} +% +% \unexpanded\def\uchar% +% {\let\nextglyph\relax +% \dodohandleunicodeflowglyphB} + +%D The multistep approach is needed to pick up the second +%D token, since this token can have any value and any +%D catcode. + +%\def\handleunicodeflowglyph#1% +% {\bgroup +% \edef\unicodeone{#1}% +% \@EA\afterassignment\@EA\dohandleunicodeflowglyph +% \@EA\chardef\@EA\nexttoken\@EA`\string} +% +%\def\dohandleunicodeflowglyph +% {\futurelet\nextglyph\dodohandleunicodeflowglyph} +% +%\def\dodohandleunicodeflowglyph% +% {\edef\unicodetwo{\the\nexttoken}% +% \unicodeposition\unicodeone\unicodetwo\relax +% \handleunicodeglyph +% \egroup} + +% the \relax trick prevents eating up the space (needed for +% korean + +\def\handleunicodeflowglyph#1#2% + {\bgroup + \edef\unicodeone{#1}% + \@EA\afterassignment\@EA\dohandleunicodeflowglyph + \@EA\chardef\@EA\nexttoken\@EA`\string#2\relax} + +\def\dohandleunicodeflowglyph\relax + {\futurelet\nextglyph\dodohandleunicodeflowglyph} + +\def\dodohandleunicodeflowglyph + {\edef\unicodetwo{\the\nexttoken}% + \unicodeposition\unicodeone\unicodetwo\relax + \handleunicodeglyph + \egroup} + +\unexpanded\def\uchar#1#2% use as standalone glyph + {\bgroup + \let\nextglyph\relax + \edef\unicodeone{#1}% + \edef\unicodetwo{#2}% +% \unicodeposition=\unicodeone\unicodetwo\relax + \unicodeposition\unicodeone\unicodetwo\relax + \handleunicodeglyph + \egroup} + +%D In \XETEX, unicode support is straightforward, so we +%D simply output a \type {\char} with a 16||bit number. +%D +%D \starttyping +%D \def\uchar#1#2{\char\numexpr(#2+(#1*256))\relax} +%D \stoptyping + +\beginXETEX \uchar + + \unexpanded\def\uchar#1#2{\char\numexpr#2+#1*\@cclvi\relax} + +\endXETEX + +\def\dohandleucflowglyph +% {\unicodeposition=\unicodeone\unicodetwo\relax + {\unicodeposition\unicodeone\unicodetwo\relax + \handleunicodeglyph + \egroup} + +\unexpanded\def\uc#1#2% used in tricky situations + {\bgroup + \edef\unicodeone{#1}% + \edef\unicodetwo{#2}% + \futurelet\nextglyph\dohandleucflowglyph} + +% Alternative, handles [char >127]{number} too. +% +% \def\handleunicodeflowglyph#1% +% {\bgroup +% \edef\unicodeone{#1}% +% \futurelet\nexttoken\dohandleunicodeflowglyph} +% +% \def\dohandleunicodeflowglyph% +% {\ifx\nexttoken\bgroup +% \expandafter\dohandleunicodeflowglyphA +% \else +% \expandafter\dohandleunicodeflowglyphB +% \fi} +% +% \def\dohandleunicodeflowglyphA#1% +% {\chardef\nexttoken=#1\relax +% \dodohandleunicodeflowglyph} +% +% \def\dohandleunicodeflowglyphB% +% {\@EA\afterassignment\@EA\dodohandleunicodeflowglyph +% \@EA\chardef\@EA\nexttoken\@EA=\@EA`\string} +% +% \def\dodohandleunicodeflowglyph% +% {\futurelet\nextglyph\dododohandleunicodeflowglyph} +% +% \def\dododohandleunicodeflowglyph% +% {\edef\unicodetwo{\the\nexttoken}% +% \unicodeposition=\unicodeone\unicodetwo\relax +% \handleunicodeglyph +% \egroup} +% +% Can be used with (the less byte hungry alternative): +% +% sub unirecode +% { my ($a,$b) = @_ ; +% if ((ord($b)<0x80)&&($b !~ /[a-zA-Z0-9]/)) +% { print "$b" ; ++$recoded ; +% #return "\\uc\{" . ord($a) . "\}\{". ord($b) . "\}" } +% return "$a\{". ord($b) . "\}" } +% else +% { return "$a$b" } } + +\def\insertunicodeglyph + {\unicodeglyph\unicodeone\unicodetwo} + +\let\handleunicodeglyph=\insertunicodeglyph + +%D One can use the \type {\unicodeposition} in the macros +%D that handle pre and post material. + +%D \macros +%D {unicodestyle, unicodecharcommand} +%D +%D Each character pair will become one glyph. Because \TEX\ +%D cannot handle fonts with more that 256 characters, we use +%D \TFM\ files for each range. The first character of the pair +%D is appended to the name of a font, and the second is used to +%D access the glyph in that font. This means that a particular +%D font is split up in subfonts with names in the range: +%D +%D \starttyping +%D <filename>80 ... <filename>ff +%D \stoptyping +%D +%D The \type {<filename>} as well as the composed name are +%D mapped ones. The next macros take care of this mapping. +%D Let us assume that the next mapping has taken place, +%D +%D \starttyping +%D \definefontsynonym [UnicodeRegular] [gbsong] +%D \stoptyping +%D +%D Let us also assume that we are dealing with the range \type +%D {b1}. Given that a font name results from: +%D +%D \starttyping +%D \truefontname{\truefontname{UnicodeRegular}b1} +%D \stoptyping +%D +%D we get \type {gbsongb1}. The outer \type {\truefontname} +%D takes care of additional mapping, so when we say: +%D +%D \starttyping +%D \definefontsynonym [gbsongb1] [gbsong-b1] +%D \stoptyping +%D +%D the filename used will be \type {gbsong-b1}. From the next +%D definition it will be clear that other fontshapes are also +%D supported. The prefix \type {Unicode} is mapped! +%D +%D The command \type {\unicodecharcommand} can be used to +%D handle special cases. At that moment \type {1em} is known. + +\def\unicodestyle + {\truefontname\s!Unicode\fontstylesuffix} + +\let\unicodecharcommand\firstofoneargument + +% \unexpanded\def\unicodeglyph#1#2% watch the double mapping +% {\bgroup +% \bodyfontsize=\unicodescale\bodyfontsize +% \font\unicodefont=\truefontname{\truefontname\unicodestyle\lchexnumbers{#1}} +% at \currentfontscale\bodyfontsize +% \unicodestrut\unicodefont\unicodecharcommand{\char#2\relax}% +% \egroup} + +\unexpanded\def\unicodeglyph#1#2% watch the double mapping + {\bgroup + \getvalue{@@\currentucharmapping\strippedcsname\uchar}{#1}{#2}% + \bodyfontsize\unicodescale\bodyfontsize + \font\unicodefont=\truefontname{\truefontname\unicodestyle\unicodeone} + at \currentfontscale\bodyfontsize + \unicodestrut\unicodefont\unicodecharcommand{\char\unicodetwo\relax}% + \egroup} + +%D \macros +%D {currentucharmapping,defineucharmapping} +%D +%D A (plane,char) pair can be remapped using a uchar mapping +%D function. The default mapping is to convert the plane to a +%D lowercase hexadecimal number, and leave the number +%D untouched. The current remapping is kept in a macro. + +\let\currentucharmapping\s!default + +\def\defineucharmapping#1% + {\setvalue{@@#1\strippedcsname\uchar}} + +\defineucharmapping{\s!default}#1#2% + {\edef\unicodeone{\lchexnumbers{#1}}\edef\unicodetwo{#2}} + +%D An example of a remapping is the following: +%D +%D \starttyping +%D \defineucharmapping{GBK}#1#2% +%D {\unicodeposition=#1 +%D \advance\unicodeposition -129 +%D \multiply\unicodeposition 190 +%D \advance\unicodeposition #2 +%D \advance\unicodeposition-\ifnum#2>127 65\else64\fi +%D \dorepositionunicode} +%D \stoptyping +%D +%D This maps the GBK vector onto a compact GBK one. The +%D auxiliary macro is defined here as a goody. + +\def\dorepositionunicode + {\dosetdivision\unicodeposition{256}\scratchcounter + %\DoDiv\unicodeposition by256to\scratchcounter + \advance\scratchcounter \plusone + \edef\unicodeone{\ifnum\scratchcounter<10 0\fi\the\scratchcounter}% + \dosetmodulo\unicodeposition{256}\scratchcounter + %\DoMod\unicodeposition by256to\scratchcounter + \edef\unicodetwo{\the\scratchcounter}} + +%D \macros +%D {setunicodestrut, setunicodescale, nextglyph, +%D handleunicodeglyph, insertunicodeglyph} +%D +%D A careful analysis of the previous macros, learns that the +%D process of mapping comes down to: +%D +%D \startitemize[packed,n] +%D \item taking care of preceding material (and spacing) +%D \item defining the font at \type {\currentfontscale} $\times$ +%D \type {\unicodescale} $\times$ \type {\bodyfontsize} +%D \item inserting a \type {\unicodestrut} +%D \item inserting the character (glyph) +%D \item executing some actions afterwards +%D \stopitemize +%D +%D The actions before and after placing the glyph, is up to +%D the user supplied handler. This handler (\type +%D {\handleunicodeglpyh}) must, at a certain moment, insert +%D the glyph using \type {\insertunicodeglyph} + +\def\setunicodescale#1% + {\def\unicodescale{#1}} + +\def\dosetunicodestrut#1#2% height depth + {\def\unicodestrut + {\vrule + \!!width \zeropoint + \!!height#1\strutht + \!!depth #2\strutdp + \relax}} + +\def\setunicodestrut#1#2% height depth + {\ifdim#1\strutht>\zeropoint + \dosetunicodestrut{#1}{#2}% + \else\ifdim#1\strutdp>\zeropoint + \dosetunicodestrut{#1}{#2}% + \else + \let\unicodestrut\empty + \fi\fi} + +%D The additional scaling and strut default to: + +\setunicodescale{1} +\setunicodestrut{1}{1} + +%D The actual code for the additional actions as well as +%D specific spacing is handled outside these routines. The +%D character after the two that are under treatment is +%D available in \type {\nextglyph}. + +%D \macros +%D {defineunicodefont, setupunicodefont} +%D +%D Apart from this rather low level implementation, we also +%D provide a more user friendly alternative. Given that one +%D has defined: +%D +%D \starttyping +%D \defineunicodefont +%D [SimChi] [SimplifiedChinese] +%D [ \c!scale=0.85, +%D \c!height=1.25, +%D \c!depth=1.00, +%D \c!interlinespaceinterlinie=yes, +%D \c!conversion=\chinesenumber, +%D \c!command=\handlechineseunicodeglyph] +%D \stoptyping +%D +%D Together with: +%D +%D \starttyping +%D \definefontsynonym [SimplifiedChineseRegular] [gbsong] +%D \definefontsynonym [SimplifiedChineseSlanted] [gbsongsl] +%D \stoptyping +%D +%D we can now switch to Simplified Chinese by saying \type +%D {SimChi}. Some values can be changed afterwards with +%D +%D \starttyping +%D \setupunicodefont[SimChi][...=...] +%D \stoptyping +%D +%D Specific initializations can be assigned to \type +%D {commands}. + +\beginTEX + + \def\unicodeTEXwarning + {\writeline\showmessage\m!fonts{21}\empty\writeline + \global\let\unicodeTEXwarning\relax} + +\endTEX + +\beginETEX + + \let\unicodeTEXwarning\relax + +\endETEX + +\def\defineunicodefont + {\dotripleempty\dodefineunicodefont} + +\def\dodefineunicodefont[#1][#2][#3]% + {\unicodeTEXwarning + \doifassignmentelse{#3} + {\setupunicodefont[#1][#3]} + {\doifelsenothing{#3} + {\setupunicodefont[#1][#3]} + {\copyparameters + [\??uc#1][\??uc#3] + [\c!height,\c!depth,\c!scale,\c!commands, + \c!interlinespace,\c!command,\c!conversion]}}% + \doifelsenothing{#2} + {\setvalue{#1}{[uc font #1 undefined]}} + {\setvalue{\??uc#1\c!file}{#2}% + \doifundefined{\??ff#2\s!Bold} + {\definefontsynonym[#2\s!Bold] [#2\s!Regular]% + \definefontsynonym[#2\s!Slanted] [#2\s!Regular]% + \definefontsynonym[#2\s!Italic] [#2\s!Regular]% + \definefontsynonym[#2\s!BoldSlanted][#2\s!Slanted]% + \definefontsynonym[#2\s!BoldItalic] [#2\s!Italic]}% + \unexpanded\setvalue{#1}{\enableunicodefont{#1}}}} + +\def\setupunicodefont + {\dodoubleempty\dosetupunicodefont} + +\def\dosetupunicodefont[#1][#2]% also predefines + {\doifundefined{\??uc#1\c!command} + {\copyparameters + [\??uc#1][\??uc\s!default] + [\c!height,\c!depth,\c!scale,\c!commands, + \c!interlinespace,\c!command,\c!conversion]}% + \getparameters[\??uc#1][#2]} + +\def\enableunicodefont#1% + {\definefontsynonym[\s!Unicode][\getvalue{\??uc#1\c!file}]% + \def\unicodescale {\getvalue{\??uc#1\c!scale}}% + \def\unicodeheight {\getvalue{\??uc#1\c!height}}% + \def\unicodedepth {\getvalue{\??uc#1\c!depth}}% + \def\unicodedigits {\getvalue{\??uc#1\c!conversion}}% + \def\handleunicodeglyph {\getvalue{\??uc#1\c!command}}% + \enableregime[unicode]% the following \relax's are realy needed + \doifvalue{\??uc#1\c!interlinespace}\v!yes\setupinterlinespace\relax + \getvalue{\??uc#1\c!commands}\relax} + +%D \macros +%D {unicodedigits} +%D +%D For convenience we also predefine a number conversion +%D macro: + +\let\unicodedigits\number + +%D Because we cannot be sure of the pressence of all font +%D styles, we remap some by default. + +\definefontsynonym [\s!Unicode\s!Bold] [\s!Unicode\s!Regular] +\definefontsynonym [\s!Unicode\s!Slanted] [\s!Unicode\s!Regular] +\definefontsynonym [\s!Unicode\s!Italic] [\s!Unicode\s!Regular] +\definefontsynonym [\s!Unicode\s!BoldSlanted] [\s!Unicode\s!Slanted] +\definefontsynonym [\s!Unicode\s!BoldItalic] [\s!Unicode\s!Italic] + +\setupunicodefont + [\s!default] + [\c!height=1, + \c!depth=1, + \c!scale=1, + \c!interlinespace=\v!yes, + \c!command=\insertunicodeglyph, + \c!conversion=\number] + +\protect \endinput |