%D \module %D [ file=enco-ini, %D version=2007.02.19, % 2000.12.27, % 1998.12.03, %D title=\CONTEXT\ Encoding Macros, %D subtitle=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. %D This is stripped down version of th eoriginal enco-ini.tex %D file. For more details you might want to study the \MKII\ file %D but since \LUATEX\ is unicode inside we need less code. % When dealing with characters we have four cases to take into account % when moving from mkii to mkiv: % 1. => ref to slot 200 in current font % 2. \char 200 => ref to slot 200 in current font % 3. => can (e.g.) map to another slot in current font % 4. \namedglyph => can map to some slot in some font % Using case 2 for special characters is doomed to fail because we are not going % to intercept these on the fly as happens automatically with traditional font % encoding handling. We could do that in a node pass but it's not worth the effort % because we seldom use this case in a document source. % We can consider using utf as internal format for mkii. The main reason for not % doing this before was that it was slow. On the other hand, it would make dealing % with utility files easier. However, we've now kind of frozen mkii. \writestatus{loading}{ConTeXt Encoding Macros / Initialization} \unprotect %D Obsolete (but sometimes used in styles) \let\defaultencoding\s!default %D \macros %D {defineaccent, definecharacter, definecommand} \unexpanded\def\dodefineaccentcommand#1% {\setevalue{\string#1}{\noexpand\dohandleaccent{\string#1}}} \unexpanded\def\dodefineaccent#1#2#3% no spaces, used low level {\setvalue{\??ac\string#1\string#2\empty}{#3}} \unexpanded\def\defineaccent#1 #2 #3 % {\dodefineaccentcommand{#1}% \dodefineaccent{#1}{#2}{#3}} \def\dohandleaccent#1#2% {\ifcsname\??ac\string#1#2\empty\endcsname \csname\??ac\string#1#2\empty\endcsname \else\ifcsname\??ac\string#1\string#2\empty\endcsname \csname\??ac\string#1\string#2\empty\endcsname \fi\fi} \unexpanded\def\definecharacter#1 #2 % {\doifnumberelse{\string#2} {\setevalue{\string#1}{\utfchar{#2}}} % or {\expandafter\chardef\csname#1\endcsname#2\relax} {\setuvalue{\string#1}{#2}}} \unexpanded\def\definecommand#1 #2 % {\setuvalue{\string#1}{#2}} %D \macros %D {everyuppercase, everylowercase, everysanitize} \newtoks \everyuppercase \newtoks \everylowercase \newtoks \everysanitize %D Accent handling (try to avoid this): \newbox\accenttestbox % no longer global so we could use \scratchbox \def\buildmathaccent#1% {\mathaccent#1 } \unexpanded\def\buildtextaccent#1#2% we could do all at the lua end {\begingroup % but that's no fun (yet) \setbox\accenttestbox\hbox{#1}% \scratchcounter\cldcontext{nodes.firstcharinbox(\number\accenttestbox)}\relax \ifcase\scratchcounter\else\accent\scratchcounter\fi \relax#2% \endgroup} \unexpanded\def\bottomaccent#1#2#3#4#5% down right slantcorrection accent char {\dontleavehmode % why this align mess \vtop {\forgetall \baselineskip\zeropoint \lineskip#1% \everycr\emptytoks \tabskip\zeropoint \lineskiplimit\zeropoint \setbox0\hbox{#4}% \halign {##\crcr\hbox{#5}\crcr \hidewidth \hskip#2\wd0 \hskip-#3\slantperpoint % in plain 1ex * dimenless value \vbox to .2ex{\box0\vss}\hidewidth \crcr}}} \unexpanded\def\buildtextmacron {\bottomaccent{.25ex}{0}{15}{\textmacron}} \unexpanded\def\buildtextbottomdot {\bottomaccent{.25ex}{0}{5}{\textbottomdot}} \unexpanded\def\buildtextcedilla {\bottomaccent{0ex}{0}{5}{\textcedilla}} \unexpanded\def\buildtextogonek {\bottomaccent{-.1ex}{.5}{0}{\textogonek}} \unexpanded\def\buildtextbottomcomma{\bottomaccent{.15ex}{0}{5}{\tx,}} \let\d\buildtextbottomdot \unexpanded\def\topaccent#1#2#3#4#5% down right slantcorrection accent char {\dontleavehmode \bgroup \setbox0\hbox{#4}% \setbox2\hbox{#5}% \hbox to \wd2 \bgroup \hss\copy2\hss \hskip-\wd2 \hss\hskip#2\wd0\hskip-#3\slantperpoint\raise#1\hbox{#4}\hss \egroup \egroup} \def\buildtextgrave{\topaccent{0pt}{0}{15}{\textgrave}} % e.g. \unexpanded\def\definemathaccent#1 #2% {\setvalue{#1}{\mathaccent#2 }} %D Math (will move): \definemathaccent acute \mathacute \definemathaccent grave \mathgrave \definemathaccent ddot \mathddot \definemathaccent tilde \mathtilde \definemathaccent bar \mathbar \definemathaccent breve \mathbreve \definemathaccent check \mathcheck \definemathaccent hat \mathhat \definemathaccent vec \mathvec \definemathaccent dot \mathdot \definemathaccent widetilde \mathwidetilde \definemathaccent widehat \mathwidehat % from enco-com: \def\AA{Å} \def\aa{å} \def\AE{Æ} \def\ae{æ} \def\CC{Ç} \def\cc{ç} \def \L{Ł} \def \l{ł} \def \O{Ø} \def \o{ø} \def\OE{Œ} \def\oe{œ} \def\SZ{SS} \def\sz{ß} \def\SS{ß} \def\IJ{IJ} \def\ij{ij} % from enco-def: \def\i{ı} \def\j{ȷ} \def\S{§} \def\textS {§} % obsolete (surfaced in bibliographic files) \def\P{¶} \def\textP {¶} % obsolete (surfaced in bibliographic files) \def\eszett {ß} \def\Eszett {SS} \def\Ssharp{SS} \def\lslash {ł} \def\Lslash {Ł} \def\dslash {đ} \def\Dslash {Đ} \def\oslash {ø} \def\Oslash {Ø} \def\dcroat {đ} \def\Dcroat {Đ} \def\kcedilla{ķ} \def\Kcedilla{Ķ} \def\lcedilla{ļ} \def\Lcedilla{Ļ} \def\ncedilla{ņ} \def\Ncedilla{Ņ} \def\rcedilla{ŗ} \def\Rcedilla{Ŗ} \def\aumlaut {ä} \def\Aumlaut {Ä} \def\eumlaut {ë} \def\Eumlaut {Ë} \def\iumlaut {ï} \def\Iumlaut {Ï} \def\oumlaut {ö} \def\Oumlaut {Ö} \def\uumlaut {ü} \def\Uumlaut {Ü} % for old times sake (obsolete) \def\textflorin{ƒ} \def\florin {ƒ} \def\pound {£} \def\sterling{£} \def\promille {‰} \def\permille{‰} % tex specific (obsolete) \def\procent {\percent} \def\dollar {\textdollar} \def\permine {\fakepermine} % some more \def\hyphen {\softhyphen} \def\compoundwordmark {\hyphen} \def\cwm {\hyphen} \def\nonbreakinghyphen{\hyphen} \def\breakinghyphen {\hyphen\prewordbreak} % quotes \def\lowerleftsingleninequote {\quotesinglebase} \def\lowerleftdoubleninequote {\quotedblbase} \def\lowerrightsingleninequote {\quotesinglebase} \def\lowerrightdoubleninequote {\quotedblbase} \def\upperleftsingleninequote {\quoteright} \def\upperleftdoubleninequote {\quotedblright} \def\upperrightsingleninequote {\quoteright} \def\upperrightdoubleninequote {\quotedblright} \def\upperleftsinglesixquote {\quoteleft} \def\upperleftdoublesixquote {\quotedblleft} \def\upperrightsinglesixquote {\quoteleft} \def\upperrightdoublesixquote {\quotedblleft} \def\leftsubguillemot {\guilsingleleft} \def\rightsubguillemot {\guilsingleright} % left-overs (some day in private unicode space, so that we can roundtrip) \unexpanded\def\textblacksquare {\dontleavehmode\hbox{\vrule\!!width.3\s!em\!!height.4\s!em\!!depth-.1\s!em}} \unexpanded\def\schwa {\hbox{\rotate[\c!rotation=180,\c!location=\v!high]{\hbox{e}}}} \unexpanded\def\schwagrave {\buildtextgrave\schwa} \chardef\textcontrolspace"2423 \unexpanded\def\fallbackcontrolspace %{\getglyph{ComputerModernMono}\textcontrolspace} {\getglyph{LMTypewriter10-Regular}\textcontrolspace} \unexpanded\def\normalcontrolspace {\iffontchar\font\textcontrolspace \textcontrolspace \else \fallbackcontrolspace \fi} \let\textvisiblespace\normalcontrolspace \unexpanded\def\fastcontrolspace % no glyph resolving after first (use grouped) {\dofastcontrolspace} \def\dofastcontrolspace {\iffontchar\font\textcontrolspace \nofastfallbackcontrolspace \else \dofastfallbackcontrolspace \fi \dofastcontrolspace} \newbox\controlspacebox \def\nofastfallbackcontrolspace {\let\dofastcontrolspace\textcontrolspace} \def\dofastfallbackcontrolspace {\setbox\controlspacebox\hbox{\space}% \setbox\controlspacebox\hbox to \wd\controlspacebox{\hss\fallbackcontrolspace\hss}% \let\dofastcontrolspace\flushcontrolspacebox} \def\flushcontrolspacebox {\copy\controlspacebox} % a few defaults (\{}), we really need the verbose \empty as it will be % stringified .. anyhow, we define this at the lua end now but keep it here as a % reference % % \defineaccent ^ {\empty} {\textcircumflex} % \defineaccent ` {\empty} {\textgrave} % \defineaccent ~ {\empty} {\texttilde} % \defineaccent " {\empty} {\textdiaeresis} % \defineaccent ' {\empty} {\textacute} % \defineaccent . {\empty} {\textdotaccent} % \defineaccent = {\empty} {\textmacron} % \defineaccent c {\empty} {\textcedilla} % \defineaccent H {\empty} {\texthungarumlaut} % \defineaccent k {\empty} {\textogonek} % \defineaccent r {\empty} {\textring} % \defineaccent u {\empty} {\textbreve} % \defineaccent v {\empty} {\textcaron} \ctxlua{characters.tex.defineaccents()} % from enco-mis: \def\fakepercent {\mathematics{\normalsuperscript{\scriptscriptstyle0}\kern-.25em/\kern-.2em\normalsubscript{\scriptscriptstyle0}}} \def\fakeperthousand {\mathematics{\normalsuperscript{\scriptscriptstyle0}\kern-.25em/\kern-.2em\normalsubscript{\scriptscriptstyle00}}} \def\fakepermine {\dontleavehmode \bgroup \setbox\scratchbox\hbox {\mathematics{+}}% \hbox to \wd\scratchbox {\hss \mathematics{\normalsuperscript{\scriptscriptstyle-}\kern-.4em/\kern-.3em\normalsubscript{\scriptscriptstyle-}}% \hss}% \egroup} %D A smaller and bolder variant, more like the math and monospaced ones. \def\fakeunderscore {\relax\ifmmode \vrule\!!depth .12\fontexheight\mathstylefont\normalmathstyle\!!width \fontinterwordspace\mathstylefont\normalmathstyle\!!height\zeropoint\relax \else \dontleavehmode\hbox{\vrule\!!depth .12\fontexheight\font\!!width \fontinterwordspace\font\!!height\zeropoint}% \fi} \def\fakeunderscores{\let\_\fakeunderscore} \def\textunderscores{\let\_\textunderscore} \textunderscores \ifx\mathunderscore\undefined \let\mathunderscore\fakeunderscore \fi \ifx\textunderscore\undefined \let\textunderscore\fakeunderscore \fi \unexpanded\def\normalunderscore{\ifmmode\mathunderscore\else\textunderscore\fi} \let\_\normalunderscore %D To be sorted out: \unexpanded\def\textminus {\char \iffontchar\font"2012 "2012 % figuredash \else\iffontchar\font"2013 "2013 % endash \else\iffontchar\font"2212 "2212 % math minus "002D % hyphen \fi\fi\fi} \unexpanded\def\textplus {\char"002B } % plus \protect \endinput