%% This is part of the OpTeX project, see http://petr.olsak.net/optex \_codedecl \langlist {Initialization of hypenation patterns <2020-03-10>} % preloaded in format \_doc ----------------------------- The means a shortcut of language name (mostly by ISO 639-1). The following control sequences are used for language switching: \begitems * `\_lan:` expands to `` of the language. The is an internal number of languages used as a value of `\language` register. * `\_ulan:` expands to `` too. This is transformation from long name of language (lowercase letters) to . * `\_Patt` (for example `\_csPatt`) is the language `` declared by `\chardef`. * `\lang` (for example \`\enlang`, \`\cslang`, \`\sklang`, \`\delang`, \`\pllang`) is language selector. It exists in two states \begitems * Initialization state: when `\lang` is used first then it must load the patterns into memory using Lua code. If it is done then the `\lang` re-defines itself to the processing state. * Processing state: it only sets `\language=\_Patt`, i.e it selects the hyphenation patterns. It does a little more language-dependent work, as mentioned below. \enditems * `\_langspecific:` is processed by `\lang` and it should include language-specific macros declared by the user or macro designer. \enditems The USenglish patters are preloaded first: \_cod ----------------------------- \_chardef\_enPatt=0 \_def\_pattlist{\_enPatt=0} \_def\_langlist{en(USenglish)} \_sdef{_lan:0}{en} \_sdef{_ulan:usenglish}{en} \_def\_enlang{\_uselang{en}\_enPatt23} % \lefthyph=2 \righthyph=3 \_def\enlang{\_enlang} \_sdef{_langspecific:en}{\_nonfrenchspacing} \_lefthyphenmin=2 \_righthyphenmin=3 % disallow x- or -xx breaks \_input hyphen % en(USenglish) patterns from TeX82 \_doc ----------------------------- \`\_preplang` ` ` prepares the\nl `\lang` to its initialization state. Roughly speaking, it does: \begtt \catcode`\<=13 \chardef\_Patt = \def\_lan: {} \def\_ulan: {} \def\_lang {% \_loadpattrs % loads patterns using Lua code \gdef\_lang {\_uselang{}\_Patt } \_lang % runs itself in processing state } \def\lang {\_lang} % public version \lang \endtt You can see that `\lang` runs \^`\_loadpattrs` and \^`\_uselang` first (in initialization state) and it runs only \^`\_uselang` when it is called again (in processing state). \_cod ----------------------------- \_def\_preplang #1 #2 #3 #4 #5 {% \_ea\_chardef \_csname _#1Patt\_endcsname=#4 \_sdef{_lan:#4}{#1}\_lowercase{\_sdef{_ulan:#2}}{#1}% \_def\_next{\_ea\_noexpand\_csname _#1lang\_endcsname}% \_ea\_edef \_csname _#1lang\_endcsname {% \_noexpand\_loadpattrs #3 #4 #2 % loads patterns \_gdef\_next{\_noexpand\_uselang{#1}\_csname _#1Patt\_endcsname #5}% re-defines itself \_next % runs itself in processing state } \_addto\_langlist{ #1(#2)}% \_sdef{#1lang\_ea}\_ea{\_csname _#1lang\_endcsname}% unprefixed \lang } \_doc ----------------------------- \`\_loadpattrs` ` ` loads hyphenation patterns and hyphenation exceptions for given language and registers them as `\language=`. The is a part of full file name wich is read: `hyph-.tex`. The patterns and hyphenation exceptions are saved here in UTF-8 encoding. The should be a list of individual 's separated by commas, see the language Serbian below for an example. \_cod ----------------------------- \_def\_loadpattrs#1 #2 #3 {% \_wlog{Loading hyphenation #3: (#1) \_string\language=#2}% \_begingroup\_setbox0=\_vbox{% we don't want spaces in horizontal mode \_language=#2\_def\\{#3}% \_let\patterns=\_patterns \_let\hyphenation=\_hyphenation \_def\message##1{}% \_loadpattrsA #1,,% }\_endgroup } \_def\_loadpattrsA #1,{\_ifx,#1,\_else \_isfile {hyph-#1}\_iftrue \_opinput{hyph-#1}% \_else \_opwarning{No hyph. patterns #1 for \\, missing package?}% \_def\_opwarning##1{}\_fi \_ea \_loadpattrsA \_fi } \_doc ----------------------------- \`\_uselang``{}\_Patt `\nl sets `\language`, `\lefthyphenmin`, `\righthyphenmin` and runs `\frenchspacing`. This default language-dependent settings should be re-declared by `\_langspecific:` which is run finally (it is `\relax` by default, only `\_langspecific:en` runs \^`\nonfrenchspacing`). \_cod ----------------------------- \_def\_uselang#1#2#3#4{\_language=#2\_lefthyphenmin=#3\_righthyphenmin=#4\_relax \_frenchspacing % \nonfrenchspacing can be set in \cs{_langspecific:lan} \_cs{_langspecific:#1}% } \_doc ----------------------------- The \`\uselanguage` `{}` is defined here (for compatibility with e-plain users). \_cod ----------------------------- \_def\_uselanguage#1{\_lowercase{\_cs{_\_cs{_ulan:#1}lang}}} \_public \uselanguage ; \_doc ----------------------------- The numbers for languages are declared as fixed constants (no auto-generated). This concept is inspired by CSplain. There are typical numbers of languages in CSplain: 5=Czech in IL2, 15=Czech in T1 and 115=Czech in Unicode. We keep these constants but we load only Unicode patterns (greater than 100), of course. \_cod ----------------------------- \_preplang enus USenglishmax en-us 100 23 \_preplang engb UKenglish en-gb 101 23 \_preplang it Italian it 102 22 \_preplang ia Interlingua ia 103 22 \_preplang id Indonesian id 104 22 \_preplang cs Czech cs 115 23 \_preplang sk Slovak sk 116 23 \_preplang de nGerman de-1996 121 22 \_preplang fr French fr 122 22 \_preplang pl Polish pl 123 22 \_preplang cy Welsh cy 124 23 \_preplang da Danish da 125 22 \_preplang es Spanish es 126 22 \_preplang sl Slovenian sl 128 22 \_preplang fi Finnish fi 129 22 \_preplang hu Hungarian hu 130 22 \_preplang tr Turkish tr 131 22 \_preplang et Estonian et 132 23 \_preplang eu Basque eu 133 22 \_preplang ga Irish ga 134 23 \_preplang nb Bokmal nb 135 22 \_preplang nn Nynorsk nn 136 22 \_preplang nl Dutch nl 137 22 \_preplang pt Portuguese pt 138 23 \_preplang ro Romanian ro 139 22 \_preplang hr Croatian hr 140 22 \_preplang zh Pinyin zh-latn-pinyin 141 11 \_preplang is Icelandic is 142 22 \_preplang hsb Uppersorbian hsb 143 22 \_preplang af Afrikaans af 144 12 \_preplang gl Galician gl 145 22 \_preplang kmr Kurmanji kmr 146 22 \_preplang tk Turkmen tk 147 22 \_preplang la Latin la 148 22 \_preplang lac classicLatin la-x-classic 149 22 \_preplang lal liturgicalLatin la-x-liturgic 150 22 \_preplang elm monoGreek el-monoton 201 11 \_preplang elp Greek el-polyton 202 11 \_preplang grc ancientGreek grc 203 11 \_preplang ca Catalan ca 204 22 \_preplang cop Coptic cop 205 11 \_preplang mn Mongolian mn-cyrl 206 22 \_preplang sa Sanskrit sa 207 13 \_preplang ru Russian ru 208 22 \_preplang uk Ukrainian uk 209 22 \_preplang hy Armenian hy 210 12 \_preplang as Assamese as 211 11 \_preplang hi Hindi hi 212 11 \_preplang kn Kannada kn 213 11 \_preplang lv Latvian lv 215 22 \_preplang lt Lithuanian lt 216 22 \_preplang ml Malayalam ml 217 11 \_preplang mr Marathi mr 218 11 \_preplang or Oriya or 219 11 \_preplang pa Panjabi pa 220 11 \_preplang ta Tamil ta 221 11 \_preplang te Telugu te 222 11 \_preplang be Belarusian be 223 22 \_preplang bg Bulgarian bg 224 22 \_preplang bn Bengali bn 225 11 \_preplang cu churchslavonic cu 226 12 \_preplang deo oldGerman de-1901 227 22 \_preplang gsw swissGerman de-ch-1901 228 22 \_preplang eo Esperanto eo 229 22 \_preplang fur Friulan fur 230 22 \_preplang gu Gujarati gu 231 11 \_preplang ka Georgian ka 232 12 \_preplang mk Macedonian mk 233 22 \_preplang oc Occitan oc 234 22 \_preplang pi Pali pi 235 12 \_preplang pms Piedmontese pms 236 22 \_preplang rm Romansh rm 237 22 \_preplang sr Serbian sh-cyrl,sh-latn 238 22 \_preplang sv Swedish sv 239 22 \_preplang th Thai th 240 23 \_preplang ethi Ethiopic mul-ethi 241 11 \_doc ----------------------------- The \`\langlist` includes names of all languages which are ready to load and use their hyphenation patterns. This list is printed to the terminal and to log at ini\TeX/ state here. It can be used when processing documents too. \_cod ----------------------------- \_message{Language hyph.patterns ready to load: \_langlist. Use \_string\lang to initialize language, \_string\cslang\_space for example} \_public \langlist ; \_endcode % --------------------------------------------- Maybe, you need to do more language-specific actions than just switching hyphenation patterns. For example, you need to load a specific font with a specific script used in the selected language, you can define macros for quotation marks depending on the language, etc. The example shows how to declare such language-specific things. \begtt \def\langset #1 #2{\sdef{_langspecific:#1}{#2}} \langset fr {... declare French quotation marks} \langset de {... declare German quotation marks} \langset gr {... switch to Greek fonts family} ... etc. \endtt Note that you need not set language-specific phrases (like `\today`) by this code. Another concept is used for such tasks. See the section~\ref[langphrases] for more details.