texlive[67485] Master/texmf-dist: babel (26jun23)

commits+karl at tug.org commits+karl at tug.org
Mon Jun 26 22:20:23 CEST 2023


Revision: 67485
          http://tug.org/svn/texlive?view=revision&revision=67485
Author:   karl
Date:     2023-06-26 22:20:23 +0200 (Mon, 26 Jun 2023)
Log Message:
-----------
babel (26jun23)

Modified Paths:
--------------
    trunk/Master/texmf-dist/doc/latex/babel/README.md
    trunk/Master/texmf-dist/doc/latex/babel/babel-code.pdf
    trunk/Master/texmf-dist/doc/latex/babel/babel.pdf
    trunk/Master/texmf-dist/source/latex/babel/babel.dtx
    trunk/Master/texmf-dist/source/latex/babel/babel.ins
    trunk/Master/texmf-dist/source/latex/babel/bbcompat.dtx
    trunk/Master/texmf-dist/source/latex/babel/locale.zip
    trunk/Master/texmf-dist/tex/generic/babel/babel.def
    trunk/Master/texmf-dist/tex/generic/babel/babel.sty
    trunk/Master/texmf-dist/tex/generic/babel/hyphen.cfg
    trunk/Master/texmf-dist/tex/generic/babel/locale/la/babel-la-x-classic.ini
    trunk/Master/texmf-dist/tex/generic/babel/locale/la/babel-la-x-ecclesia.ini
    trunk/Master/texmf-dist/tex/generic/babel/locale/la/babel-medievallatin.tex
    trunk/Master/texmf-dist/tex/generic/babel/luababel.def
    trunk/Master/texmf-dist/tex/generic/babel/nil.ldf
    trunk/Master/texmf-dist/tex/generic/babel/txtbabel.def
    trunk/Master/texmf-dist/tex/generic/babel/xebabel.def

Added Paths:
-----------
    trunk/Master/texmf-dist/tex/generic/babel/locale/fa/babel-farsi.tex
    trunk/Master/texmf-dist/tex/generic/babel/locale/la/babel-classicallatin.tex
    trunk/Master/texmf-dist/tex/generic/babel/locale/la/babel-ecclesiasticallatin.tex

Removed Paths:
-------------
    trunk/Master/texmf-dist/tex/generic/babel/locale/vi/babel-vietnam.tex

Modified: trunk/Master/texmf-dist/doc/latex/babel/README.md
===================================================================
--- trunk/Master/texmf-dist/doc/latex/babel/README.md	2023-06-26 20:19:05 UTC (rev 67484)
+++ trunk/Master/texmf-dist/doc/latex/babel/README.md	2023-06-26 20:20:23 UTC (rev 67485)
@@ -1,6 +1,6 @@
-## Babel 3.89
+## Babel 3.90
 
-2023-05-11
+2023-06-26
 
 This package manages culturally-determined typographical (and other)
 rules, and hyphenation patterns for a wide range of languages. Many
@@ -10,9 +10,9 @@
 
 The latest stable version is available on <https://ctan.org/pkg/babel>.
 
-Changes in version 3.89 are described in:
+Changes in version 3.90 are described in:
 
-https://latex3.github.io/babel/news/whats-new-in-babel-3.89.html
+https://latex3.github.io/babel/news/whats-new-in-babel-3.90.html
 
 Apart from the manual, you can find information on some aspects of babel at:
 
@@ -41,7 +41,7 @@
 
 You may also report them to the current maintainer more informally on:
 
-   http://www.texnia.com/contact.html
+   https://latex3.github.io/babel/contact.html
 
 Bugs related to specific languages are best reported to their
 respective authors.
@@ -48,14 +48,18 @@
 
 ### Summary of latest changes
 ```
-3.89  2023-05-11
-      * Deprecating \SetCase, \aliasshorthands, and 'strings' package
-        options in the manual.
-      * The manual has been split in two documents: 'babel.pdf' is the
-        user guide, and 'babel-code.pdf' is the code.
-      * Alternative syntax to pass 'modifiers' to babel languages.
-      * Code cleaned up: babel.def has been shortened dramatically,
-        and babel.sty is a bit smaller.
+3.90  2023-06-26
+      * Main language selected at begindocument/before (#240).
+      * Option to limit the number of inserted tatweel.
+      * New macros `\BabelUppercaseMapping` and 
+        `\BabelLowercaseMapping`.
+      * Fix: line breaking was sometimes prevented when switching the
+        text direction (#213).
+      * Locale names (in ini files):
+        - `classicallatin` and `ecclesiasticallatin` now preferred to 
+          `classiclatin` and `ecclesiasticlatin`.
+        - `farsi` is a synonymous for `persian`. 
+        - `vietnam` removed - use `vietnamese`.
 ```
 
 ### Previous changes

Modified: trunk/Master/texmf-dist/doc/latex/babel/babel-code.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/latex/babel/babel.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/source/latex/babel/babel.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/babel/babel.dtx	2023-06-26 20:19:05 UTC (rev 67484)
+++ trunk/Master/texmf-dist/source/latex/babel/babel.dtx	2023-06-26 20:20:23 UTC (rev 67485)
@@ -32,7 +32,7 @@
 %
 % \iffalse
 %<*filedriver>
-\ProvidesFile{babel.dtx}[2023/05/11 v3.89 The Babel package]
+\ProvidesFile{babel.dtx}[2023/06/26 v3.90 The Babel package]
 \documentclass{ltxdoc}
 \GetFileInfo{babel.dtx}
 \usepackage{fontspec}
@@ -48,11 +48,7 @@
      ItalicFont = NotoSans-Italic.ttf,
      BoldItalicFont = NotoSans-BoldItalic.ttf]
   {NotoSans-Regular.ttf}
-\setmonofont[
-  Scale=.88, FakeStretch=.95,
-  BoldFont = NotoMono-Regular.ttf,
-  ItalicFont = NotoMono-Regular.ttf,
-  BoldItalicFont = NotoMono-Regular.ttf]{NotoMono-Regular.ttf}
+\setmonofont[Scale=.86, FakeStretch=.97]{DejaVu Sans Mono}
 \raggedright
 \addtolength{\textwidth}{25pt}
 \addtolength{\textheight}{3.5cm}
@@ -110,6 +106,7 @@
 \newtheorem{note}{Note}
 \newtheorem{example}{Example}
 \newtheorem{troubleshooting}{Troubleshooting}
+\newtheorem{more}{More}
 \let\bblxv\verbatim
 \let\bblexv\endverbatim
 \newcommand\setengine{\def\engine}
@@ -283,7 +280,9 @@
 \href{https://github.com/latex3/babel/issues}{GitHub}, which is much
 better than just complaining on an e-mail list or a web forum. Remember
 \textit{warnings are not errors} by themselves, they just warn about
-possible problems or incompatibilities.
+possible problems or incompatibilities. Hyphenation rules are
+maintained separately
+\href{https://github.com/hyphenation/tex-hyphen}{here}.
 
 \item[\sffamily\color{messages}How can I contribute a new
 language?] See section \ref{contribute} for contributing a language.
@@ -300,7 +299,7 @@
   there are many
   \href{https://github.com/latex3/babel/tree/master/samples}{sample
   files}.
-  
+
 \item[\sffamily\color{messages}Where is the code?]
   Run |lualatex --jobname=babel-code \let\babelcode\relax\input{babel.dtx}|.
 \end{description}
@@ -437,7 +436,12 @@
 \begin{verbatim}
 \usepackage[_pdflang=es-MX_]{hyperref}
 \end{verbatim}
-This is not currently done by \babel{} and you must set it by hand.
+This is not currently done by \babel{} and you must set it by hand. The
+document language can be also set with |\DocumentMetadata|, before
+|\documentclass|; for example:
+\begin{verbatim}
+\DocumentMetadata{_lang=es-MX_}
+\end{verbatim}
 \end{note}
 
 \begin{note}
@@ -583,6 +587,14 @@
 is worth remembering that |\babelfont| does \textit{not} load any font
 until required, so that it can be used just in case.
 
+\New{3.84} With \pdftex, when a language is loaded on the fly
+(actually, with |\babelprovide|, because this is the macro used
+internally to load it) selectors now set the font encoding based on the
+list provided when loading |fontenc|. Not all scripts have an
+associated encoding, so this feature works only with Latin, Cyrillic,
+Greek, Arabic, Hebrew, Cherokee, Armenian, and Georgian, provided a
+suitable font is found.
+
 \begin{example}
   A trivial document with the default font in English and Spanish, and
   FreeSerif in Russian is:
@@ -610,14 +622,6 @@
   for |lubakatanga|). See section \ref{bcp47} for further details.
 \end{note}
 
-\New{3.84} With \pdftex, when a language is loaded on the fly
-(actually, with |\babelprovide|, because this is the macro used
-internally to load it) selectors now set the font encoding based on the
-list provided when loading |fontenc|. Not all scripts have an
-associated encoding, so this feature works only with Latin, Cyrillic,
-Greek, Arabic, Hebrew, Cherokee, Armenian, and Georgian, provided a
-suitable font is found.
-
 \subsection{Modifiers}
 
 \New{3.9c} The basic behavior of some languages can be modified when
@@ -1217,6 +1221,8 @@
 footlines are not touched (only marks), and if they contain
 language-dependent macros (which is not usual) there may be unexpected
 results. With this option you may set the language in heads and foots.
+An alternative is to set the language explicitly when heads and foots
+are redefined.
 
 \Describe{noconfigs}{} Global and language default config files are
 not loaded, so you can make sure your document is not spoilt by an
@@ -1358,8 +1364,6 @@
 \begin{example}
   Although Georgian has its own \texttt{ldf} file, here is how to
   declare this language with an |ini| file in Unicode engines.
-\begingroup
-\setmonofont[Scale=.87,Script=Georgian]{DejaVu Sans Mono}
 \setengine{luatex/xetex}
 \begin{verbatim}
 \documentclass{book}
@@ -1379,9 +1383,13 @@
 
 \end{document}
 \end{verbatim}
-\endgroup
 \end{example}
 
+\begin{more}
+  There is an example of how to use a template |ini| file
+  \href{https://github.com/latex3/babel/issues/176#issuecomment-1080846575}{here}, for Phoenician.
+\end{more}
+
 \New{3.49} Alternatively, you can tell babel to load all or some
 languages passed as options with |\babelprovide| and not from the |ldf|
 file in a few few typical cases. Thus, |provide=*| means ‘load the main
@@ -1451,13 +1459,10 @@
   wrongly with the default renderer. The comment about Indic scripts
   and \textsf{lualatex} also applies here. Some quick patterns can
   help, with something similar to:
-\begingroup
-\setmonofont[Script=Lao,Scale=MatchLowercase]{DejaVu Sans Mono}
 \begin{verbatim}
 \babelprovide[import, hyphenrules=+]{lao}
 \babelpatterns[lao]{1ດ 1ມ 1ອ 1ງ 1ກ 1າ} % Random
 \end{verbatim}
-\endgroup
 \item[East Asia scripts] Settings for either Simplified of Traditional
   should work out of the box, with basic line breaking with any
   renderer. Although for a few words and shorts texts the |ini| files
@@ -1505,6 +1510,8 @@
 \def\hascapl{\textsuperscript{l}}
 
 \begin{multicols}{2}
+\tag{aa} Afar
+\tag{ab} Abkhazian
 \tag{af} Afrikaans\hascapu\hascapl
 \tag{agq} Aghem
 \tag{ak} Akan
@@ -1526,11 +1533,14 @@
 \tag{az-Cyrl} Azerbaijani
 \tag{az-Latn} Azerbaijani
 \tag{az} Azerbaijani\hascapu\hascapl
+\tag{bal} Baluchi
 \tag{bas} Basaa
 \tag{be} Belarusian\hascapu\hascapl
 \tag{bem} Bemba
 \tag{bez} Bena
 \tag{bg} Bulgarian\hascapu\hascapl
+\tag{bgc} Haryanvi
+\tag{bho} Bhojpuri
 \tag{bm} Bambara
 \tag{bn} Bangla\hascapu
 \tag{bo} Tibetan\hascapu
@@ -1539,7 +1549,9 @@
 \tag{bs-Cyrl} Bosnian
 \tag{bs-Latn} Bosnian\hascapu\hascapl
 \tag{bs} Bosnian\hascapu\hascapl
+\tag{byn} Blin
 \tag{ca} Catalan\hascapu\hascapl
+\tag{cch} Atsam
 \tag{ce} Chechen
 \tag{cgg} Chiga
 \tag{chr} Cherokee
@@ -1546,6 +1558,7 @@
 \tag{ckb-Arab} Central Kurdish\hascapu
 \tag{ckb-Latn} Central Kurdish\hascapu
 \tag{ckb} Central Kurdish\hascapu
+\tag{co} Corsican
 \tag{cop} Coptic
 \tag{cs} Czech\hascapu\hascapl
 \tag{cu-Cyrs} Church Slavic\hascapu
@@ -1593,12 +1606,16 @@
 \tag{fr-CA} Canadian French\hascapu\hascapl
 \tag{fr-CH} Swiss French\hascapu\hascapl
 \tag{fr-LU} French\hascapu\hascapl
+\tag{fr-x-acadian} Acadian\hascapu\hascapl
 \tag{fr} French\hascapu\hascapl
 \tag{fur} Friulian\hascapu\hascapl
 \tag{fy} Western Frisian
 \tag{ga} Irish\hascapu\hascapl
+\tag{gaa} Ga
 \tag{gd} Scottish Gaelic\hascapu\hascapl
+\tag{gez} Geez
 \tag{gl} Galician\hascapu\hascapl
+\tag{gn} Guarani
 \tag{grc} Ancient Greek\hascapu\hascapl
 \tag{gsw} Swiss German
 \tag{gu} Gujarati
@@ -1620,12 +1637,15 @@
 \tag{ii} Sichuan Yi
 \tag{is} Icelandic\hascapu\hascapl
 \tag{it} Italian\hascapu\hascapl
+\tag{iu} Inuktitut
 \tag{ja} Japanese\hascapu
 \tag{jgo} Ngomba
 \tag{jmc} Machame
 \tag{ka} Georgian\hascapu
 \tag{kab} Kabyle
+\tag{kaj} Jju
 \tag{kam} Kamba
+\tag{kcg} Tyap
 \tag{kde} Makonde
 \tag{kea} Kabuverdianu
 \tag{kgp} Kaingang
@@ -1649,13 +1669,14 @@
 \tag{ksh} Colognian
 \tag{kw} Cornish
 \tag{ky} Kyrgyz
-\tag{la-x-classic} Classic Latin\hascapu\hascapl
-\tag{la-x-ecclesia} Ecclesiastic Latin\hascapu\hascapl
+\tag{la-x-classic} Classical Latin\hascapu\hascapl
+\tag{la-x-ecclesia} Ecclesiastical Latin\hascapu\hascapl
 \tag{la-x-medieval} Medieval Latin\hascapu\hascapl
 \tag{la} Latin\hascapu\hascapl
 \tag{lag} Langi
 \tag{lb} Luxembourgish\hascapu\hascapl
 \tag{lg} Ganda
+\tag{lij} Ligurian
 \tag{lkt} Lakota
 \tag{ln} Lingala
 \tag{lo} Lao\hascapu
@@ -1680,7 +1701,9 @@
 \tag{ms} Malay\hascapu\hascapl
 \tag{mt} Maltese
 \tag{mua} Mundang
+\tag{mus} Muscogee
 \tag{my} Burmese
+\tag{myv} Erzya
 \tag{mzn} Mazanderani
 \tag{naq} Nama
 \tag{nb} Norwegian Bokmål\hascapu\hascapl
@@ -1691,7 +1714,11 @@
 \tag{nn} Norwegian Nynorsk\hascapu\hascapl
 \tag{nnh} Ngiemboon
 \tag{no} Norwegian\hascapu\hascapl
+\tag{nqo} N’Ko
+\tag{nr} South Ndebele
+\tag{nso} Northern Sotho
 \tag{nus} Nuer
+\tag{ny} Nyanja
 \tag{nyn} Nyankole
 \tag{oc} Occitan\hascapu\hascapl
 \tag{om} Oromo
@@ -1700,13 +1727,16 @@
 \tag{pa-Arab} Punjabi
 \tag{pa-Guru} Punjabi\hascapu
 \tag{pa} Punjabi\hascapu
+\tag{pap} Papiamento
 \tag{pl} Polish\hascapu\hascapl
 \tag{pms} Piedmontese\hascapu\hascapl
+\tag{prg} Prussian
 \tag{ps} Pashto
 \tag{pt-BR} Brazilian Portuguese\hascapu\hascapl
 \tag{pt-PT} European Portuguese\hascapu\hascapl
 \tag{pt} Portuguese\hascapu\hascapl
 \tag{qu} Quechua
+\tag{raj} Rajasthani
 \tag{rm} Romansh\hascapu\hascapl
 \tag{rn} Rundi
 \tag{ro-MD} Moldavian\hascapu\hascapl
@@ -1726,6 +1756,7 @@
 \tag{saq} Samburu
 \tag{sbp} Sangu
 \tag{sc} Sardinian
+\tag{scn} Sicilian
 \tag{se} Northern Sami\hascapu\hascapl
 \tag{seh} Sena
 \tag{ses} Koyraboro Senni
@@ -1744,22 +1775,33 @@
 \tag{sr-Cyrl-ME} Serbian\hascapu\hascapl
 \tag{sr-Cyrl-XK} Serbian\hascapu\hascapl
 \tag{sr-Cyrl} Serbian\hascapu\hascapl
+\tag{sr-ijekavsk} Serbian\hascapu\hascapl
 \tag{sr-Latn-BA} Serbian\hascapu\hascapl
+\tag{sr-Latn-ijekavsk} Serbian\hascapu\hascapl
 \tag{sr-Latn-ME} Serbian\hascapu\hascapl
 \tag{sr-Latn-XK} Serbian\hascapu\hascapl
 \tag{sr-Latn} Serbian\hascapu\hascapl
 \tag{sr} Serbian\hascapu\hascapl
+\tag{ss} Swati
+\tag{ssy} Saho
+\tag{st} Southern Sotho
 \tag{sv} Swedish\hascapu\hascapl
 \tag{sw} Swahili
 \tag{syr} Syriac
+\tag{szl} Silesian
 \tag{ta} Tamil\hascapu
 \tag{te} Telugu\hascapu
 \tag{teo} Teso
 \tag{th} Thai\hascapu\hascapl
 \tag{ti} Tigrinya
+\tag{tig} Tigre
 \tag{tk} Turkmen\hascapu\hascapl
+\tag{tn} Tswana
 \tag{to} Tongan
+\tag{tpi} Tok Pisin
 \tag{tr} Turkish\hascapu\hascapl
+\tag{trv} Taroko
+\tag{ts} Tsonga
 \tag{twq} Tasawaq
 \tag{tzm} Central Atlas Tamazight
 \tag{ug} Uyghur\hascapu
@@ -1772,9 +1814,12 @@
 \tag{vai-Latn} Vai
 \tag{vai-Vaii} Vai
 \tag{vai} Vai
+\tag{ve} Venda
 \tag{vi} Vietnamese\hascapu\hascapl
+\tag{vo} Volapük
 \tag{vun} Vunjo
 \tag{wae} Walser
+\tag{wal} Wolaytta
 \tag{xog} Soga
 \tag{yav} Yangben
 \tag{yi} Yiddish
@@ -1791,7 +1836,6 @@
 \tag{zh-Hant} Chinese\hascapu
 \tag{zh} Chinese\hascapu
 \tag{zu} Zulu
-
 \end{multicols}
 \endgroup
 \hrule
@@ -1806,86 +1850,120 @@
 
 \begingroup
 \bigskip\hrule\nobreak
-
+\small
 \let\\\par
 
-\begin{multicols}{2}
-afrikaans\\
+\begin{multicols}{3}
+abkhazian\\
+acadian\\
+afar\\
+afrikaans\\
 aghem\\
 akan\\
 albanian\\
 american\\
+americanenglish\\
 amharic\\
 ancientgreek\\
 arabic\\
 arabic-algeria\\
-arabic-DZ\\
+arabic-dz\\
+arabic-eg\\
+arabic-egypt\\
+arabic-iq\\
+arabic-iraq\\
+arabic-jo\\
+arabic-jordan\\
+arabic-lb\\
+arabic-lebanon\\
+arabic-ma\\
 arabic-morocco\\
-arabic-MA\\
+arabic-palestinianterritories\\
+arabic-ps\\
+arabic-sa\\
+arabic-saudiarabia\\
+arabic-sy\\
 arabic-syria\\
-arabic-SY\\
+arabic-tn\\
+arabic-tunisia\\
 armenian\\
 assamese\\
 asturian\\
 asu\\
+atsam\\
 australian\\
+australianenglish\\
 austrian\\
+azerbaijani\\
 azerbaijani-cyrillic\\
 azerbaijani-cyrl\\
 azerbaijani-latin\\
 azerbaijani-latn\\
-azerbaijani\\
 bafia\\
+baluchi\\
 bambara\\
+bangla\\
 basaa\\
 basque\\
 belarusian\\
 bemba\\
 bena\\
-bangla\\
+bengali\\
+bhojpuri\\
+blin\\
 bodo\\
+bosnian\\
 bosnian-cyrillic\\
 bosnian-cyrl\\
 bosnian-latin\\
 bosnian-latn\\
-bosnian\\
 brazilian\\
+brazilianportuguese\\
 breton\\
 british\\
+britishenglish\\
 bulgarian\\
 burmese\\
 canadian\\
+canadianenglish\\
 cantonese\\
 catalan\\
 centralatlastamazight\\
 centralkurdish\\
+centralkurdish-latin\\
+centralkurdish-latn\\
 chechen\\
 cherokee\\
 chiga\\
+chinese\\
+chinese-hans\\
 chinese-hans-hk\\
 chinese-hans-mo\\
 chinese-hans-sg\\
-chinese-hans\\
+chinese-hant\\
 chinese-hant-hk\\
 chinese-hant-mo\\
-chinese-hant\\
+chinese-simplified\\
 chinese-simplified-hongkongsarchina\\
 chinese-simplified-macausarchina\\
 chinese-simplified-singapore\\
-chinese-simplified\\
+chinese-traditional\\
 chinese-traditional-hongkongsarchina\\
 chinese-traditional-macausarchina\\
-chinese-traditional\\
-chinese\\
 churchslavic\\
 churchslavic-cyrs\\
+churchslavic-glag\\
+churchslavic-glagolitic\\
 churchslavic-oldcyrillic\footnote{The name in the CLDR
 is Old Church Slavonic Cyrillic, but it has been shortened
 for practical reasons.}\\
 churchsslavic-glag\\
-churchsslavic-glagolitic\\
+churchslavonic\\
+classicallatin\\
 colognian\\
+coptic\\
 cornish\\
+corsican\\
 croatian\\
 czech\\
 danish\\
@@ -1892,7 +1970,9 @@
 duala\\
 dutch\\
 dzongkha\\
+ecclesiasticallatin\\
 embu\\
+english\\
 english-au\\
 english-australia\\
 english-ca\\
@@ -1903,41 +1983,52 @@
 english-unitedkingdom\\
 english-unitedstates\\
 english-us\\
-english\\
+erzya\\
 esperanto\\
 estonian\\
+europeanportuguese\\
 ewe\\
 ewondo\\
 faroese\\
+farsi\\
 filipino\\
 finnish\\
+french\\
 french-be\\
 french-belgium\\
 french-ca\\
 french-canada\\
+french-canadianfrench\\
 french-ch\\
 french-lu\\
 french-luxembourg\\
+french-swissfrench\\
 french-switzerland\\
-french\\
 friulian\\
 fulah\\
+ga\\
 galician\\
 ganda\\
+geez\\
 georgian\\
+german\\
 german-at\\
 german-austria\\
+german-austria-traditional\\
 german-ch\\
 german-switzerland\\
-german\\
+german-switzerland-traditional\\
+german-traditional\\
 greek\\
+guarani\\
 gujarati\\
 gusii\\
+haryanvi\\
+hausa\\
 hausa-gh\\
 hausa-ghana\\
 hausa-ne\\
 hausa-niger\\
-hausa\\
 hawaiian\\
 hebrew\\
 hindi\\
@@ -1947,12 +2038,15 @@
 inarisami\\
 indonesian\\
 interlingua\\
+inuktitut\\
 irish\\
 italian\\
 japanese\\
+jju\\
 jolafonyi\\
 kabuverdianu\\
 kabyle\\
+kaingang\\
 kako\\
 kalaallisut\\
 kalenjin\\
@@ -1965,18 +2059,22 @@
 kinyarwanda\\
 konkani\\
 korean\\
+korean-han\\
+korean-hani\\
 koyraborosenni\\
 koyrachiini\\
+kurmanji\\
 kwasio\\
 kyrgyz\\
 lakota\\
 langi\\
 lao\\
+latin\\
 latvian\\
+ligurian\\
 lingala\\
 lithuanian\\
 lowersorbian\\
-lsorbian\\
 lubakatanga\\
 luo\\
 luxembourgish\\
@@ -1986,11 +2084,11 @@
 makhuwameetto\\
 makonde\\
 malagasy\\
+malay\\
 malay-bn\\
 malay-brunei\\
 malay-sg\\
 malay-singapore\\
-malay\\
 malayalam\\
 maltese\\
 manx\\
@@ -1997,58 +2095,81 @@
 marathi\\
 masai\\
 mazanderani\\
+medievallatin\\
 meru\\
 meta\\
 mexican\\
+mexicanspanish\\
+moldavian\\
 mongolian\\
+monotonicgreek\\
 morisyen\\
 mundang\\
+muscogee\\
 nama\\
+naustrian\\
 nepali\\
 newzealand\\
+ngerman\\
 ngiemboon\\
 ngomba\\
+nheengatu\\
+nko\\
 norsk\\
+northernkurdish\\
+northernkurdish-arab\\
+northernkurdish-arabic\\
 northernluri\\
 northernsami\\
+northernsotho\\
 northndebele\\
+norwegian\\
 norwegianbokmal\\
 norwegiannynorsk\\
 nswissgerman\\
 nuer\\
+nyanja\\
 nyankole\\
 nynorsk\\
 occitan\\
+odia\\
 oriya\\
 oromo\\
 ossetic\\
+papiamento\\
 pashto\\
 persian\\
 piedmontese\\
 polish\\
 polytonicgreek\\
+portuguese\\
 portuguese-br\\
 portuguese-brazil\\
 portuguese-portugal\\
 portuguese-pt\\
-portuguese\\
+prussian\\
+punjabi\\
 punjabi-arab\\
 punjabi-arabic\\
 punjabi-gurmukhi\\
 punjabi-guru\\
-punjabi\\
 quechua\\
+rajasthani\\
 romanian\\
+romanian-md\\
+romanian-moldova\\
 romansh\\
 rombo\\
 rundi\\
 russian\\
 rwa\\
+saho\\
 sakha\\
 samburu\\
-samin\\
 sango\\
 sangu\\
+sanskrit\\
+sanskrit-bangla\\
 sanskrit-beng\\
 sanskrit-bengali\\
 sanskrit-deva\\
@@ -2061,29 +2182,34 @@
 sanskrit-mlym\\
 sanskrit-telu\\
 sanskrit-telugu\\
-sanskrit\\
+sardinian\\
 scottishgaelic\\
 sena\\
+serbian\\
+serbian-cyrillic\\
 serbian-cyrillic-bosniaherzegovina\\
 serbian-cyrillic-kosovo\\
 serbian-cyrillic-montenegro\\
-serbian-cyrillic\\
+serbian-cyrl\\
 serbian-cyrl-ba\\
 serbian-cyrl-me\\
 serbian-cyrl-xk\\
-serbian-cyrl\\
+serbian-ijekavsk\\
+serbian-latin\\
 serbian-latin-bosniaherzegovina\\
 serbian-latin-kosovo\\
 serbian-latin-montenegro\\
-serbian-latin\\
+serbian-latn\\
 serbian-latn-ba\\
+serbian-latn-ijekavsk\\
 serbian-latn-me\\
 serbian-latn-xk\\
-serbian-latn\\
-serbian\\
+serbianc\\
 shambala\\
 shona\\
 sichuanyi\\
+sicilian\\
+silesian\\
 sinhala\\
 slovak\\
 slovene\\
@@ -2090,36 +2216,48 @@
 slovenian\\
 soga\\
 somali\\
+sorani\\
+southernsotho\\
+southndebele\\
+spanish\\
 spanish-mexico\\
 spanish-mx\\
-spanish\\
 standardmoroccantamazight\\
 swahili\\
+swati\\
 swedish\\
 swissgerman\\
+swisshighgerman\\
+syriac\\
+tachelhit\\
 tachelhit-latin\\
 tachelhit-latn\\
 tachelhit-tfng\\
 tachelhit-tifinagh\\
-tachelhit\\
 taita\\
 tamil\\
+taroko\\
 tasawaq\\
 telugu\\
 teso\\
 thai\\
 tibetan\\
+tigre\\
 tigrinya\\
+tokpisin\\
 tongan\\
+tsonga\\
+tswana\\
 turkish\\
 turkmen\\
+tyap\\
 ukenglish\\
 ukrainian\\
 uppersorbian\\
 urdu\\
 usenglish\\
-usorbian\\
 uyghur\\
+uzbek\\
 uzbek-arab\\
 uzbek-arabic\\
 uzbek-cyrillic\\
@@ -2126,18 +2264,19 @@
 uzbek-cyrl\\
 uzbek-latin\\
 uzbek-latn\\
-uzbek\\
+vai\\
 vai-latin\\
 vai-latn\\
 vai-vai\\
 vai-vaii\\
-vai\\
-vietnam\\
+venda\\
 vietnamese\\
+volapuk\\
 vunjo\\
 walser\\
 welsh\\
 westernfrisian\\
+wolaytta\\
 yangben\\
 yiddish\\
 yoruba\\
@@ -2221,7 +2360,7 @@
 % will be disappointed :-). The following example is built ad hoc to
 % emulate the final result to avoid dependencies, and therefore it's
 % not "real" code.
-\setmonofont[Scale=.87,Script=Hebrew]{DejaVu Sans Mono} \catcode`@=13
+\catcode`@=13
 \def@#1{\ifcase#1\relax \egroup \or \bgroup\textdir TLT \else
 \bgroup\textdir TRT \fontspec[Scale=.87,Script=Hebrew]{Liberation
 Mono} \fi}
@@ -2438,6 +2577,34 @@
 Without the optional argument it just loads some aditional tools if
 provided by the |ini| file, like extra counters.
 
+\Describe{\BabelUppercaseMapping}
+  {\marg{locale-name}\marg{codepoint}\marg{output}}
+\DescribeOther{\BabelLowercaseMapping}
+  {\marg{locale-name}\marg{codepoint}\marg{output}}
+
+\New{3.90} These macros are devised as a high level interface for
+declaring case mappings, based on the locale name as declared by or
+with \babel. They are the equivalent of |\DeclareUppercaseMapping| and
+|\DeclareLowercaseMapping| (see \textsf{usrguide.pdf}). The purpose is
+twofold: (1) a user-friendly way to declare them, because
+often BCP 47 tags are not known (and sometimes can be complex);
+(2) if for some reason the tag changes (eg, you decide to tag
+`english` as `en-001` instead of `en-US`), the new mappings will be
+still assigned to that language.
+
+\begin{example} For Classical Latin (no need to know the tag is
+\texttt{la-x-classic}):
+\begin{verbatim}
+  \BabelUppercaseMapping{classicallatin}{`u}{V}
+\end{verbatim}
+\end{example}
+
+\begin{note}
+  There are still some rough edges when declaring a mapping with the
+  |x| extension, or when two \babel{} languages share the same BCP 47
+  tag. These issues will be sorted out in future releases.
+\end{note}
+
 \subsection{Creating a language}
 
 \New{3.10} And what if there is no style for your language or none fits
@@ -2486,6 +2653,20 @@
 \end{example}
 
 \begin{example}
+  Sometimes treating the IPA as a language makes sense:
+\begin{verbatim}
+\documentclass{article}
+\usepackage[english]{babel}
+\babelprovide{ipa}
+\babelfont[ipa]{rm}{DejaVu Sans}
+\begin{document}
+Blah \foreignlanguage{ipa}{ɔːlˈðəʊ} Blah.
+\end{document}
+\end{verbatim}
+  Then you can define shorthands, transforms (with \luatex), and so on. 
+\end{example}
+
+\begin{example}
   Locales with names based on BCP 47 codes can be created with
   something like:
 \begin{verbatim}
@@ -2588,7 +2769,6 @@
 
 Finally, also remember you might not need to load |italian| at all if
 there are only a few word in this language (see~\ref{mostlymono}).
-
 \end{example}
 
 \Describe{script=}{\meta{script-name}}
@@ -2610,8 +2790,29 @@
 
 \Describe{Alph=}{\meta{counter-name}} Same for |\Alph|.
 
-\bigskip
+\Describe{casing}{\meta{rules}} \New{3.90} Selects the casing rules in a few
+languages. They are (from \textsf{interface3.pdf}):
+\begin{description}
+  \item[Armenian] |yiwn|, which maps U+0587 to capital ech and yiwn on
+    uppercasing.
+  \item[German] |eszett|, which maps the lowercase \textit{Eszett} to a
+  \textit{großes Eszett}.
+  \item[Greek] |iota|, which converts the \textit{ypogegrammeni} (subscript muted
+    iota) to capital iota when uppercasing.
+\end{description}
 
+\begin{example} For the latter:
+\begin{verbatim}
+\usepackage[greek]{babel}
+\babelprovide[_casing=iota_]{greek} 
+\end{verbatim}
+\end{example}
+
+\smallskip
+\makebox[\linewidth][c]{*\qquad*\qquad*}
+\smallskip
+
+
 A few options (only \luatex) set some properties of the writing system
 used by the language. These properties are \textit{always} applied to
 the script, no matter which language is active. Although somewhat
@@ -2986,7 +3187,7 @@
   extension whose singleton is \m{s} (currently the recognized
   singletons are |x|, |t| and |u|). The internal syntax can be somewhat
   complex, and this feature is still somewhat tentative. An example is
-  \textsf{classiclatin} which sets |extension.x.tag.bcp47| to |classic|.
+  \textsf{classicallatin} which sets |extension.x.tag.bcp47| to |classic|.
   \New{3.75}
 \end{description}
 
@@ -3671,7 +3872,8 @@
 % will be disappointed :-). The following example is built ad hoc to
 % emulate the final result to avoid dependencies, and therefore it's
 % not "real" code.
-\setmonofont[Scale=.87,Script=Arabic]{DejaVu Sans Mono} \catcode`@=13
+\setmonofont[Scale=.86, FakeStretch=.97,Script=Arabic]{DejaVu Sans Mono}
+\catcode`@=13
 \def@#1{\ifcase#1\relax \egroup \or \bgroup\textdir TLT \else
 \bgroup\textdir TRT \pardir TRT \fi}
 \begin{verbatim}
@@ -3707,7 +3909,8 @@
   % will be disappointed :-). The following example is built ad hoc to
   % emulate the final result to avoid dependencies, and therefore it's
   % not "real" code.
-  \setmonofont[Scale=.87,Script=Arabic]{DejaVu Sans Mono} \catcode`@=13
+  \setmonofont[Scale=.86, FakeStretch=.97,Script=Arabic]{DejaVu Sans Mono}
+  \catcode`@=13
   \def@#1{\ifcase#1\relax \egroup \or \bgroup\textdir TRT \else
   \bgroup\textdir TLT \pardir TLT \fi}
 \begin{verbatim}
@@ -4096,7 +4299,7 @@
 you can load \babel\ with for each language. Note this list is open and
 the current options may be different. It does not include |ini| files
 (see below). Except in a few cases (eg, |ngerman|, |serbianc|,
-|acadien|) names are those of the Unicode CLDR (or based on them).
+|acadian|) names are those of the Unicode CLDR (or based on them). 
 
 \begin{description}
 \itemsep=-\parskip
@@ -4164,7 +4367,7 @@
   (\textsf{uppersorbian}), \textsf{vietnam} (\textsf{vietnamese}),
   \textsf{northernsami} (\textsf{samin}), \textsf{ukraineb}
   (\textsf{ukrainian}). Deprecated names come in many cases from the
-  times when they had to be shortened to 8 characters.
+  times when they had to be shortened to 8 characters. 
 \end{note}
 
 Most of them work out of the box, but some may require extra fonts,
@@ -5132,7 +5335,6 @@
 
 \fi
 
-
 \section{Acknowledgements}
 
 I would like to thank all who volunteered as $\beta$-testers for their
@@ -5264,8 +5466,8 @@
 % \section{Tools}
 %
 %    \begin{macrocode}
-%<<version=3.89>>
-%<<date=2023/05/11>>
+%<<version=3.90>>
+%<<date=2023/06/26>>
 %    \end{macrocode}
 %
 % \textbf{Do not use the following macros in \texttt{ldf} files. They
@@ -6021,8 +6223,8 @@
 %    \end{macrocode}
 %
 % With |headfoot=lang| we can set the language used in heads/foots.
-% For example, in babel/3796 just adds |headfoot=english|.  It
-% misuses \cs{@resetactivechars} but seems to work.
+% For example, in babel/3796 just add |headfoot=english|.  It
+% misuses \cs{@resetactivechars}, but seems to work.
 %
 %    \begin{macrocode}
 \ifx\bbl at opt@headfoot\@nnil\else
@@ -7476,12 +7678,18 @@
       \string\providecommand\string\babel at aux[2]{}}%
     \immediate\write\@mainaux{\string\@nameuse{bbl at beforestart}}%
   \fi
+%<-package>
   \expandafter\selectlanguage\expandafter{\bbl at main@language}%
+%<+package>
   \ifbbl at single  % must go after the line above.
     \renewcommand\selectlanguage[1]{}%
     \renewcommand\foreignlanguage[2]{#2}%
     \global\let\babel at aux\@gobbletwo  % Also as flag
   \fi}
+%<-core>
+\AddToHook{begindocument/before}{%
+  \expandafter\selectlanguage\expandafter{\bbl at main@language}}
+%<+core>
 \ifcase\bbl at engine\or
   \AtBeginDocument{\pagedir\bodydir} % TODO - a better place
 \fi
@@ -10128,9 +10336,10 @@
         \let\\\@Alph\<bbl at cntr@\bbl at KVP@Alph @\languagename>}}%
   \fi
   % == Casing ==
-  \bbl at exp{\def\<bbl at casing@\languagename>%
-    {\<bbl at lbcp@\languagename>%
-     \ifx\bbl at KVP@casing\@nnil\else-x-\bbl at KVP@casing\fi}}%
+  \ifx\bbl at KVP@casing\@nnil\else
+    \bbl at csarg\xdef{casing@\languagename}%
+      {\@nameuse{bbl at casing@\languagename}-x-\bbl at KVP@casing}%
+  \fi
   % == Calendars ==
   \ifx\bbl at KVP@calendar\@nnil
     \edef\bbl at KVP@calendar{\bbl at cl{calpr}}%
@@ -10591,9 +10800,9 @@
   \bbl at exp{\\\bbl at exportkey{lname}{identification.name.opentype}%
     {\csname bbl at elname@\languagename\endcsname}}%
   \bbl at exportkey{tbcp}{identification.tag.bcp47}{}%
+  % Somewhat hackish. TODO
+  \bbl at exportkey{casing}{identification.tag.bcp47}{}%
   \bbl at exportkey{lbcp}{identification.language.tag.bcp47}{}%
-  % Somewhat hackish. TODO
-  \bbl at exportkey{casing}{identification.language.tag.bcp47}{}%
   \bbl at exportkey{lotf}{identification.tag.opentype}{dflt}%
   \bbl at exportkey{esname}{identification.script.name}{}%
   \bbl at exp{\\\bbl at exportkey{sname}{identification.script.name.opentype}%
@@ -11262,8 +11471,18 @@
       {\bbl at ifunset{bbl@\csname bbl at info@#1.tag.bcp47\endcsname @#2}{}%
         {\bbl at cs{\csname bbl at info@#1.tag.bcp47\endcsname @#2}}}}
 \fi
-% Still somewhat hackish:
+% Still somewhat hackish. WIP.
 \@namedef{bbl at info@casing.tag.bcp47}{casing}
+\newcommand\BabelUppercaseMapping[3]{%
+  \let\bbl at tempx\languagename
+  \edef\languagename{#1}%
+  \DeclareUppercaseMapping[\BCPdata{casing}]{#2}{#3}%
+  \let\languagename\bbl at tempx}
+\newcommand\BabelLowercaseMapping[3]{%
+  \let\bbl at tempx\languagename
+  \edef\languagename{#1}%
+  \DeclareLowercaseMapping[\BCPdata{casing}]{#2}{#3}%
+  \let\languagename\bbl at tempx}
 %    \end{macrocode}
 %
 % With version 3.75 |\BabelEnsureInfo| is executed always, but there is
@@ -12139,7 +12358,7 @@
 \bbl at trace{Loading basic (internal) bidi support}
 \ifodd\bbl at engine
 \else % TODO. Move to txtbabel
-  \ifnum\bbl at bidimode>100 \ifnum\bbl at bidimode<200
+  \ifnum\bbl at bidimode>100 \ifnum\bbl at bidimode<200 % Any xe+lua bidi=
     \bbl at error
       {The bidi method 'basic' is available only in\\%
        luatex. I'll continue with 'bidi=default', so\\%
@@ -12157,7 +12376,7 @@
         \bbl at loadfontspec % bidi needs fontspec
         \usepackage#1{bidi}}%
     \fi}
-  \ifnum\bbl at bidimode>200
+  \ifnum\bbl at bidimode>200 % Any xe bidi=
     \ifcase\expandafter\@gobbletwo\the\bbl at bidimode\or
       \bbl at tentative{bidi=bidi}
       \bbl at loadxebidi{}
@@ -12169,7 +12388,7 @@
   \fi
 \fi
 % TODO? Separate:
-\ifnum\bbl at bidimode=\@ne
+\ifnum\bbl at bidimode=\@ne % Any bidi= except default=1
   \let\bbl at beforeforeign\leavevmode
   \ifodd\bbl at engine
     \newattribute\bbl at attr@dir
@@ -12302,7 +12521,7 @@
     \newtoks\everypar
     \everypar=\bbl at severypar
     \bbl at severypar{\bbl at xeeverypar\the\everypar}}
-  \ifnum\bbl at bidimode>200
+  \ifnum\bbl at bidimode>200 % Any xe bidi=
     \let\bbl at textdir@i\@gobbletwo
     \let\bbl at xebidipar\@empty
     \AddBabelHook{bidi}{foreign}{%
@@ -13268,7 +13487,7 @@
 %    \begin{macrocode}
 %<<*Footnote changes>>
 \bbl at trace{Bidi footnotes}
-\ifnum\bbl at bidimode>\z@
+\ifnum\bbl at bidimode>\z@ % Any bidi=
   \def\bbl at footnote#1#2#3{%
     \@ifnextchar[%
       {\bbl at footnote@o{#1}{#2}{#3}}%
@@ -14217,8 +14436,13 @@
 \gdef\bbl at arabicjust{%
   \let\bbl at arabicjust\relax
   \newattribute\bblar at kashida
-  \directlua{ Babel.attr_kashida = luatexbase.registernumber'bblar at kashida' }%
+  \newattribute\bblar at kashida@aux % 0, 1=tatweel, 2=diacritics
+  \directlua{%  WIP
+    Babel.attr_kashida = luatexbase.registernumber'bblar at kashida' 
+    Babel.attr_kashida_aux = luatexbase.registernumber'bblar at kashida@aux'
+  }%
   \bblar at kashida=\z@
+  \bblar at kashida@aux=\z@
   \bbl at patchfont{{\bbl at parsejalt}}%
   \directlua{
     Babel.arabic.elong_map   = Babel.arabic.elong_map or {}
@@ -14294,6 +14518,7 @@
 Babel.arabic.dest = {}
 Babel.arabic.justify_factor = 0.95
 Babel.arabic.justify_enabled = true
+Babel.arabic.kashida_limit = -1
 
 function Babel.arabic.justify(head)
   if not Babel.arabic.justify_enabled then return head end
@@ -14322,6 +14547,7 @@
   local width, width_new, full, k_curr, wt_pos, goal, shift
   local subst_done = false
   local elong_map = Babel.arabic.elong_map
+  local cnt
   local last_line
   local GLYPH = node.id'glyph'
   local KASHIDA = Babel.attr_kashida
@@ -14394,7 +14620,7 @@
     if #k_list == 0 then goto next_line end
 
     width = node.dimensions(line.head)    % The 'natural' width
-    k_curr = #k_list
+    k_curr = #k_list % Traverse backwards, from the end
     wt_pos = 1
 
     while width < goal do
@@ -14419,6 +14645,22 @@
       end
     end
 
+    % Limit the number of tatweel by removing them. Not very efficient,
+    % but it does the job in a quite predictable way.
+    if Babel.arabic.kashida_limit > -1 then
+      cnt = 0
+      for n in node.traverse_id(GLYPH, line.head) do
+        if n.char == 0x0640 then
+          cnt = cnt + 1
+          if cnt > Babel.arabic.kashida_limit then
+            node.remove(line.head, n)
+          end
+        else
+          cnt = 0
+        end
+      end
+    end
+
     ::next_line::
 
     % Must take into account marks and ins, see luatex manual.
@@ -14892,7 +15134,8 @@
 % math with the package option bidi=.
 %
 %    \begin{macrocode}
-\ifnum\bbl at bidimode>\@ne % Excludes default=1
+\breakafterdirmode=1
+\ifnum\bbl at bidimode>\@ne % Any bidi= except default=1
   \let\bbl at beforeforeign\leavevmode
   \AtEndOfPackage{\EnableBabelHook{babel-bidi}}
   \RequirePackage{luatexbase}
@@ -14947,7 +15190,7 @@
 % math.
 %
 %    \begin{macrocode}
-\ifnum\bbl at bidimode>\z@
+\ifnum\bbl at bidimode>\z@ % Any bidi=
   \def\bbl at insidemath{0}%
   \def\bbl at everymath{\def\bbl at insidemath{1}}
   \def\bbl at everydisplay{\def\bbl at insidemath{2}}
@@ -14985,6 +15228,17 @@
 % --, margins, etc.) with |bidi=basic|, without having to patch
 % almost any macro where text direction is relevant.
 %
+% Still, there are three areas deserving special attention, namely,
+% tabular, math, and graphics, text and intrinsically left-to-right
+% elements are intermingled. I've made some progress in graphics, but
+% they're essentially hacks; I've also made some progress in `tabular`,
+% but when I decided to tackle math (both standard math and `amsmath`)
+% the nightmare began. I'm still not sure how `amsmath` should be
+% modified, but the main problem is that, boxes are “generic”
+% containers that can hold text, math, and graphics (even at the same
+% time; remember that inline math is included in the list of text nodes
+% marked with 'math' (11) nodes too).
+%
 % |\@hangfrom| is useful in many contexts and it is redefined always
 % with the |layout| option.
 %
@@ -15009,7 +15263,7 @@
 \DeclareOption{fleqn}{\chardef\bbl at eqnpos\tw@}
 %<</More package options>>
 %
-\ifnum\bbl at bidimode>\z@
+\ifnum\bbl at bidimode>\z@ % Any bidi=
   \ifx\matheqdirmode\@undefined\else
     \matheqdirmode\@ne % A luatex primitive
   \fi
@@ -15207,7 +15461,7 @@
   {\IfBabelLayout{notabular}%
     {\chardef\bbl at tabular@mode\z@}%
     {\chardef\bbl at tabular@mode\@ne}}% Mixed, with LTR cols
-\ifnum\bbl at bidimode>\@ne
+\ifnum\bbl at bidimode>\@ne % Any bidi= except default=1
   \ifnum\bbl at tabular@mode=\@ne
     \let\bbl at parabefore\relax
     \AddToHook{para/before}{\bbl at parabefore}
@@ -15252,7 +15506,7 @@
 % |\@hangfrom|.
 %    
 %    \begin{macrocode}
-\ifnum\bbl at bidimode>\z@
+\ifnum\bbl at bidimode>\z@ % Any bidi=
   \def\bbl at nextfake#1{%  non-local changes, use always inside a group!
     \bbl at exp{%
       \def\\\bbl at insidemath{0}%

Modified: trunk/Master/texmf-dist/source/latex/babel/babel.ins
===================================================================
--- trunk/Master/texmf-dist/source/latex/babel/babel.ins	2023-06-26 20:19:05 UTC (rev 67484)
+++ trunk/Master/texmf-dist/source/latex/babel/babel.ins	2023-06-26 20:20:23 UTC (rev 67485)
@@ -26,7 +26,7 @@
 %% and covered by LPPL is defined by the unpacking scripts (with
 %% extension .ins) which are part of the distribution.
 %%
-\def\filedate{2023/05/11}
+\def\filedate{2023/06/26}
 \def\batchfile{babel.ins}
 \input docstrip.tex
 

Modified: trunk/Master/texmf-dist/source/latex/babel/bbcompat.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/babel/bbcompat.dtx	2023-06-26 20:19:05 UTC (rev 67484)
+++ trunk/Master/texmf-dist/source/latex/babel/bbcompat.dtx	2023-06-26 20:20:23 UTC (rev 67485)
@@ -30,7 +30,7 @@
 %
 % \iffalse
 %<*dtx>
-\ProvidesFile{bbcompat.dtx}[2023/05/11 v3.89]
+\ProvidesFile{bbcompat.dtx}[2023/06/26 v3.90]
 %</dtx>
 %
 %% File 'bbcompat.dtx'

Modified: trunk/Master/texmf-dist/source/latex/babel/locale.zip
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/tex/generic/babel/babel.def
===================================================================
--- trunk/Master/texmf-dist/tex/generic/babel/babel.def	2023-06-26 20:19:05 UTC (rev 67484)
+++ trunk/Master/texmf-dist/tex/generic/babel/babel.def	2023-06-26 20:20:23 UTC (rev 67485)
@@ -40,7 +40,7 @@
     \wlog{File: #1 #4 #3 <#2>}%
     \let\ProvidesFile\@undefined}
 \fi
-\ProvidesFile{babel.def}[2023/05/11 v3.89 Babel common definitions]
+\ProvidesFile{babel.def}[2023/06/26 v3.90 Babel common definitions]
 \ifx\AtBeginDocument\@undefined  % TODO. change test.
   \def\@empty{}
 \def\loadlocalcfg#1{%
@@ -595,8 +595,8 @@
     \toks@\expandafter{\bbl at tempc#3}%
     \expandafter\edef\csname extras\languagename\endcsname{\the\toks@}%
   \fi}
-\def\bbl at version{3.89}
-\def\bbl at date{2023/05/11}
+\def\bbl at version{3.90}
+\def\bbl at date{2023/06/26}
 \ifx\language\@undefined
   \csname newcount\endcsname\language
 \fi

Modified: trunk/Master/texmf-dist/tex/generic/babel/babel.sty
===================================================================
--- trunk/Master/texmf-dist/tex/generic/babel/babel.sty	2023-06-26 20:19:05 UTC (rev 67484)
+++ trunk/Master/texmf-dist/tex/generic/babel/babel.sty	2023-06-26 20:20:23 UTC (rev 67485)
@@ -34,7 +34,7 @@
 %%
 
 \NeedsTeXFormat{LaTeX2e}[2005/12/01]
-\ProvidesPackage{babel}[2023/05/11 v3.89 The Babel package]
+\ProvidesPackage{babel}[2023/06/26 v3.90 The Babel package]
 \@ifpackagewith{babel}{debug}
   {\providecommand\bbl at trace[1]{\message{^^J[ #1 ]}}%
    \let\bbl at debug\@firstofone
@@ -470,8 +470,8 @@
       \expandafter\@secondoftwo
     \fi}
 \fi
-\def\bbl at version{3.89}
-\def\bbl at date{2023/05/11}
+\def\bbl at version{3.90}
+\def\bbl at date{2023/06/26}
 \ifx\language\@undefined
   \csname newcount\endcsname\language
 \fi
@@ -1190,12 +1190,13 @@
       \string\providecommand\string\babel at aux[2]{}}%
     \immediate\write\@mainaux{\string\@nameuse{bbl at beforestart}}%
   \fi
-  \expandafter\selectlanguage\expandafter{\bbl at main@language}%
   \ifbbl at single  % must go after the line above.
     \renewcommand\selectlanguage[1]{}%
     \renewcommand\foreignlanguage[2]{#2}%
     \global\let\babel at aux\@gobbletwo  % Also as flag
   \fi}
+\AddToHook{begindocument/before}{%
+  \expandafter\selectlanguage\expandafter{\bbl at main@language}}
 \ifcase\bbl at engine\or
   \AtBeginDocument{\pagedir\bodydir} % TODO - a better place
 \fi
@@ -2592,9 +2593,10 @@
         \let\\\@Alph\<bbl at cntr@\bbl at KVP@Alph @\languagename>}}%
   \fi
   % == Casing ==
-  \bbl at exp{\def\<bbl at casing@\languagename>%
-    {\<bbl at lbcp@\languagename>%
-     \ifx\bbl at KVP@casing\@nnil\else-x-\bbl at KVP@casing\fi}}%
+  \ifx\bbl at KVP@casing\@nnil\else
+    \bbl at csarg\xdef{casing@\languagename}%
+      {\@nameuse{bbl at casing@\languagename}-x-\bbl at KVP@casing}%
+  \fi
   % == Calendars ==
   \ifx\bbl at KVP@calendar\@nnil
     \edef\bbl at KVP@calendar{\bbl at cl{calpr}}%
@@ -2962,9 +2964,9 @@
   \bbl at exp{\\\bbl at exportkey{lname}{identification.name.opentype}%
     {\csname bbl at elname@\languagename\endcsname}}%
   \bbl at exportkey{tbcp}{identification.tag.bcp47}{}%
+  % Somewhat hackish. TODO
+  \bbl at exportkey{casing}{identification.tag.bcp47}{}%
   \bbl at exportkey{lbcp}{identification.language.tag.bcp47}{}%
-  % Somewhat hackish. TODO
-  \bbl at exportkey{casing}{identification.language.tag.bcp47}{}%
   \bbl at exportkey{lotf}{identification.tag.opentype}{dflt}%
   \bbl at exportkey{esname}{identification.script.name}{}%
   \bbl at exp{\\\bbl at exportkey{sname}{identification.script.name.opentype}%
@@ -3505,6 +3507,16 @@
         {\bbl at cs{\csname bbl at info@#1.tag.bcp47\endcsname @#2}}}}
 \fi
 \@namedef{bbl at info@casing.tag.bcp47}{casing}
+\newcommand\BabelUppercaseMapping[3]{%
+  \let\bbl at tempx\languagename
+  \edef\languagename{#1}%
+  \DeclareUppercaseMapping[\BCPdata{casing}]{#2}{#3}%
+  \let\languagename\bbl at tempx}
+\newcommand\BabelLowercaseMapping[3]{%
+  \let\bbl at tempx\languagename
+  \edef\languagename{#1}%
+  \DeclareLowercaseMapping[\BCPdata{casing}]{#2}{#3}%
+  \let\languagename\bbl at tempx}
 \let\bbl at ensureinfo\@gobble
 \newcommand\BabelEnsureInfo{%
   \ifx\InputIfFileExists\@undefined\else
@@ -3924,7 +3936,7 @@
 \bbl at trace{Loading basic (internal) bidi support}
 \ifodd\bbl at engine
 \else % TODO. Move to txtbabel
-  \ifnum\bbl at bidimode>100 \ifnum\bbl at bidimode<200
+  \ifnum\bbl at bidimode>100 \ifnum\bbl at bidimode<200 % Any xe+lua bidi=
     \bbl at error
       {The bidi method 'basic' is available only in\\%
        luatex. I'll continue with 'bidi=default', so\\%
@@ -3942,7 +3954,7 @@
         \bbl at loadfontspec % bidi needs fontspec
         \usepackage#1{bidi}}%
     \fi}
-  \ifnum\bbl at bidimode>200
+  \ifnum\bbl at bidimode>200 % Any xe bidi=
     \ifcase\expandafter\@gobbletwo\the\bbl at bidimode\or
       \bbl at tentative{bidi=bidi}
       \bbl at loadxebidi{}
@@ -3953,7 +3965,7 @@
     \fi
   \fi
 \fi
-\ifnum\bbl at bidimode=\@ne
+\ifnum\bbl at bidimode=\@ne % Any bidi= except default=1
   \let\bbl at beforeforeign\leavevmode
   \ifodd\bbl at engine
     \newattribute\bbl at attr@dir
@@ -4065,7 +4077,7 @@
     \newtoks\everypar
     \everypar=\bbl at severypar
     \bbl at severypar{\bbl at xeeverypar\the\everypar}}
-  \ifnum\bbl at bidimode>200
+  \ifnum\bbl at bidimode>200 % Any xe bidi=
     \let\bbl at textdir@i\@gobbletwo
     \let\bbl at xebidipar\@empty
     \AddBabelHook{bidi}{foreign}{%

Modified: trunk/Master/texmf-dist/tex/generic/babel/hyphen.cfg
===================================================================
--- trunk/Master/texmf-dist/tex/generic/babel/hyphen.cfg	2023-06-26 20:19:05 UTC (rev 67484)
+++ trunk/Master/texmf-dist/tex/generic/babel/hyphen.cfg	2023-06-26 20:20:23 UTC (rev 67485)
@@ -38,10 +38,10 @@
     \wlog{File: #1 #4 #3 <#2>}%
     \let\ProvidesFile\@undefined}
 \fi
-\ProvidesFile{hyphen.cfg}[2023/05/11 v3.89 Babel hyphens]
+\ProvidesFile{hyphen.cfg}[2023/06/26 v3.90 Babel hyphens]
 \xdef\bbl at format{\jobname}
-\def\bbl at version{3.89}
-\def\bbl at date{2023/05/11}
+\def\bbl at version{3.90}
+\def\bbl at date{2023/06/26}
 \ifx\AtBeginDocument\@undefined
   \def\@empty{}
 \fi

Added: trunk/Master/texmf-dist/tex/generic/babel/locale/fa/babel-farsi.tex
===================================================================
--- trunk/Master/texmf-dist/tex/generic/babel/locale/fa/babel-farsi.tex	                        (rev 0)
+++ trunk/Master/texmf-dist/tex/generic/babel/locale/fa/babel-farsi.tex	2023-06-26 20:20:23 UTC (rev 67485)
@@ -0,0 +1,12 @@
+% This file is part of babel. For further details see:
+% https://www.ctan.org/pkg/babel
+\ifx\BabelBeforeIni\undefined
+  \PackageError{babel}%
+    {This file is a component of babel and cannot\MessageBreak
+     be loaded directly. I'll stop immediately}%
+    {Just use babel as documented.}%
+  \stop
+\fi
+\BabelBeforeIni{fa}{%
+}
+\endinput
\ No newline at end of file


Property changes on: trunk/Master/texmf-dist/tex/generic/babel/locale/fa/babel-farsi.tex
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/tex/generic/babel/locale/la/babel-classicallatin.tex
===================================================================
--- trunk/Master/texmf-dist/tex/generic/babel/locale/la/babel-classicallatin.tex	                        (rev 0)
+++ trunk/Master/texmf-dist/tex/generic/babel/locale/la/babel-classicallatin.tex	2023-06-26 20:20:23 UTC (rev 67485)
@@ -0,0 +1,25 @@
+\ifx\BabelBeforeIni\undefined
+  \PackageError{babel}%
+    {This file is a component of babel and cannot\MessageBreak
+     be loaded directly. I'll stop immediately}%
+    {Just use babel as documented.}%
+  \stop
+\fi
+\BabelBeforeIni{la-x-classic}{%
+}
+
+\expandafter\addto\csname date\languagename\endcsname{%
+  \babel at save\BabelDatey
+  \def\BabelDatey#1{\@Roman{#1}}%
+  \babel at save\BabelDated
+  \def\BabelDated#1{\@Roman{#1}}}
+
+\StartBabelCommands{\languagename}{}
+  \SetHyphenMap{\BabelLower{`V}{`u}}
+\EndBabelCommands
+
+% TODO. Must be defined somehow in the ini file:
+\BabelUppercaseMapping{\languagename}{`u}{V}
+\BabelLowercaseMapping{\languagename}{`v}{U}
+
+\endinput
\ No newline at end of file


Property changes on: trunk/Master/texmf-dist/tex/generic/babel/locale/la/babel-classicallatin.tex
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/tex/generic/babel/locale/la/babel-ecclesiasticallatin.tex
===================================================================
--- trunk/Master/texmf-dist/tex/generic/babel/locale/la/babel-ecclesiasticallatin.tex	                        (rev 0)
+++ trunk/Master/texmf-dist/tex/generic/babel/locale/la/babel-ecclesiasticallatin.tex	2023-06-26 20:20:23 UTC (rev 67485)
@@ -0,0 +1,17 @@
+\ifx\BabelBeforeIni\undefined
+  \PackageError{babel}%
+    {This file is a component of babel and cannot\MessageBreak
+     be loaded directly. I'll stop immediately}%
+    {Just use babel as documented.}%
+  \stop
+\fi
+\BabelBeforeIni{la-x-ecclesia}{%
+}
+
+\expandafter\addto\csname date\languagename\endcsname{%
+  \babel at save\BabelDatey
+  \def\BabelDatey#1{\@Roman{#1}}%
+  \babel at save\BabelDated
+  \def\BabelDated#1{\@Roman{#1}}}
+
+\endinput
\ No newline at end of file


Property changes on: trunk/Master/texmf-dist/tex/generic/babel/locale/la/babel-ecclesiasticallatin.tex
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Modified: trunk/Master/texmf-dist/tex/generic/babel/locale/la/babel-la-x-classic.ini
===================================================================
--- trunk/Master/texmf-dist/tex/generic/babel/locale/la/babel-la-x-classic.ini	2023-06-26 20:19:05 UTC (rev 67484)
+++ trunk/Master/texmf-dist/tex/generic/babel/locale/la/babel-la-x-classic.ini	2023-06-26 20:20:23 UTC (rev 67485)
@@ -9,10 +9,10 @@
 
 [identification]
 charset = utf8
-version = 1.5
-date = 2022-07-28
-name.english = Classic Latin
-name.babel = classiclatin
+version = 1.6
+date = 2023-06-25
+name.english = Classical Latin
+name.babel = classicallatin
 tag.bcp47 = la-x-classic
 language.tag.bcp47 = la
 tag.opentype = LAT
@@ -23,7 +23,7 @@
 level = 1
 encodings = T1 OT1 LY1
 derivate = no
-require.babel = classiclatin
+require.babel = classicallatin
 name.polyglossia.language = latin
 name.polyglossia.variant = classic
 

Modified: trunk/Master/texmf-dist/tex/generic/babel/locale/la/babel-la-x-ecclesia.ini
===================================================================
--- trunk/Master/texmf-dist/tex/generic/babel/locale/la/babel-la-x-ecclesia.ini	2023-06-26 20:19:05 UTC (rev 67484)
+++ trunk/Master/texmf-dist/tex/generic/babel/locale/la/babel-la-x-ecclesia.ini	2023-06-26 20:20:23 UTC (rev 67485)
@@ -9,10 +9,10 @@
 
 [identification]
 charset = utf8
-version = 1.5
-date = 2022-07-28
-name.english = Ecclesiastic Latin
-name.babel = ecclesiasticlatin
+version = 1.6
+date = 2023-06-25
+name.english = Ecclesiastical Latin
+name.babel = ecclesiasticallatin
 tag.bcp47 = la-x-ecclesia
 language.tag.bcp47 = la
 tag.opentype = LAT
@@ -23,7 +23,7 @@
 level = 1
 encodings = T1 OT1 LY1
 derivate = no
-require.babel = ecclesiasticlatin
+require.babel = ecclesiasticallatin
 name.polyglossia.language = latin
 name.polyglossia.variant = ecclesiastic
 

Modified: trunk/Master/texmf-dist/tex/generic/babel/locale/la/babel-medievallatin.tex
===================================================================
--- trunk/Master/texmf-dist/tex/generic/babel/locale/la/babel-medievallatin.tex	2023-06-26 20:19:05 UTC (rev 67484)
+++ trunk/Master/texmf-dist/tex/generic/babel/locale/la/babel-medievallatin.tex	2023-06-26 20:20:23 UTC (rev 67485)
@@ -15,11 +15,7 @@
   \def\BabelDated#1{\@Roman{#1}}}
 
 \StartBabelCommands{\languagename}{}
-  \SetCase
-    {\uccode`u=`V\relax}
-    {\lccode`V=`u\relax}
-  \SetHyphenMap{%
-    \BabelLower{`V}{`u}}
+  \SetHyphenMap{\BabelLower{`V}{`u}}
 \EndBabelCommands
 
 \endinput
\ No newline at end of file

Deleted: trunk/Master/texmf-dist/tex/generic/babel/locale/vi/babel-vietnam.tex
===================================================================
--- trunk/Master/texmf-dist/tex/generic/babel/locale/vi/babel-vietnam.tex	2023-06-26 20:19:05 UTC (rev 67484)
+++ trunk/Master/texmf-dist/tex/generic/babel/locale/vi/babel-vietnam.tex	2023-06-26 20:20:23 UTC (rev 67485)
@@ -1,12 +0,0 @@
-% This file is part of babel. For further details see:
-% https://www.ctan.org/pkg/babel
-\ifx\BabelBeforeIni\undefined
-  \PackageError{babel}%
-    {This file is a component of babel and cannot\MessageBreak
-     be loaded directly. I'll stop immediately}%
-    {Just use babel as documented.}%
-  \stop
-\fi
-\BabelBeforeIni{vi}{%
-}
-\endinput
\ No newline at end of file

Modified: trunk/Master/texmf-dist/tex/generic/babel/luababel.def
===================================================================
--- trunk/Master/texmf-dist/tex/generic/babel/luababel.def	2023-06-26 20:19:05 UTC (rev 67484)
+++ trunk/Master/texmf-dist/tex/generic/babel/luababel.def	2023-06-26 20:20:23 UTC (rev 67485)
@@ -604,8 +604,13 @@
 \gdef\bbl at arabicjust{%
   \let\bbl at arabicjust\relax
   \newattribute\bblar at kashida
-  \directlua{ Babel.attr_kashida = luatexbase.registernumber'bblar at kashida' }%
+  \newattribute\bblar at kashida@aux % 0, 1=tatweel, 2=diacritics
+  \directlua{%  WIP
+    Babel.attr_kashida = luatexbase.registernumber'bblar at kashida'
+    Babel.attr_kashida_aux = luatexbase.registernumber'bblar at kashida@aux'
+  }%
   \bblar at kashida=\z@
+  \bblar at kashida@aux=\z@
   \bbl at patchfont{{\bbl at parsejalt}}%
   \directlua{
     Babel.arabic.elong_map   = Babel.arabic.elong_map or {}
@@ -675,6 +680,7 @@
 Babel.arabic.dest = {}
 Babel.arabic.justify_factor = 0.95
 Babel.arabic.justify_enabled = true
+Babel.arabic.kashida_limit = -1
 
 function Babel.arabic.justify(head)
   if not Babel.arabic.justify_enabled then return head end
@@ -703,6 +709,7 @@
   local width, width_new, full, k_curr, wt_pos, goal, shift
   local subst_done = false
   local elong_map = Babel.arabic.elong_map
+  local cnt
   local last_line
   local GLYPH = node.id'glyph'
   local KASHIDA = Babel.attr_kashida
@@ -775,7 +782,7 @@
     if #k_list == 0 then goto next_line end
 
     width = node.dimensions(line.head)    % The 'natural' width
-    k_curr = #k_list
+    k_curr = #k_list % Traverse backwards, from the end
     wt_pos = 1
 
     while width < goal do
@@ -800,6 +807,22 @@
       end
     end
 
+    % Limit the number of tatweel by removing them. Not very efficient,
+    % but it does the job in a quite predictable way.
+    if Babel.arabic.kashida_limit > -1 then
+      cnt = 0
+      for n in node.traverse_id(GLYPH, line.head) do
+        if n.char == 0x0640 then
+          cnt = cnt + 1
+          if cnt > Babel.arabic.kashida_limit then
+            node.remove(line.head, n)
+          end
+        else
+          cnt = 0
+        end
+      end
+    end
+
     ::next_line::
 
     % Must take into account marks and ins, see luatex manual.
@@ -1368,7 +1391,8 @@
       luatexbase.priority_in_callback('hpack_filter',
         'luaotfload.node_processor') or nil)
   }}
-\ifnum\bbl at bidimode>\@ne % Excludes default=1
+\breakafterdirmode=1
+\ifnum\bbl at bidimode>\@ne % Any bidi= except default=1
   \let\bbl at beforeforeign\leavevmode
   \AtEndOfPackage{\EnableBabelHook{babel-bidi}}
   \RequirePackage{luatexbase}
@@ -1415,7 +1439,7 @@
 \def\bbl at bodydir{\bbl at setluadir{body}\bodydir}%   Used once
 \def\bbl at pagedir{\bbl at setluadir{page}\pagedir}%   Unused
 \def\bbl at dirparastext{\pardir\the\textdir\relax}% Used once
-\ifnum\bbl at bidimode>\z@
+\ifnum\bbl at bidimode>\z@ % Any bidi=
   \def\bbl at insidemath{0}%
   \def\bbl at everymath{\def\bbl at insidemath{1}}
   \def\bbl at everydisplay{\def\bbl at insidemath{2}}
@@ -1444,7 +1468,7 @@
   }}%
 \fi
 \bbl at trace{Redefinitions for bidi layout}
-\ifnum\bbl at bidimode>\z@
+\ifnum\bbl at bidimode>\z@ % Any bidi=
   \ifx\matheqdirmode\@undefined\else
     \matheqdirmode\@ne % A luatex primitive
   \fi
@@ -1641,7 +1665,7 @@
   {\IfBabelLayout{notabular}%
     {\chardef\bbl at tabular@mode\z@}%
     {\chardef\bbl at tabular@mode\@ne}}% Mixed, with LTR cols
-\ifnum\bbl at bidimode>\@ne
+\ifnum\bbl at bidimode>\@ne % Any bidi= except default=1
   \ifnum\bbl at tabular@mode=\@ne
     \let\bbl at parabefore\relax
     \AddToHook{para/before}{\bbl at parabefore}
@@ -1675,7 +1699,7 @@
       {}}
 \fi
 \ifx\bbl at opt@layout\@nnil\endinput\fi  % if no layout
-\ifnum\bbl at bidimode>\z@
+\ifnum\bbl at bidimode>\z@ % Any bidi=
   \def\bbl at nextfake#1{%  non-local changes, use always inside a group!
     \bbl at exp{%
       \def\\\bbl at insidemath{0}%
@@ -1831,7 +1855,7 @@
       \let\bbl at OL@p at enumiii\p at enumiii
       \def\p at enumiii{\p at enumii)\theenumii(}}{}}{}
 \bbl at trace{Bidi footnotes}
-\ifnum\bbl at bidimode>\z@
+\ifnum\bbl at bidimode>\z@ % Any bidi=
   \def\bbl at footnote#1#2#3{%
     \@ifnextchar[%
       {\bbl at footnote@o{#1}{#2}{#3}}%

Modified: trunk/Master/texmf-dist/tex/generic/babel/nil.ldf
===================================================================
--- trunk/Master/texmf-dist/tex/generic/babel/nil.ldf	2023-06-26 20:19:05 UTC (rev 67484)
+++ trunk/Master/texmf-dist/tex/generic/babel/nil.ldf	2023-06-26 20:20:23 UTC (rev 67485)
@@ -33,7 +33,7 @@
 %% extension |.ins|) which are part of the distribution.
 %%
 
-\ProvidesLanguage{nil}[2023/05/11 v3.89 Nil language]
+\ProvidesLanguage{nil}[2023/06/26 v3.90 Nil language]
 \LdfInit{nil}{datenil}
 \ifx\l at nil\@undefined
   \newlanguage\l at nil

Modified: trunk/Master/texmf-dist/tex/generic/babel/txtbabel.def
===================================================================
--- trunk/Master/texmf-dist/tex/generic/babel/txtbabel.def	2023-06-26 20:19:05 UTC (rev 67484)
+++ trunk/Master/texmf-dist/tex/generic/babel/txtbabel.def	2023-06-26 20:20:23 UTC (rev 67485)
@@ -95,7 +95,7 @@
        \hskip\columnwidth}}}%
   {}
 \bbl at trace{Bidi footnotes}
-\ifnum\bbl at bidimode>\z@
+\ifnum\bbl at bidimode>\z@ % Any bidi=
   \def\bbl at footnote#1#2#3{%
     \@ifnextchar[%
       {\bbl at footnote@o{#1}{#2}{#3}}%

Modified: trunk/Master/texmf-dist/tex/generic/babel/xebabel.def
===================================================================
--- trunk/Master/texmf-dist/tex/generic/babel/xebabel.def	2023-06-26 20:19:05 UTC (rev 67484)
+++ trunk/Master/texmf-dist/tex/generic/babel/xebabel.def	2023-06-26 20:20:23 UTC (rev 67485)
@@ -323,7 +323,7 @@
        \hskip\columnwidth}}}%
   {}
 \bbl at trace{Bidi footnotes}
-\ifnum\bbl at bidimode>\z@
+\ifnum\bbl at bidimode>\z@ % Any bidi=
   \def\bbl at footnote#1#2#3{%
     \@ifnextchar[%
       {\bbl at footnote@o{#1}{#2}{#3}}%



More information about the tex-live-commits mailing list.