%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 Quite some commands are now obsolete. We keep only a few commands %D around, just in case they are used in styles (and in for instance %D symb and xtag files). \unexpanded\def\startencoding [#1]{} % used in symb \let\stopencoding \relax \unexpanded\def\setupencoding [#1]{} \def\enablemapping [#1]{} \def\enableencoding[#1]{} \def\currentencoding{utf} \def\currentmapping {utf} \let\defaultencoding\s!default % todo: % \def\showaccents {\f!encodingprefix\s!run} % \def\showcharacters {\f!encodingprefix\s!run} % \def\showcharacterbounds {\f!encodingprefix\s!run} % \def\showhyphenations {\f!encodingprefix\s!run} % \def\showmapping {\f!encodingprefix\s!run} %D \macros %D {defineaccent, definecharacter, definecommand} \unexpanded\def\defineaccent#1 #2 #3 % {\setevalue{\string#1}{\noexpand\dohandleaccent{\string#1}}% \setvalue{\??ac\string#1\string#2}{#3}} \def\dohandleaccent#1#2% {\csname\??ac\string#1\string#2\empty\endcsname} \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, EveryUppercase, %D everyuppercase, EveryUppercase, %D everysanitize, EverySanitize} \newevery \everyuppercase \EveryUppercase \newevery \everylowercase \EveryLowercase \newevery \everysanitize \EverySanitize %D Some saved meanings (not really needed): \let\textaccent \accent \let\normaltextaccent\accent %D Accent handling (try to avoid this): \newbox\accenttestbox \def\buildmathaccent#1% {\mathaccent#1 } \unexpanded\def\buildtextaccent#1#2% {\begingroup \global\setbox\accenttestbox\hbox{#1}% \scratchcounter\ctxlua{characters.charcode(\number\accenttestbox)}% \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{\Aring} \def\aa{\aring} \def\AE{\AEligature} \def\ae{\aeligature} \def\CC{\Ccedilla} \def\cc{\ccedilla} \def \L{\Lstroke} \def \l{\lstroke} \def \O{\Ostroke} \def \o{\ostroke} \def\OE{\OEligature} \def\oe{\oeligature} \def\SZ{\Ssharp} \def\sz{\ssharp} \def\SS{\ssharp} \def\IJ{\IJligature} \def\ij{\ijligature} \def \i{\dotlessi} \def \j{\dotlessj} % from enco-def: \def\dotlessI {I} \def\dotlessJ {J} \def\Ssharp {SS} \def\eszett {\ssharp} \def\Eszett {\Ssharp} \def\lslash {\lstroke} \def\Lslash {\Lstroke} \def\dslash {\dstroke} \def\Dslash {\Dstroke} \def\oslash {\ostroke} \def\Oslash {\Ostroke} \def\dcroat {\dstroke} \def\Dcroat {\Dstroke} \def\Kcedilla {\Kcommaaccent} \def\kcedilla {\kcommaaccent} \def\Lcedilla {\Lcommaaccent} \def\lcedilla {\lcommaaccent} \def\Ncedilla {\Ncommaaccent} \def\ncedilla {\ncommaaccent} \def\Rcedilla {\Rcommaaccent} \def\rcedilla {\rcommaaccent} \def\S {\sectionmark} \def\P {\paragraphmark} \def\aumlaut {\adiaeresis} \def\eumlaut {\ediaeresis} \def\iumlaut {\idiaeresis} \def\oumlaut {\odiaeresis} \def\uumlaut {\udiaeresis} \def\Aumlaut {\Adiaeresis} \def\Eumlaut {\Ediaeresis} \def\Iumlaut {\Idiaeresis} \def\Oumlaut {\Odiaeresis} \def\Uumlaut {\Udiaeresis} % for latex users \def\textS {\sectionmark} \def\textP {\paragraphmark} % for old times sake \def\textflorin{\fhook} \def\florin {\textflorin} \def\dollar {\textdollar} \def\pound {\textsterling} \def\sterling {\textsterling} \def\promille {\perthousand} \def\permille {\perthousand} \def\procent {\percent} \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} % obsolete: % \greekleftquot {[obsolete]} % \greekrightquot {[obsolete]} % \greekapostrophos {[obsolete]} % \greekupsilondialytika{[obsolete]} % \Ycaron {[obsolete]} % \ycaron {[obsolete]} % to be done in char-def: % \definecharacter cyrillicGUP {GUP} % \definecharacter cyrillicGHCRS {GHCRS} % \definecharacter cyrillicZHDSC {ZHDSC} % \definecharacter cyrillicKDSC {KDSC} % \definecharacter cyrillicKBEAK {KBEAK} % \definecharacter cyrillicKVCRS {KVCRS} % \definecharacter cyrillicNG {NG} % \definecharacter cyrillicOTLD {OTLD} % \definecharacter cyrillicY {Y} % \definecharacter cyrillicYHCRS {YHCRS} % \definecharacter cyrillicHDSC {HDSC} % \definecharacter cyrillicCHVCRS {CHVCRS} % \definecharacter cyrillicCHRDSC {CHRDSC} % \definecharacter cyrillicQ {Q} % \definecharacter cyrillicW {W} % % \definecharacter cyrillicgup {gup} % \definecharacter cyrillicghcrs {ghcrs} % \definecharacter cyrilliczhdsc {zhdsc} % \definecharacter cyrillickdsc {kdsc} % \definecharacter cyrillickbeak {kbeak} % \definecharacter cyrillickvcrs {kvcrs} % \definecharacter cyrillicng {ng} % \definecharacter cyrillicotld {otld} % \definecharacter cyrillicy {y} % \definecharacter cyrillicyhcrs {yhcrs} % \definecharacter cyrillichdsc {hdsc} % \definecharacter cyrillicchvcrs {chvcrs} % \definecharacter cyrillicchrdsc {chrdsc} % \definecharacter cyrillicq {q} % \definecharacter cyrillicw {w} % \definecharacter softhyphen 45 % \definecharacter compoundwordmark 23 % 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 \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} % from enco-acc: % % we should to this at the lua end and share code .. \defineaccent ^ A {\Acircumflex} \defineaccent ^ a {\acircumflex} \defineaccent ^ C {\Ccircumflex} \defineaccent ^ c {\ccircumflex} \defineaccent ^ E {\Ecircumflex} \defineaccent ^ e {\ecircumflex} \defineaccent ^ G {\Gcircumflex} \defineaccent ^ g {\gcircumflex} \defineaccent ^ H {\Hcircumflex} \defineaccent ^ h {\hcircumflex} \defineaccent ^ I {\Icircumflex} \defineaccent ^ i {\icircumflex} \defineaccent ^ {\i} {\icircumflex} \defineaccent ^ J {\Jcircumflex} \defineaccent ^ j {\jcircumflex} \defineaccent ^ {\j} {\jcircumflex} \defineaccent ^ O {\Ocircumflex} \defineaccent ^ o {\ocircumflex} \defineaccent ^ S {\Scircumflex} \defineaccent ^ s {\scircumflex} \defineaccent ^ U {\Ucircumflex} \defineaccent ^ u {\ucircumflex} \defineaccent ^ W {\Wcircumflex} \defineaccent ^ w {\wcircumflex} \defineaccent ^ Y {\Ycircumflex} \defineaccent ^ y {\ycircumflex} \defineaccent ` A {\Agrave} \defineaccent ` a {\agrave} \defineaccent ` E {\Egrave} \defineaccent ` e {\egrave} \defineaccent ` I {\Igrave} \defineaccent ` i {\igrave} \defineaccent ` {\i} {\igrave} \defineaccent ` O {\Ograve} \defineaccent ` o {\ograve} \defineaccent ` U {\Ugrave} \defineaccent ` u {\ugrave} \defineaccent ` Y {\Ygrave} \defineaccent ` y {\ygrave} \defineaccent ~ A {\Atilde} \defineaccent ~ a {\atilde} \defineaccent ~ I {\Itilde} \defineaccent ~ i {\itilde} \defineaccent ~ {\i} {\itilde} \defineaccent ~ O {\Otilde} \defineaccent ~ o {\otilde} \defineaccent ~ U {\Utilde} \defineaccent ~ u {\utilde} \defineaccent ~ N {\Ntilde} \defineaccent ~ n {\ntilde} \defineaccent " A {\Adiaeresis} \defineaccent " a {\adiaeresis} \defineaccent " E {\Ediaeresis} \defineaccent " e {\ediaeresis} \defineaccent " I {\Idiaeresis} \defineaccent " i {\idiaeresis} \defineaccent " {\i} {\idiaeresis} \defineaccent " O {\Odiaeresis} \defineaccent " o {\odiaeresis} \defineaccent " U {\Udiaeresis} \defineaccent " u {\udiaeresis} \defineaccent " Y {\Ydiaeresis} \defineaccent " y {\ydiaeresis} \defineaccent ' A {\Aacute} \defineaccent ' a {\aacute} \defineaccent ' C {\Cacute} \defineaccent ' c {\cacute} \defineaccent ' E {\Eacute} \defineaccent ' e {\eacute} \defineaccent ' I {\Iacute} \defineaccent ' i {\iacute} \defineaccent ' {\i} {\iacute} \defineaccent ' L {\Lacute} \defineaccent ' l {\lacute} \defineaccent ' N {\Nacute} \defineaccent ' n {\nacute} \defineaccent ' O {\Oacute} \defineaccent ' o {\oacute} \defineaccent ' R {\Racute} \defineaccent ' r {\racute} \defineaccent ' S {\Sacute} \defineaccent ' s {\sacute} \defineaccent ' U {\Uacute} \defineaccent ' u {\uacute} \defineaccent ' Y {\Yacute} \defineaccent ' y {\yacute} \defineaccent ' Z {\Zacute} \defineaccent ' z {\zacute} \defineaccent . C {\Cdotaccent} \defineaccent . c {\cdotaccent} \defineaccent . E {\Edotaccent} \defineaccent . e {\edotaccent} \defineaccent . G {\Gdotaccent} \defineaccent . g {\gdotaccent} \defineaccent . I {\Idotaccent} \defineaccent . i {\idotaccent} \defineaccent . {\i} {\idotaccent} \defineaccent . Z {\Zdotaccent} \defineaccent . z {\zdotaccent} \defineaccent = A {\Amacron} \defineaccent = a {\amacron} \defineaccent = E {\Emacron} \defineaccent = e {\emacron} \defineaccent = I {\Imacron} \defineaccent = i {\imacron} \defineaccent = {\i} {\imacron} \defineaccent = O {\Omacron} \defineaccent = o {\omacron} \defineaccent = U {\Umacron} \defineaccent = u {\umacron} \defineaccent c C {\Ccedilla} \defineaccent c c {\ccedilla} \defineaccent c K {\Kcedilla} \defineaccent c k {\kcedilla} \defineaccent c L {\Lcedilla} \defineaccent c l {\lcedilla} \defineaccent c N {\Ncedilla} \defineaccent c n {\ncedilla} \defineaccent c R {\Rcedilla} \defineaccent c r {\rcedilla} \defineaccent c S {\Scedilla} \defineaccent c s {\scedilla} \defineaccent c T {\Tcedilla} \defineaccent c t {\tcedilla} \defineaccent H O {\Ohungarumlaut} \defineaccent H o {\ohungarumlaut} \defineaccent H u {\uhungarumlaut} \defineaccent H U {\Uhungarumlaut} \defineaccent k A {\Aogonek} \defineaccent k a {\aogonek} \defineaccent k E {\Eogonek} \defineaccent k e {\eogonek} \defineaccent k I {\Iogonek} \defineaccent k i {\iogonek} \defineaccent k U {\Uogonek} \defineaccent k u {\uogonek} \defineaccent r A {\Aring} \defineaccent r a {\aring} \defineaccent r U {\Uring} \defineaccent r u {\uring} \defineaccent u A {\Abreve} \defineaccent u a {\abreve} \defineaccent u E {\Ebreve} \defineaccent u e {\ebreve} \defineaccent u G {\Gbreve} \defineaccent u g {\gbreve} \defineaccent u I {\Ibreve} \defineaccent u i {\ibreve} \defineaccent u {\i} {\ibreve} \defineaccent u O {\Obreve} \defineaccent u o {\obreve} \defineaccent u U {\Ubreve} \defineaccent u u {\ubreve} \defineaccent v C {\Ccaron} \defineaccent v c {\ccaron} \defineaccent v D {\Dcaron} \defineaccent v d {\dcaron} \defineaccent v E {\Ecaron} \defineaccent v e {\ecaron} \defineaccent v L {\Lcaron} \defineaccent v l {\lcaron} \defineaccent v N {\Ncaron} \defineaccent v n {\ncaron} \defineaccent v R {\Rcaron} \defineaccent v r {\rcaron} \defineaccent v S {\Scaron} \defineaccent v s {\scaron} \defineaccent v T {\Tcaron} \defineaccent v t {\tcaron} \defineaccent v Z {\Zcaron} \defineaccent v z {\zcaron} % from enco-mis: \def\fakepercent {\mathematics{^{\scriptscriptstyle0}\kern-.25em/\kern-.2em_{\scriptscriptstyle0}}} \def\fakeperthousand {\mathematics{^{\scriptscriptstyle0}\kern-.25em/\kern-.2em_{\scriptscriptstyle00}}} \def\fakepermine {\dontleavehmode \bgroup \setbox\scratchbox\hbox {\mathematics{+}}% \hbox to \wd\scratchbox {\hss \mathematics{^{\scriptscriptstyle-}\kern-.4em/\kern-.3em_{\scriptscriptstyle-}}% \hss}% \egroup} %D A smaller and bolder variant, more like the math and monospaced ones. % \def\fakeunderscore % {\dontleavehmode\hbox % was \leavevmode % {\setbox\scratchbox\hbox{(}% % \scratchdimen.2\dp\scratchbox % \setbox\scratchbox\hbox{\space}% % \vrule % \!!depth \scratchdimen % \!!width \wd\scratchbox % \!!height\zeropoint}} % \startTEXpage % \ruledhbox{\strut$1\fakeunderscore^{1\fakeunderscore}$} % \ruledhbox{\strut$1\xfakeunderscore^{1\xfakeunderscore}$} % \stopTEXpage \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 \protect \endinput