summaryrefslogtreecommitdiff
path: root/macros/optex/base/hyphen-lan.opm
blob: 7a6c790d1f4c36adbe30c5ca9ea2d4adf172fcd3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
%% This is part of the OpTeX project, see http://petr.olsak.net/optex

\_codedecl \langlist {Initialization of hypenation patterns <2021-03-29>} % preloaded in format

   \_doc -----------------------------
   The <iso-code> means a shortcut of language name (mostly by ISO 639-1).
   The following control sequences are used for language switching:
   \begitems
   * `\_lan:<number>` expands to `<iso-code>` of the language.
     The <number> is an internal number of languages used as a value of
     `\language` register.
   * `\_ulan:<long-lang>` expands to `<iso-code>` too. This is transformation
     from long name of language (lowercase letters) to <iso-code>.
   * `\_<iso-code>Patt` (for example `\_csPatt`) is the language `<number>` declared by `\chardef`.
   * `\<iso-code>lang`
     (for example \`\enlang`, \`\cslang`, \`\sklang`, \`\delang`, \`\pllang`)
     is language selector.  It exists in two states
     \begitems
     * Initialization state: when `\<iso-code>lang` is used first then it
       must load the patterns into memory using Lua code. If it is done then
       the `\<iso-code>lang` re-defines itself to the processing state.
     * Processing state: it only sets `\language=\_<iso-code>Patt`, i.e it
       selects the hyphenation patterns. It does a little more
       language-dependent work, as mentioned below.
     \enditems
   * `\_langspecific:<isocode>` is processed by `\<iso-code>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` `<iso-code> <long-lang> <hyph-file-spec> <number> <pre-hyph><post-hyph>`
   prepares the\nl `\<iso-code>lang` to its initialization state. Roughly
   speaking, it does:
   \begtt \catcode`\<=13
   \chardef\_<iso-code>Patt = <number>
   \def\_lan:<number> {<iso-code>}
   \def\_ulan:<long-lang> {<iso-code>}
   \def\_<iso-code>lang {%
      \_loadpattrs <hyph-file-spec> <number> <long-lang> % loads patterns using Lua code
      \gdef\_<iso-code>lang {\_uselang{<iso-code>}\_<iso-code>Patt <pre-hyph><post-hyph>}
      \_<iso-code>lang                  % runs itself in processing state
   }
   \def\<iso-code>lang {\_<iso-code>lang} % public version \<iso-code>lang
   \endtt
   You can see that `\<iso-code>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 \<isocode>lang
}

   \_doc -----------------------------
   \`\_loadpattrs` `<hyph-file-spec> <number> <long-lang>`
   loads hyphenation patterns and hyphenation exceptions for given language
   and registers them as `\language=<number>`.

   The <hyph-file-spec> is a part of full file name wich is read:
   `hyph-<hyph-file-spec>.tex`. The patterns and hyphenation exceptions
   are saved here in UTF-8 encoding.
   The <hyph-file-spec> should be a list of individual <hyph-file-spec>'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``{<iso-code>}\_<iso-code>Patt <pre-hyph><post-hyph>`\nl
   sets `\language`, `\lefthyphenmin`, `\righthyphenmin` and runs
   `\frenchspacing`. This default language-dependent settings
   should be re-declared by `\_langspecific:<iso-code>` 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` `{<long-lang>}` 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
\_preplang fis   schoolFinnish   fi-x-school       242 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\<shortname>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.

\_endinput

2021-03-29 \_preplang schoolFinnish added
2020-11-11 load patterns without lua code
2020-03-10 released