1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23\writestatus{loading}{ConTeXt Language Macros Initialization}
24
25\registerctxluafile{langini}{}
26\registerctxluafile{langdef}{}
27\registerctxluafile{langcnt}{}
28
29\unprotect
30
31\ifdefined\nonfrenchspacing\else \let\nonfrenchspacing\relax \fi
32\ifdefined\frenchspacing \else \let\frenchspacing \relax \fi
33
34
35
36
37
38
39
40
41
42
43
44\normallanguage\zerocount \def\loadedlanguage{1}
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63\let\currentlanguage \empty
64\let\currentmainlanguage\empty
65
66
67
68
69
70
71
72\installcorenamespace{language}
73\installcorenamespace{languagelinked}
74
75\def\currentusedlanguage{\currentlanguage}
76
77\def\defaultlanguage#1
78 {\ifcsname\??language#1\s!default\endcsname
79 \expandafter\defaultlanguage\lastnamedcs
80 \else
81 #1
82 \fi}
83
84\def\languageparameter#1
85 {\ifcsname\??language\currentlanguage#1\endcsname
86 \lastnamedcs
87 \else\ifcsname\??language\currentlanguage\s!default\endcsname
88 \expandafter\specificlanguageparameter\lastnamedcs{#1}
89 \else\ifcsname\??language\s!default#1\endcsname
90 \lastnamedcs
91 \fi\fi\fi}
92
93\def\specificlanguageparameter#1#2
94 {\ifcsname\??language#1#2\endcsname
95 \lastnamedcs
96 \else\ifcsname\??language#1\s!default\endcsname
97 \expandafter\specificlanguageparameter\lastnamedcs{#2}
98 \else\ifcsname\??language\s!default#2\endcsname
99 \lastnamedcs
100 \fi\fi\fi}
101
102\def\mainlanguageparameter#1
103 {\ifcsname\??language\currentmainlanguage#1\endcsname
104 \lastnamedcs
105 \else\ifcsname\??language\currentmainlanguage\s!default\endcsname
106 \expandafter\specificlanguageparameter\lastnamedcs{#1}
107 \else\ifcsname\??language\s!default#1\endcsname
108 \lastnamedcs
109 \fi\fi\fi}
110
111\let\usedlanguageparameter\languageparameter
112
113\def\askedlanguageparameter#1
114 {\ifcsname\??language\currentusedlanguage#1\endcsname
115 \lastnamedcs
116 \else\ifcsname\??language\currentusedlanguage\s!default\endcsname
117 \expandafter\specificlanguageparameter\lastnamedcs{#1}
118 \else\ifcsname\??language\s!default#1\endcsname
119 \lastnamedcs
120 \fi\fi\fi}
121
122\unexpanded\def\setusedlanguage#1
123 {\edef\currentusedlanguage{\reallanguagetag{#1}}
124 \ifx\currentusedlanguage\empty
125 \let\currentusedlanguage \currentlanguage
126 \let\usedlanguageparameter\languageparameter
127 \else\ifx\currentusedlanguage\v!global
128 \let\currentusedlanguage \currentmainlanguage
129 \let\usedlanguageparameter\mainlanguageparameter
130 \else\ifx\currentusedlanguage\v!local
131 \let\currentusedlanguage \currentlanguage
132 \let\usedlanguageparameter\languageparameter
133 \else
134 \let\usedlanguageparameter\askedlanguageparameter
135 \fi\fi\fi}
136
137\unexpanded\def\setupcurrentlanguage[#1]
138 {\setcurrentlanguage\currentmainlanguage{#1}}
139
140\unexpanded\def\setcurrentlanguage#1#2
141 {\edef\xaskedlanguage{#1}
142 \ifx\xaskedlanguage\empty \else
143 \ifx\currentmainlanguage\empty\else\resetsystemmode{\systemmodeprefix\currentmainlanguage}\fi
144 \let\currentmainlanguage\xaskedlanguage
145 \setsystemmode{\systemmodeprefix\currentmainlanguage}
146 \fi
147 \edef\xaskedlanguage{#2}
148 \ifx\xaskedlanguage\empty \else
149 \ifx\currentlanguage\empty\else\resetsystemmode\currentlanguage\fi
150 \let\currentlanguage\xaskedlanguage
151 \setsystemmode\currentlanguage
152 \fi}
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\newtoks \everysetuplanguage
178
179\def\installedlanguages{\clf_installedlanguages}
180
181\unexpanded\def\doifelselanguage#1
182 {\ifcsname\??language#1\c!state\endcsname
183 \expandafter\firstoftwoarguments
184 \else
185 \expandafter\secondoftwoarguments
186 \fi}
187
188\let\doiflanguageelse\doifelselanguage
189
190\def\reallanguagetag#1
191 {\ifcsname\??languagelinked#1\endcsname\lastnamedcs\else#1\fi}
192
193
194
195\unexpanded\def\installlanguage
196 {\dodoubleargument\lang_basics_install}
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212\def\lang_basics_install[#1][#2]
213 {\ifcondition\validassignment{#2}
214 \doifelselanguage{#1}
215 {\getparameters[\??language#1][#2]}
216 {\setvalue{\??languagelinked#1}{#1}
217 \lang_basics_install_indeed{#1}{#1}
218 \getparameters[\??language#1][\c!state=\v!start,#2]}
219 \edef\currentsetuplanguage{#1}
220 \clf_definelanguage{#1}{\specificlanguageparameter{#1}\s!default}
221 \the\everysetuplanguage
222 \else
223 \setvalue{\??languagelinked#1}{#2}
224 \clf_setlanguagesynonym{#1}{#2}
225 \lang_basics_install_indeed{#1}{#2}
226 \fi}
227
228\def\lang_basics_install_indeed#1#2
229 {\doifnot{\specificlanguageparameter{#1}\c!define}\v!no
230 {\ifcsname#1\endcsname\else\setuvalue{#1}{\lang_basics_set_current[#2]}\fi}}
231
232
233
234
235
236\unexpanded\def\doifelsepatterns#1
237 {\begingroup
238 \lang_basics_set_current[#1]
239 \ifnum\normallanguage>\zerocount
240 \endgroup\expandafter\firstoftwoarguments
241 \else
242 \endgroup\expandafter\secondoftwoarguments
243 \fi}
244
245\let\doifpatternselse\doifelsepatterns
246
247
248
249
250
251
252
253
254
255
256\unexpanded\def\setuplanguage
257 {\dodoubleempty\lang_basics_setup}
258
259\ifdefined\lang_basics_synchronize \else
260 \let\lang_basics_synchronize\relax
261\fi
262
263\installmacrostack\currentlanguage
264
265\def\lang_basics_setup[#1][#2]
266 {\ifsecondargument
267 \push_macro_currentlanguage
268 \edef\currentsetuplanguage{\reallanguagetag{#1}}
269 \getparameters[\??language\currentsetuplanguage][#2]
270 \the\everysetuplanguage
271 \pop_macro_currentlanguage
272
273 \else
274 \let\currentsetuplanguage\currentlanguage
275 \getparameters[\??language\currentsetuplanguage][#1]
276 \the\everysetuplanguage
277 \fi
278 \lang_basics_synchronize}
279
280\appendtoks
281 \clf_unloadlanguage{\currentsetuplanguage}
282\to \everysetuplanguage
283
284\setuplanguage
285 [\s!default]
286 [\s!patterns=,
287 \s!lefthyphenmin=2,
288 \s!righthyphenmin=2,
289 \s!lefthyphenchar=1,
290 \s!righthyphenchar=45,
291 \s!explicitlefthyphenchar=\languageparameter\s!lefthyphenchar,
292 \s!explicitrighthyphenchar=\languageparameter\s!righthyphenchar,
293
294 \c!lefthyphen=,
295 \c!righthyphen=,
296 \c!hyphen=,
297 \c!spacing=\v!packed,
298 \c!compoundhyphen=\compoundhyphen,
299 \c!rightcompoundhyphen=\compoundhyphen,
300 \c!leftcompoundhyphen=,
301 \c!midsentence=,
302 \c!leftsentence=,
303 \c!rightsentence=,
304 \c!leftsubsentence=,
305 \c!rightsubsentence=,
306 \c!leftquote=\upperleftsinglesixquote,
307 \c!rightquote=\upperrightsingleninequote,
308 \c!leftquotation=\upperleftdoublesixquote,
309 \c!rightquotation=\upperrightdoubleninequote,
310 \c!leftspeech=\languageparameter\c!leftquotation,
311 \c!middlespeech=,
312 \c!rightspeech=\languageparameter\c!rightquotation,
313 \c!limittext=\unknown,
314 \c!time={h,:,m},
315 \c!date={\v!year,\ ,\v!month,\ ,\v!day},
316 \c!text=Ag,
317 \c!font=]
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336\def\currentdatespecification{\languageparameter\c!date}
337\def\currenttimespecification{\languageparameter\c!time}
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373\newtoks \everylanguage
374
375\installcorenamespace{languagenumbers}
376
377\appendtoks
378
379
380 \expandafter\glet\csname\??languagenumbers\currentlanguage\endcsname\undefined
381\to \everysetuplanguage
382
383\def\lang_basics_synchronize_yes
384 {\zerocount
385 \global\expandafter\chardef\csname\??languagenumbers\currentlanguage\endcsname
386 \clf_languagenumber
387 {\currentlanguage}
388 {\defaultlanguage\currentlanguage}
389 {\languageparameter\s!patterns}
390 {\languageparameter\c!factor}
391 \relax
392 \normallanguage\csname\??languagenumbers\currentlanguage\endcsname}
393
394\let\lang_basics_synchronize_nop\zerocount
395
396\letvalue{\??languagenumbers}\lang_basics_synchronize_nop
397
398\appendtoks
399 \letvalue{\??languagenumbers}\lang_basics_synchronize_yes
400\to \everydump
401
402\def\lang_basics_synchronize
403 {\normallanguage\csname\??languagenumbers
404 \ifcsname\??languagenumbers\currentlanguage\endcsname
405 \currentlanguage
406 \fi
407 \endcsname
408 \relax
409 \the\everylanguage
410 \relax}
411
412\newcount\hyphenstate
413\newcount\hyphenminoffset
414
415\unexpanded\def\lesshyphens
416 {\advance\hyphenminoffset\plusone
417 \lang_basics_synchronize_min_max}
418
419\unexpanded\def\morehyphens
420 {\ifcase\hyphenminoffset \else
421 \advance\hyphenminoffset\minusone
422 \fi
423 \lang_basics_synchronize_min_max}
424
425\unexpanded\def\nohyphens
426 {\ifx\dohyphens\relax
427 \unexpanded\edef\dohyphens
428 {\hyphenminoffset\the\hyphenminoffset\relax
429 \lang_basics_synchronize_min_max}
430 \fi
431 \hyphenminoffset\plusthousand
432 \lang_basics_synchronize_min_max}
433
434\let\dohyphens\relax
435
436\unexpanded\def\usehyphensparameter#1
437 {\edef\p_hyphens{#1\c!hyphens}
438 \ifx\p_hyhens\v!no
439 \nohyphens
440 \fi}
441
442\unexpanded\def\lang_basics_synchronize_min_max
443 {
444 \lefthyphenmin \numexpr0\languageparameter\s!lefthyphenmin \hyphenminoffset\relax
445 \righthyphenmin\numexpr0\languageparameter\s!righthyphenmin\hyphenminoffset\relax
446 \hyphenationmin\numexpr0\languageparameter\s!hyphenmin\relax
447
448 \prehyphenchar \languageparameter\s!righthyphenchar\relax
449 \posthyphenchar \languageparameter\s!lefthyphenchar \relax
450 \preexhyphenchar \languageparameter\s!explicitrighthyphenchar\relax
451 \postexhyphenchar\languageparameter\s!explicitlefthyphenchar \relax}
452
453\appendtoks
454 \lang_basics_synchronize_min_max
455\to \everylanguage
456
457\unexpanded\def\unhyphenated
458 {\groupedcommand{\lefthyphenmin\maxdimen}\donothing}
459
460
461
462
463
464
465
466\appendtoks
467 \edef\currentlanguagesetups{\languageparameter\c!setups}
468 \ifx\currentlanguagesetups\empty \else
469 \setups[\currentlanguagesetups]
470 \fi
471\to \everylanguage
472
473
474
475\appendtoks
476 \usebidiparameter\languageparameter
477\to \everylanguage
478
479
480
481\appendtoks
482 \edef\p_spacing{\languageparameter\c!spacing}
483 \ifx\p_spacing\v!broad
484 \nonfrenchspacing
485 \else
486 \frenchspacing
487 \fi
488\to \everylanguage
489
490
491
492
493
494
495
496
497\unexpanded\def\setuplanguages
498 {\setuplanguage[\s!default]}
499
500
501
502
503
504\appendtoks
505 \edef\p_language_font{\languageparameter\c!font}
506 \ifx\p_language_font\empty\else
507 \ifx\p_language_font\v!auto
508 \doaddfeature\currentlanguage
509 \else
510 \doaddfeature\p_language_font
511 \fi
512 \fi
513\to \everylanguage
514
515
516
517\def\lang_basics_switch_asked
518 {\ifcsname\??languagelinked\askedlanguage\endcsname
519 \edef\askedlanguage{\lastnamedcs}
520 \ifx\currentlanguage\askedlanguage \else
521 \setcurrentlanguage\currentmainlanguage\askedlanguage
522 \lang_basics_synchronize
523 \fi
524 \fi}
525
526\unexpanded\def\uselanguageparameter#1
527 {\edef\askedlanguage{#1\c!language}
528 \ifx\askedlanguage\empty\else\lang_basics_switch_asked\fi}
529
530\unexpanded\def\douselanguageparameter#1
531 {\edef\askedlanguage{#1}
532 \ifx\askedlanguage\empty\else\lang_basics_switch_asked\fi}
533
534\unexpanded\def\lang_basics_set_current[#1]
535 {\edef\askedlanguage{#1}
536 \ifx\askedlanguage\empty\else\lang_basics_switch_asked\fi}
537
538\unexpanded\def\language
539 {\doifelsenextoptionalcs\lang_basics_set_current\normallanguage}
540
541\let\setlanguage\language
542
543\let\patterns\gobbleoneargument
544
545\newcount\mainlanguagenumber
546
547
548
549
550\unexpanded\def\startlanguage
551 {\begingroup\language}
552
553\let\stoplanguage\endgroup
554
555\unexpanded\def\mainlanguage[#1]
556 {\edef\askedlanguage{#1}
557 \ifx\askedlanguage\empty \else
558 \ifcsname\??languagelinked\askedlanguage\endcsname
559
560 \edef\askedlanguage{\lastnamedcs}
561 \ifx\currentlanguage\askedlanguage
562 \ifx\currentmainlanguage\askedlanguage \else
563 \setcurrentlanguage\askedlanguage\askedlanguage
564 \lang_basics_synchronize
565 \fi
566 \else
567 \setcurrentlanguage\askedlanguage\askedlanguage
568 \lang_basics_synchronize
569 \fi
570 \fi
571 \fi
572 \mainlanguagenumber\normallanguage}
573
574\appendtoks
575 \normallanguage\mainlanguagenumber
576\to \everybeforepagebody
577
578
579
580\def\splitsequence#1#2
581 {\doifelse{#1}\v!no{#2}{\doifelse{#1}\v!yes{\languageparameter\c!limittext}{#1}}}
582
583\def\splitsymbol#1
584 {\splitsequence{#1}{\languageparameter\c!limittext}}
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694\unexpanded\def\nopatterns{\normallanguage\minusone}
695
696
697
698
699\setupcurrentlanguage[\s!en]
700
701\unexpanded\def\initializemainlanguage
702 {\mainlanguage[\currentlanguage]
703 \showmessage\m!languages9\currentlanguage}
704
705
706
707\let\stopexceptions\relax
708
709\unexpanded\def\startexceptions
710 {\dosingleempty\lang_basics_start_exceptions}
711
712\def\lang_basics_start_exceptions[#1]#2\stopexceptions
713 {\begingroup
714 \edef\askedlanguage{\reallanguagetag{#1}}
715 \ifx\askedlanguage\empty
716 \let\askedlanguage\currentlanguage
717 \fi
718 \clf_setlanguageexceptions{\askedlanguage}{#2}
719 \endgroup}
720
721\unexpanded\def\hyphenation
722 {\clf_setlanguageexceptions{\currentlanguage}}
723
724
725
726\uchyph 1
727\exhyphenchar 45
728
729
730
731\unexpanded\def\traceddiscretionary#1#
732 {\dontleavehmode\lang_basics_traced_discretionary{#1}}
733
734\unexpanded\def\lang_basics_traced_discretionary#1#2#3#4
735 {\normaldiscretionary#1{\darkred#2}{\darkgreen#3}{\darkblue#4}}
736
737\installtextracker
738 {discretionaries}
739 {\let\discretionary\traceddiscretionary}
740 {\let\discretionary\normaldiscretionary}
741
742\unexpanded\def\samplediscretionary
743 {\traceddiscretionary
744 {pre\clf_currentprehyphenchar}
745 {\clf_currentposthyphenchar post}
746 {replace}}
747
748\protect \endinput
749 |