summaryrefslogtreecommitdiff
path: root/macros/optex/base/lang-decl.opm
diff options
context:
space:
mode:
Diffstat (limited to 'macros/optex/base/lang-decl.opm')
-rw-r--r--macros/optex/base/lang-decl.opm312
1 files changed, 312 insertions, 0 deletions
diff --git a/macros/optex/base/lang-decl.opm b/macros/optex/base/lang-decl.opm
new file mode 100644
index 0000000000..87a13b88ce
--- /dev/null
+++ b/macros/optex/base/lang-decl.opm
@@ -0,0 +1,312 @@
+%% This is part of the OpTeX project, see http://petr.olsak.net/optex
+
+\_codedecl \langlist {Languages declaration <2022-02-19>} % preloaded in format
+
+ \_doc -----------------------------
+ \`\_preplang` `<lang-id> <LongName> <lang-tag> <hyph-tag> <lr-hyph>`
+ declares a new language. The parameters (separated by space) are
+ \begitems
+ * <lang-id>: language identifier. It should be derived from ISO 639-1 code
+ but additional letters can be eventually added because <lang-id> must be used
+ uniquely in the whole declaration list. The \^`\_preplang` macro creates
+ the language switch `\_<lang-id>lang` and defines also `\<lang-id>lang`
+ as a macro which expands to `\_<lang-id>lang`. For example, `\_preplang cs Czech ...`
+ creates `\_cslang` as the language switch and defines
+ `\def\cslang{\_cslang}`.
+ * <LongName>: full name of the language.
+ * <lang-tag>: language tag, which is used for setting language-dependent phrases
+ and sorting data. If a language have two or more hyphenation
+ patterns but a single phrases set, then we declare this language
+ more than once with the same <lang-tag> but different <lang-hyph>.
+ * <hyph-tag>: a part of the file name where the hyphenation patterns
+ are prepared in Unicode. The full file name is `hyph-<hyph-tag>.tex`.
+ If <hyph-tag> is `{}` then no hyphenation patterns are loaded.
+ * <lr-hyph>: two digits, they denote `\lefthyphenmin` and
+ `\righthyphenmin` values.
+ \enditems
+ \^`\_preplang` allocates a new internal number by \^`\newlanguage\_<lang-id>Patt`
+ which will be bound to the hyphenation patterns. But the patterns nor other language
+ data are not read at this moment. The `\_<lang-id>lang` is defined as \^`\_langinit`.
+ When the `\_<lang-id>lang` switch is used firstly in a document then the language is
+ initialized, i.e.\ hyphenation patterns and language-dependent data are read.
+ The `\_<lang-id>lang` is re-defined itself after such initialization.
+ \^`\_preplang` does also `\def\_ulan:<longname> {<lang-id>}`, this is needed
+ for the \^`\uselanguage` macro.
+ \_cod -----------------------------
+
+\_def\_preplang #1 #2 #3 #4 #5#6{% lang-id LongName lang-tag hyph-tag lr-hyph
+ \_ifcsname _#1lang\_endcsname \_else
+ \_ea\_newlanguage\_csname _#1Patt\_endcsname
+ \_xdef\_langlist{\_langlist\_space#1(#2)}%
+ \_fi
+ \_lowercase{\_sxdef{_ulan:#2}}{#1}%
+ \_slet{_#1lang}{_relax}%
+ \_sxdef {#1lang}{\_cs{_#1lang}}%
+ \_sxdef {_#1lang}{\_noexpand\_langinit \_cs{_#1lang}#1(#2)#3[#4]#5#6}%
+}
+ \_doc -----------------------------
+ The \^`\_preplang` macro adds `<lang-id>(<LongName>)` to the `\_langlist` macro
+ which is accessible by \`\langlist`. It can be used for reporting declared
+ languages.
+ \_cod -----------------------------
+
+\_def\langlist{\_langlist}
+\_def\_langlist{en(USEnglish)}
+
+ \_doc -----------------------------
+ All languages with hyphenation patterns provided by \TeX/live are
+ declared here. The language switches \`\cslang`, \`\sklang`,
+ \`\delang`, \`\pllang` and many others are declared.
+ You can declare more languages by \^`\_preplang` in your
+ document, if you want.\nl
+ The usage of \^`\_preplang` with <lang-id> already declared is allowed.
+ The language is re-declared in this case. This can be used in your document
+ before first usage of the `\<lang-id>lang` switch.
+ \_cod -----------------------------
+
+% lang-id LongName lang-tag hyph-tag lr-hyph
+\_preplang enus USenglishmax en en-us 23
+% Europe:
+\_preplang engb UKenglish en en-gb 23
+\_preplang be Belarusian be be 22
+\_preplang bg Bulgarian bg bg 22
+\_preplang ca Catalan ca ca 22
+\_preplang hr Croatian hr hr 22
+\_preplang cs Czech cs cs 23
+\_preplang da Danish da da 22
+\_preplang nl Dutch nl nl 22
+\_preplang et Estonian et et 23
+\_preplang fi Finnish fi fi 22
+\_preplang fis schoolFinnish fi fi-x-school 11
+\_preplang fr French fr fr 22
+\_preplang de nGerman de de-1996 22
+\_preplang deo oldGerman de de-1901 22
+\_preplang gsw swissGerman de de-ch-1901 22
+\_preplang elm monoGreek el el-monoton 11
+\_preplang elp Greek el el-polyton 11
+\_preplang grc ancientGreek grc grc 11
+\_preplang hu Hungarian hu hu 22
+\_preplang is Icelandic is is 22
+\_preplang ga Irish ga ga 23
+\_preplang it Italian it it 22
+\_preplang la Latin la la 22
+\_preplang lac classicLatin la la-x-classic 22
+\_preplang lal liturgicalLatin la la-x-liturgic 22
+\_preplang lv Latvian lv lv 22
+\_preplang lt Lithuanian lt lt 22
+\_preplang mk Macedonian mk mk 22
+\_preplang pl Polish pl pl 22
+\_preplang pt Portuguese pt pt 23
+\_preplang ro Romanian ro ro 22
+\_preplang rm Romansh rm rm 22
+\_preplang ru Russian ru ru 22
+\_preplang srl Serbian sr-latn sh-latn 22
+\_preplang src SerbianCyrl sr-cyrl sh-cyrl 22
+\_preplang sk Slovak sk sk 23
+\_preplang sl Slovenian sl sl 22
+\_preplang es Spanish es es 22
+\_preplang sv Swedish sv sv 22
+\_preplang uk Ukrainian uk uk 22
+\_preplang cy Welsh cy cy 23
+% Others:
+\_preplang af Afrikaans af af 12
+\_preplang hy Armenian hy hy 12
+\_preplang as Assamese as as 11
+\_preplang eu Basque eu eu 22
+\_preplang bn Bengali bn bn 11
+\_preplang nb Bokmal nb nb 22
+\_preplang cop Coptic cop cop 11
+\_preplang cu churchslavonic cu cu 12
+\_preplang eo Esperanto eo eo 22
+\_preplang ethi Ethiopic ethi mul-ethi 11
+\_preplang fur Friulan fur fur 22
+\_preplang gl Galician gl gl 22
+\_preplang ka Georgian ka ka 12
+\_preplang gu Gujarati gu gu 11
+\_preplang hi Hindi hi hi 11
+\_preplang id Indonesian id id 22
+\_preplang ia Interlingua ia ia 22
+\_preplang kn Kannada kn kn 11
+\_preplang kmr Kurmanji kmr kmr 22
+\_preplang ml Malayalam ml ml 11
+\_preplang mr Marathi mr mr 11
+\_preplang mn Mongolian mn mn-cyrl 22
+\_preplang nn Nynorsk nn nn 22
+\_preplang oc Occitan oc oc 22
+\_preplang or Oriya or or 11
+\_preplang pi Pali pi pi 12
+\_preplang pa Panjabi pa pa 11
+\_preplang pms Piedmontese pms pms 22
+\_preplang zh Pinyin zh zh-latn-pinyin 11
+\_preplang sa Sanskrit sa sa 13
+\_preplang ta Tamil ta ta 11
+\_preplang te Telugu te te 11
+\_preplang th Thai th th 23
+\_preplang tr Turkish tr tr 22
+\_preplang tk Turkmen tk tk 22
+\_preplang hsb Uppersorbian hsb hsb 22
+
+ \_doc -----------------------------
+ \`\_preplangmore` `<lang-id><space>{<text>}` declares more activities
+ of the language switch. The <text> is processed whenever
+ `\_<lang-id>lang` is invoked. If \^`\_preplangmore` is not declared
+ for given language then \`\_langdefault` is processed.\nl
+ You can implement selecting a required script for given language, for
+ example:
+ \begtt
+ \_preplangmore ru {\_frenchspacing \_setff{script=cyrl}\selectcyrlfont}
+ \_addto\_langdefaut {\_setff{}\selectlatnfont}
+ \endtt
+ The macros `\selectcyrlfont` and `\selectlatnfont` are not defined in
+ \OpTeX/. If you follow this example, you have to define them after your
+ decision what fonts will be used in your specific situation.
+ \_cod -----------------------------
+
+\_def\_preplangmore #1 #2{\_ea \_gdef \_csname _langspecific:#1\_endcsname{#2}}
+\_def\_langdefault{\_frenchspacing}
+
+\_preplangmore en {\_nonfrenchspacing}
+\_preplangmore enus {\_nonfrenchspacing}
+\_def\_langdefault {\_frenchspacing}
+
+ \_doc -----------------------------
+ The default `\language=0` is US-English with original hyphenation patterns
+ preloaded in the format (see the end of section~\ref[plain]).
+ We define `\_enlang` and \`\enlang` switches.
+ Note that if no language switch is used in the document then
+ `\language=0` and US-English patterns are used, but \^`\nonfrenchspacing`
+ isn't set.
+ \_cod -----------------------------
+
+\_chardef\_enPatt=0
+\_sdef{_lan:0}{en}
+\_sdef{_ulan:usenglish}{en}
+\_def\_enlang{\_uselang{en}\_enPatt23} % \lefthyph=2 \righthyph=3
+\_def\enlang{\_enlang}
+
+ \_doc -----------------------------
+ The list of declared languages are reported during format generation.
+ \_cod -----------------------------
+
+\_message{Declared languages: \_langlist.
+ Use \_string\<lang-id>lang to initialize language,
+ \_string\cslang\_space for example.}
+
+ \_doc -----------------------------
+ Each language switch `\_<lang-id>lang` defined by \^`\_preplang` has its initial state\nl
+ \`\_langinit` `\<switch> <lang-id>(<LongName>)<lang-tag>[<hyph-tag>]<lr-hyph>`.
+ The \^`\_langinit` macro does:
+ \begitems
+ * The internal language <number> is extracted from `\_the\_<lang-id>Patt`.
+ * `\def \_lan:<number> {<lang-tag>}` for mapping from `\language` number to the <lang-tag>.
+ * loads `hyph-<hyph-tag>.tex` file with hyphenation patterns when `\language=<number>`.
+ * loads the part of `lang-data.opm` file with language-dependent phrases
+ using \^`\_langinput`.
+ * `\def \_<lang-id>lang {\_uselang{<lang-id>}\_<lang-id>Patt <lr-hyph>}`,
+ i.e. the switch redefines itself for doing a \"normal job" when the
+ language switch is used repeatedly.
+ * Runs itself (i.e. `\_<lang-id>lang`) again for doing the \"normal job" firstly.
+ \enditems
+ \_cod -----------------------------
+
+\_def\_langinit #1#2(#3)#4[#5]#6#7{% \_switch lang-id(LongName)lang-tag[hyph-file]lr-hyph
+ \_sxdef{_lan:\_ea\_the\_csname _#2Patt\_endcsname}{#4}%
+ \_begingroup \_setbox0=\_vbox{% we don't want spaces in horizontal mode
+ \_setctable\_optexcatcodes
+ % loading patterns:
+ \_language=\cs{_#2Patt}\_relax
+ \_ifx^#5^\_else
+ \_wlog{Loading hyphenation for #3: \_string\language=\_the\_language\_space(#5)}%
+ \_let\patterns=\_patterns \_let\hyphenation=\_hyphenation \_def\message##1{}%
+ \_isfile {hyph-#5}\_iftrue \_input{hyph-#5}%
+ \_else \_opwarning{No hyph. patterns #5 for #3, missing package?}\_fi
+ \_fi
+ % loading language data:
+ \_langinput{#4}%
+ }\_endgroup
+ \xdef#1{\noexpand\_uselang{#2}\_csname _#2Patt\_endcsname #6#7}%
+ #1% do language switch
+}
+
+ \_doc -----------------------------
+ \`\_uselang``{<lang-id>}\_<lang-id>Patt <pre-hyph><post-hyph>`
+ is used as \"normal job" of the switch.
+ It sets `\language`, `\lefthyphenmin`, `\righthyphenmin`.
+ Finally, it runs data from \^`\_preplangmore` or runs \^`\_langdefault`.
+ \_cod -----------------------------
+
+\_def\_uselang#1#2#3#4{\_language=#2\_lefthyphenmin=#3\_righthyphenmin=#4\_relax
+ \_trycs{_langspecific:#1}{\_langdefault}%
+}
+
+ \_doc -----------------------------
+ The \`\uselanguage` `{<LongName>}` macro is defined here
+ (for compatibility with e-plain users). Its parameter is case insensitive.
+ \_cod -----------------------------
+
+\_def\_uselanguage#1{\_def\_tmp{#1}\_lowercase{\_cs{_\_trycs{_ulan:#1}{0x}lang}}}
+\_sdef{_0xlang}{\_opwarning{\_string\uselanguage{\_tmp}: Unknown language name, ignored}}
+\_public \uselanguage ;
+
+ \_doc -----------------------------
+ The \"language data" include declarations of
+ rules for sorting (see section~\ref[makeindex]),
+ language-dependent phrases and quotation marks (see section~\ref[langphrases]).
+ The language data are collected in the single `lang-data.opm` file.
+ Appropriate parts of this file is read by \^`\_langinput{<lang-tag>}`.
+ First few lines of the file looks like:
+ {\maxlines=47 \printdoc lang-data.opm }%
+ There are analogical declaration for more languages here. Unfortunately, this
+ file is far for completeness. I welcome you send me a part of declaration
+ for your language.
+
+ If your language is missing in this file then a warning is reported during
+ language initialization. You can create your private declaration in your
+ macros (analogical as in the `lang-data.opm` file
+ but without the \^`\_langdata` prefix).
+ Then you will want to remove the warning about missing data. This can be
+ done by \`\nolanginput``{<lang-tag>}` given before initialization of your
+ language.
+
+ The whole file `lang-data.opm` is not preloaded in the format because
+ I suppose a plenty languages here and I don't want to waste the \TeX/ memory
+ by these declarations. Each part of this file prefixed by
+ \`\_langdata` `<lang-tag> {<LongName>}` is read separately
+ when \`\_langinput``{<lang-tag>}` is used. And it is used
+ in the \^`\_langinit` macro (i.e.\ when the language is initialized),
+ so the appropriate part of this file is read automatically on demand.
+
+ If the part of the `lang-data.opm` concerned by <lang-tag> is read already
+ then `\_li:<lang-tag>` is set to `R` and we don't read this part of the file again.
+ \_cod -----------------------------
+
+\_def\_langinput #1{%
+ \_unless \_ifcsname _li:#1\_endcsname
+ \_bgroup
+ \_edef\_tmp{\_noexpand\_langdata #1 }\_everyeof\_ea{\_tmp{}}%
+ \_long \_ea\_def \_ea\_tmp \_ea##\_ea1\_tmp{\_readlangdata{#1}}%
+ \_globaldefs=1
+ \_ea\_tmp \_input{lang-data.opm}%
+ \_ea\_glet \_csname _li:#1\_endcsname R%
+ \_egroup
+ \_fi
+}
+\_def\_readlangdata #1#2{%
+ \_ifx^#2^\_opwarning{Missing data for language "#1" in lang-data.opm}%
+ \_else \_wlog{Reading data for the language #2 (#1)}%
+ \_fi
+}
+\_def\_langdata #1 #2{\_endinput}
+\_def\_nolanginput #1{\_ea\_glet \_csname _li:#1\_endcsname N}
+\_public \nolanginput ;
+
+ \_doc -----------------------------
+ Data of two preferred languages are preloaded in the format:
+ \_cod -----------------------------
+
+\_langinput{en} \_langinput{cs}
+
+\_endcode
+
+2022-02-19 \_langinput moved here
+2022-02-17 released, original file was hyphen-lan.opm