texlive[59740] Master/texmf-dist: babel (28jun21)

commits+karl at tug.org commits+karl at tug.org
Mon Jun 28 22:38:19 CEST 2021


Revision: 59740
          http://tug.org/svn/texlive?view=revision&revision=59740
Author:   karl
Date:     2021-06-28 22:38:19 +0200 (Mon, 28 Jun 2021)
Log Message:
-----------
babel (28jun21)

Modified Paths:
--------------
    trunk/Master/texmf-dist/doc/latex/babel/README.md
    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-bidi-basic-r.lua
    trunk/Master/texmf-dist/tex/generic/babel/babel-bidi-basic.lua
    trunk/Master/texmf-dist/tex/generic/babel/babel-data-bidi.lua
    trunk/Master/texmf-dist/tex/generic/babel/babel-data-cjk.lua
    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/blplain.tex
    trunk/Master/texmf-dist/tex/generic/babel/bplain.tex
    trunk/Master/texmf-dist/tex/generic/babel/hyphen.cfg
    trunk/Master/texmf-dist/tex/generic/babel/locale/ar/babel-ar-DZ.ini
    trunk/Master/texmf-dist/tex/generic/babel/locale/ar/babel-ar-MA.ini
    trunk/Master/texmf-dist/tex/generic/babel/locale/ar/babel-ar-SY.ini
    trunk/Master/texmf-dist/tex/generic/babel/locale/ar/babel-ar.ini
    trunk/Master/texmf-dist/tex/generic/babel/locale/as/babel-as.ini
    trunk/Master/texmf-dist/tex/generic/babel/locale/bn/babel-bn.ini
    trunk/Master/texmf-dist/tex/generic/babel/locale/gu/babel-gu.ini
    trunk/Master/texmf-dist/tex/generic/babel/locale/hi/babel-hi.ini
    trunk/Master/texmf-dist/tex/generic/babel/locale/kn/babel-kn.ini
    trunk/Master/texmf-dist/tex/generic/babel/locale/ml/babel-ml.ini
    trunk/Master/texmf-dist/tex/generic/babel/locale/mr/babel-mr.ini
    trunk/Master/texmf-dist/tex/generic/babel/locale/or/babel-or.ini
    trunk/Master/texmf-dist/tex/generic/babel/locale/ta/babel-ta.ini
    trunk/Master/texmf-dist/tex/generic/babel/locale/te/babel-te.ini
    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/plain.def
    trunk/Master/texmf-dist/tex/generic/babel/switch.def
    trunk/Master/texmf-dist/tex/generic/babel/txtbabel.def
    trunk/Master/texmf-dist/tex/generic/babel/xebabel.def

Modified: trunk/Master/texmf-dist/doc/latex/babel/README.md
===================================================================
--- trunk/Master/texmf-dist/doc/latex/babel/README.md	2021-06-28 20:37:07 UTC (rev 59739)
+++ trunk/Master/texmf-dist/doc/latex/babel/README.md	2021-06-28 20:38:19 UTC (rev 59740)
@@ -1,4 +1,4 @@
-## Babel 3.60
+## Babel 3.61
 
 This package manages culturally-determined typographical (and other)
 rules, and hyphenation patterns for a wide range of languages. Many
@@ -8,13 +8,13 @@
 
 The latest stable version is available on <https://ctan.org/pkg/babel>.
 
-Changes in version 3.60 are described in:
+Changes in version 3.61 are described in:
 
-https://github.com/latex3/babel/blob/master/news-guides/news/whats-new-in-babel-3.60.md
+https://latex3.github.io/babel/news/whats-new-in-babel-3.61.html
 
 Apart from the manual, you can find information on some aspects of babel at:
 
-https://github.com/latex3/babel/tree/master/news-guides
+https://latex3.github.io/babel/
 
 The best way to install and/or update it is with the help of package
 managers.
@@ -46,15 +46,18 @@
 
 ### Summary of Latest changes
 ```
-3.60   2021-06-02
-       * A major fix for a bug with the latest LaTeX releases: class
-         options were messed up.
-       * Improved justification=kashida/elongated: lists, vowelized texts.
-       * Fix: Underfull \hbox with amsmath (#133).
-       * Improved the ini file for Basque (captions).
+3.61   2021-06-28
+       * Improved justification=kashida/elongated: hboxes (lua).
+       * Transform danda.nobreak for several Indic scripts (lua):
+         Assamese, Bengali, Gujarati, Hindi, Kannada, Malayalam,
+         Marathi, Oriya, Tamil, Telugu.
+       * Improved \babelprovide when used to reconfigure a language.
+       * Fixes:
+         - Partial fix for #114 (bad breaks and spacing with
+           \selectlanguage).
+         - \shorthandoff*{^} caused error for \section command (#129).
 ```
 
 ### Previous changes
 
-See https://github.com/latex3/babel/blob/master/news-guides/README.md#whats-new
-
+See https://latex3.github.io/babel/

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	2021-06-28 20:37:07 UTC (rev 59739)
+++ trunk/Master/texmf-dist/source/latex/babel/babel.dtx	2021-06-28 20:38:19 UTC (rev 59740)
@@ -6,6 +6,7 @@
 %%           any individual authors listed elsewhere in this file.
 %% All rights reserved.
 %%
+%%
 %% This file is part of the Babel system.
 %% --------------------------------------
 %%
@@ -20,7 +21,6 @@
 %% This work has the LPPL maintenance status "maintained".
 %%
 %% The Current Maintainer of this work is Javier Bezos.
-
 %%
 %% The list of derived (unpacked) files belonging to the distribution
 %% and covered by LPPL is defined by the unpacking scripts (with
@@ -32,7 +32,7 @@
 %
 % \iffalse
 %<*filedriver>
-\ProvidesFile{babel.dtx}[2021/06/02 v3.60 The Babel package]
+\ProvidesFile{babel.dtx}[2021/06/28 v3.61 The Babel package]
 \documentclass{ltxdoc}
 \GetFileInfo{babel.dtx}
 \usepackage{fontspec}
@@ -255,8 +255,8 @@
 latest changes?] Changes and new features with relation to version 3.8
 are highlighted with \New{X.XX}\hspace{-.5em}, and there are some notes
 for the latest versions in
-\href{https://github.com/latex3/babel/tree/master/news-guides}{the
-\babel{} repository}. The most recent features can be still unstable.
+\href{https://latex3.github.io/babel/}{the
+\babel{} site}. The most recent features can be still unstable.
 
 \item[\sffamily\color{messages}Can I help?] Sure! If you are interested
 in the \TeX{} multilingual support, please join the
@@ -650,9 +650,8 @@
 \begin{warning}
   Not all languages provide a |sty| file and some of them are not
   compatible with those formats. Please, refer to
-  \href{https://github.com/latex3/babel/blob/%
-  master/news-guides/guides/using-babel-with-plain.md}{Using babel with
-  Plain} for further details.
+  \href{https://latex3.github.io/babel/guides/using-babel-with-plain.html}%
+   {Using babel with Plain} for further details.
 \end{warning}
 
 \subsection{Basic language selectors}
@@ -711,7 +710,8 @@
 the language has not been set as package option (but in such a case it
 only sets the hyphenation patterns and a warning is shown). With the
 |bidi| option, it also enters in horizontal mode (this is not done
-always for backwards compatibility).
+always for backwards compatibility), and since it is meant for phrases
+only the text direction (and not the paragraph one) is set.
 
 \New{3.44} As already said, captions and dates are not switched.
 However, with the optional argument you can switch them, too. So, you
@@ -2586,8 +2586,9 @@
 script. It sets the linebreaking and justification method, which can be
 based on the the \textsc{arabic tatweel} character or in the
 ‘justification alternatives’ OpenType table (\texttt{jalt}). For an
-explanation see the \href{https://github.com/latex3/babel/blob/master/%
-news-guides/news/whats-new-in-babel-3.59.md}{\babel\ site}.
+explanation see the
+\href{https://latex3.github.io/babel/news/whats-new-in-babel-3.59.html}%
+  {\babel\ site}.
 
 \Describe{linebreaking=}{}
 \New{3.59} Just a synonymous for \texttt{justification}.
@@ -3087,8 +3088,7 @@
 a non-syllabic preposition or conjunction into a non-breaking space.}
 
 \trans{Greek}{diaeresis.hyphen}{Removes the diaeresis above iota and
-upsilon if hyphenated just before. It works with the
-three variants.}
+upsilon if hyphenated just before. It works with the three variants.}
 
 \trans{Hindi, Sanskrit}{transliteration.hk}{The Harvard-Kyoto system to
 romanize Devanagari.}
@@ -3101,6 +3101,10 @@
 \textit{ssz}, \textit{tty} and \textit{zzs} as \textit{cs-cs},
 \textit{dz-dz}, etc.}
 
+\trans{Indic scripts}{danda.nobreak}{Prevents a line break before a
+danda or double danda if there is a space. For Assamese, Bengali,
+Gujarati, Hindi, Kannada, Malayalam, Marathi, Oriya, Tamil, Telugu.}
+
 \trans{Arabic, Persian}{kashida.plain}{Experimental. A very simple and
 basic transform for ‘plain’ Arabic fonts, which attempts to distribute
 the tatwil as evenly as possible (starting at the end of the line). See
@@ -3140,9 +3144,10 @@
 |\babelprehyphenation|.
 
 See the
-\href{https://github.com/latex3/babel/blob/master/news-guides/guides/non-standard-hyphenation-with-luatex.md}{\babel\
-site} for a more detailed description and some examples. It also
-describes a few additional replacement types (|string|, |penalty|).
+\href{https://latex3.github.io/babel/guides/%
+  non-standard-hyphenation-with-luatex.html}{\babel\ site} for a more
+detailed description and some examples. It also describes a few
+additional replacement types (|string|, |penalty|).
 
 Although the main purpose of this command is non-standard hyphenation,
 it may actually be used for other transformations (after hyphenation is
@@ -4226,7 +4231,7 @@
 
 The following page provides a starting point for \texttt{ldf} files:
 \texttt{http://www.texnia.com/incubator.html}. See also
-\texttt{https://github.com/latex3/babel/blob/master/news-guides/guides/list-of-locale-templates.md}.
+\texttt{https://latex3.github.io/babel/guides/list-of-locale-templates.html}.
 
 If you need further assistance and technical advice in the
 development of language styles, I am willing to help you.  And of
@@ -4968,8 +4973,8 @@
 % \section{Tools}
 %
 %    \begin{macrocode}
-%<<version=3.60>>
-%<<date=2021/06/02>>
+%<<version=3.61>>
+%<<date=2021/06/28>>
 %    \end{macrocode}
 %
 % \textbf{Do not use the following macros in \texttt{ldf} files. They
@@ -5286,6 +5291,23 @@
   \else
     \expandafter\@firstofone
   \fi}
+%    \end{macrocode}
+%
+% The following adds some code to |\extras...| both before and after,
+% while avoiding doing it twice. It's somewhat convoluted, to deal with
+% |#|'s.
+%
+%    \begin{macrocode}  
+\def\bbl at extras@wrap#1#2#3{% 1:in-test, 2:before, 3:after
+  \toks@\expandafter\expandafter\expandafter{%
+    \csname extras\languagename\endcsname}%
+  \bbl at exp{\\\in@{#1}{\the\toks@}}%
+  \ifin@\else
+    \@temptokena{#2}%
+    \edef\bbl at tempc{\the\@temptokena\the\toks@}%
+    \toks@\expandafter{\bbl at tempc#3}%
+    \expandafter\edef\csname extras\languagename\endcsname{\the\toks@}%
+  \fi}
 %<</Basic macros>>
 %    \end{macrocode}
 %
@@ -5536,7 +5558,7 @@
   \ifx\@empty#2%
     \edef\bbl at tempc{\ifx\bbl at tempc\@empty\else\bbl at tempc,\fi#1}%
   \else
-    \in@{,provide,}{,#1,}%
+    \in@{,provide=}{,#1}%
     \ifin@
       \edef\bbl at tempc{%
         \ifx\bbl at tempc\@empty\else\bbl at tempc,\fi#1.\bbl at tempb#2}%
@@ -5569,7 +5591,7 @@
 \DeclareOption{noconfigs}{}
 \DeclareOption{showlanguages}{}
 \DeclareOption{silent}{}
-\DeclareOption{mono}{}
+% \DeclareOption{mono}{}
 \DeclareOption{shorthands=off}{\bbl at tempa shorthands=\bbl at tempa}
 \chardef\bbl at iniflag\z@
 \DeclareOption{provide=*}{\chardef\bbl at iniflag\@ne}    % main -> +1
@@ -5597,6 +5619,7 @@
 \let\bbl at opt@main\@nnil
 \let\bbl at opt@headfoot\@nnil
 \let\bbl at opt@layout\@nnil
+\let\bbl at opt@provide\@nnil
 %    \end{macrocode}
 %
 % The following tool is defined temporarily to store the values of
@@ -5639,6 +5662,16 @@
 \ProcessOptions*
 %    \end{macrocode}
 %
+%    \begin{macrocode}
+\ifx\bbl at opt@provide\@nnil\else % Tests. Ignore.
+  \chardef\bbl at iniflag\@ne
+  \bbl at replace\bbl at opt@provide{;}{,}
+  \bbl at add\bbl at opt@provide{,import}
+  \show\bbl at opt@provide
+\fi
+% 
+%    \end{macrocode}
+%
 % \subsection{Conditional loading of shorthands}
 %
 % If there is no |shorthands=<chars>|, the original \textsf{babel}
@@ -6798,23 +6831,6 @@
 %    \end{macrocode}%
 %    \end{macro}
 %
-% Just to be compatible with \LaTeX$\:$2.09 we add a few more lines
-% of code. TODO. Necessary? Correct place? Used by some ldf file?
-%
-%    \begin{macrocode}
-\ifx\@unexpandable at protect\@undefined
-  \def\@unexpandable at protect{\noexpand\protect\noexpand}
-  \long\def\protected at write#1#2#3{%
-    \begingroup
-      \let\thepage\relax
-      #2%
-      \let\protect\@unexpandable at protect
-      \edef\reserved at a{\write#1{#3}}%
-      \reserved at a
-    \endgroup
-    \if at nobreak\ifvmode\nobreak\fi\fi}
-\fi
-%
 % \subsection{Language options}
 %
 % Languages are loaded when processing the corresponding option
@@ -7036,7 +7052,11 @@
   \ifodd\bbl at iniflag  % case 1,3
     \bbl at ldfinit
     \let\CurrentOption\bbl at opt@main
-    \bbl at exp{\\\babelprovide[import,main]{\bbl at opt@main}}
+    \ifx\bbl at opt@provide\@nnil
+      \bbl at exp{\\\babelprovide[import,main]{\bbl at opt@main}}
+    \else
+      \bbl at exp{\\\babelprovide[\bbl at opt@provide,main]{\bbl at opt@main}}%
+    \fi
     \bbl at afterldf{}%
   \else % case 0,2
     \chardef\bbl at iniflag\z@  % Force ldf 
@@ -7498,6 +7518,13 @@
 % We also write a command to change the current language in the
 % auxiliary files.
 %
+% |\bbl at savelastskip| is used to deal with skips before the write
+% whatsit (as suggested by U Fischer). Adapted from \textsf{hyperref},
+% but it might fail, so I'll consider it a temporary hack, while I
+% study other options (the ideal, but very likely unfeasible except
+% perhaps in \luatex, is to avoid the |\write| altogether when not
+% needed).
+%
 %    \begin{macrocode}
 \def\BabelContentsFiles{toc,lof,lot}
 \def\bbl at set@language#1{% from selectlanguage, pop@
@@ -7515,9 +7542,6 @@
                 macro containing the actual locale, make\\%
                 sure it does not not match any language.\\%
                 Reported}%
-%                 I'll\\%
-%                 try to fix '\string\localename', but I cannot promise\\%
-%                 anything. Reported}%
       \ifx\scantokens\@undefined
          \def\localename{??}%
       \else
@@ -7533,16 +7557,15 @@
   \expandafter\ifx\csname date\languagename\endcsname\relax\else
     \if at filesw
       \ifx\babel at aux\@gobbletwo\else % Set if single in the first, redundant
-        % \bbl at savelastskip
+        \bbl at savelastskip
         \protected at write\@auxout{}{\string\babel at aux{\bbl at auxname}{}}%
-        % \bbl at restorelastskip
+        \bbl at restorelastskip
       \fi
       \bbl at usehooks{write}{}%
     \fi
   \fi}
-% The following is used above to deal with skips before the write
-% whatsit. Adapted from hyperref, but it might fail, so for the moment
-% it's not activated. TODO.
+%
+\let\bbl at restorelastskip\relax
 \def\bbl at savelastskip{%
   \let\bbl at restorelastskip\relax
   \ifvmode
@@ -7555,6 +7578,7 @@
           \\\nobreak \vskip-\skip@ \vskip\skip@}}%
     \fi
   \fi}
+%
 \newif\ifbbl at bcpallowed
 \bbl at bcpallowedfalse
 \def\select at language#1{% from set@, babel at aux
@@ -8681,13 +8705,13 @@
 %   The very first thing to do is saving the original catcode and the
 %   original definition, even if not active, which is possible
 %   (undefined characters require a special treatement to avoid
-%   making them |\relax|).
+%   making them |\relax| and preserving some degree of protection).
 %
 %    \begin{macrocode}
 \def\@initiate at active@char#1#2#3{%
   \bbl at csarg\edef{oricat@#2}{\catcode`#2=\the\catcode`#2\relax}%
   \ifx#1\@undefined
-    \bbl at csarg\edef{oridef@#2}{\let\noexpand#1\noexpand\@undefined}%
+    \bbl at csarg\def{oridef@#2}{\def#1{\active at prefix#1\@undefined}}%
   \else
     \bbl at csarg\let{oridef@@#2}#1%
     \bbl at csarg\edef{oridef@#2}{%
@@ -9104,8 +9128,8 @@
      #1%
      \bbl at activate{#2}}%
     {\bbl at error
-       {Cannot declare a shorthand turned off (\string#2)}
-       {Sorry, but you cannot use shorthands which have been\\%
+       {I can't declare a shorthand turned off (\string#2)}
+       {Sorry, but you can't use shorthands which have been\\%
         turned off in the package options}}}
 %    \end{macrocode}
 %
@@ -9624,6 +9648,29 @@
   \bbl at elt{\string.}\@m{3000}\bbl at elt{\string?}\@m{3000}%
   \bbl at elt{\string!}\@m{3000}\bbl at elt{\string:}\@m{2000}%
   \bbl at elt{\string;}\@m{1500}\bbl at elt{\string,}\@m{1250}}
+\def\bbl at pre@fs{%
+  \def\bbl at elt##1##2##3{\sfcode`##1=\the\sfcode`##1\relax}%
+  \edef\bbl at save@sfcodes{\bbl at fs@chars}}%
+\def\bbl at post@fs{%
+  \bbl at save@sfcodes
+  \edef\bbl at tempa{\bbl at cl{frspc}}%
+  \edef\bbl at tempa{\expandafter\@car\bbl at tempa\@nil}%
+  \if u\bbl at tempa          % do nothing
+  \else\if n\bbl at tempa     % non french
+    \def\bbl at elt##1##2##3{%
+      \ifnum\sfcode`##1=##2\relax
+        \babel at savevariable{\sfcode`##1}%
+        \sfcode`##1=##3\relax
+      \fi}%
+    \bbl at fs@chars
+  \else\if y\bbl at tempa     % french
+    \def\bbl at elt##1##2##3{%
+      \ifnum\sfcode`##1=##3\relax
+        \babel at savevariable{\sfcode`##1}%
+        \sfcode`##1=##2\relax
+      \fi}%
+    \bbl at fs@chars
+  \fi\fi\fi}
 %    \end{macrocode}
 %
 %  \end{macro}
@@ -10799,13 +10846,14 @@
 %
 %    \begin{macrocode}
 \bbl at trace{Creating languages and reading ini files}
+\let\bbl at extend@ini\@gobble
 \newcommand\babelprovide[2][]{%
   \let\bbl at savelangname\languagename
   \edef\bbl at savelocaleid{\the\localeid}%
   % Set name and locale id
   \edef\languagename{#2}%
-  % \global\@namedef{bbl at lcname@#2}{#2}%
   \bbl at id@assign
+  % Initialize keys
   \let\bbl at KVP@captions\@nil
   \let\bbl at KVP@date\@nil
   \let\bbl at KVP@import\@nil
@@ -10828,13 +10876,18 @@
   \let\bbl at KVP@labels\@nil
   \bbl at csarg\let{KVP at labels*}\@nil
   \global\let\bbl at inidata\@empty
+  \global\let\bbl at extend@ini\@gobble
+  \gdef\bbl at key@list{;}% 
   \bbl at forkv{#1}{%  TODO - error handling
     \in@{/}{##1}%
     \ifin@
+      \global\let\bbl at extend@ini\bbl at extend@ini at aux
       \bbl at renewinikey##1\@@{##2}%
     \else
       \bbl at csarg\def{KVP@##1}{##2}%
     \fi}%
+  \chardef\bbl at howloaded=% 0:none; 1:ldf without ini; 2:ini
+    \bbl at ifunset{date#2}\z@{\bbl at ifunset{bbl at llevel@#2}\@ne\tw@}%
   % == init ==
   \ifx\bbl at screset\@undefined
     \bbl at ldfinit
@@ -10841,14 +10894,16 @@
   \fi
   % ==
   \let\bbl at lbkflag\relax % \@empty = do setup linebreak
-  \bbl at ifunset{date#2}%
-    {\let\bbl at lbkflag\@empty}% new
-    {\ifx\bbl at KVP@hyphenrules\@nil\else
+  \ifcase\bbl at howloaded
+    \let\bbl at lbkflag\@empty % new
+  \else
+    \ifx\bbl at KVP@hyphenrules\@nil\else
        \let\bbl at lbkflag\@empty
-     \fi
-     \ifx\bbl at KVP@import\@nil\else
-       \let\bbl at lbkflag\@empty
-     \fi}%
+    \fi
+    \ifx\bbl at KVP@import\@nil\else
+      \let\bbl at lbkflag\@empty
+    \fi
+  \fi
   % == import, captions ==
   \ifx\bbl at KVP@import\@nil\else
     \bbl at exp{\\\bbl at ifblank{\bbl at KVP@import}}%
@@ -10870,13 +10925,19 @@
     \bbl at replace\bbl at KVP@transforms{ }{,}%
   \fi
   % Load ini
-  \bbl at ifunset{date#2}%
-    {\bbl at provide@new{#2}}%
-    {\bbl at ifblank{#1}%
+  \ifcase\bbl at howloaded
+    \bbl at provide@new{#2}%
+  \else
+    \bbl at ifblank{#1}%
       {}%  With \bbl at load@basic below
-      {\bbl at provide@renew{#2}}}%
+      {\bbl at provide@renew{#2}}%
+  \fi
   % Post tasks
   % ----------
+  % == subsequent calls after the first provide for a locale ==
+  \ifx\bbl at inidata\@empty\else
+    \bbl at extend@ini{#2}%
+  \fi
   % == ensure captions ==
   \ifx\bbl at KVP@captions\@nil\else
     \bbl at ifunset{bbl at extracaps@#2}%
@@ -10995,7 +11056,7 @@
     \bbl at csarg\edef{intsp@#2}{\bbl at KVP@intraspace}%
   \fi
   \bbl at provide@intraspace
-  %
+  % == Line breaking: justification ==
   \ifx\bbl at KVP@justification\@nil\else
      \let\bbl at KVP@linebreaking\bbl at KVP@justification
   \fi
@@ -11009,7 +11070,7 @@
   \bbl at xin@{/e}{/\bbl at cl{lnbrk}}%
   \ifin@\else\bbl at xin@{/k}{/\bbl at cl{lnbrk}}\fi
   \ifin@\bbl at arabicjust\fi
-  % == Line breaking: hyphenate.other.locale/.script==
+  % == Line breaking: hyphenate.other.(locale|script) ==
   \ifx\bbl at lbkflag\@empty
     \bbl at ifunset{bbl at hyotl@\languagename}{}%
       {\bbl at csarg\bbl at replace{hyotl@\languagename}{ }{,}%
@@ -11094,25 +11155,21 @@
   % restored correctly when exiting the language, so we ignore 
   % this change with the \bbl at alph@saved trick.
   \ifx\bbl at KVP@alph\@nil\else
-    \toks@\expandafter\expandafter\expandafter{%
-      \csname extras\languagename\endcsname}%
+    \bbl at extras@wrap{\\\bbl at alph@saved}%
+      {\let\bbl at alph@saved\@alph}%
+      {\let\@alph\bbl at alph@saved
+       \babel at save\@alph}%
     \bbl at exp{%
-      \def\<extras\languagename>{%
-        \let\\\bbl at alph@saved\\\@alph
-        \the\toks@
-        \let\\\@alph\\\bbl at alph@saved
-        \\\babel at save\\\@alph
+      \\\bbl at add\<extras\languagename>{%
         \let\\\@alph\<bbl at cntr@\bbl at KVP@alph @\languagename>}}%
   \fi
   \ifx\bbl at KVP@Alph\@nil\else
-    \toks@\expandafter\expandafter\expandafter{%
-      \csname extras\languagename\endcsname}%
+    \bbl at extras@wrap{\\\bbl at Alph@saved}%
+      {\let\bbl at Alph@saved\@Alph}%
+      {\let\@Alph\bbl at Alph@saved
+       \babel at save\@Alph}%
     \bbl at exp{%
-      \def\<extras\languagename>{%
-        \let\\\bbl at Alph@saved\\\@Alph
-        \the\toks@
-        \let\\\@Alph\\\bbl at Alph@saved
-        \\\babel at save\\\@Alph
+      \\\bbl at add\<extras\languagename>{%
         \let\\\@Alph\<bbl at cntr@\bbl at KVP@Alph @\languagename>}}%
   \fi
   % == require.babel in ini ==
@@ -11126,8 +11183,17 @@
          \bbl at input@texini{\bbl at cs{rqtex@\languagename}}%
          \catcode`\@=\atcatcode
          \let\atcatcode\relax
+         \global\bbl at csarg\let{rqtex@\languagename}\relax
        \fi}%
   \fi
+  % == frenchspacing ==
+  \ifcase\bbl at howloaded\in at true\else\in at false\fi
+  \ifin@\else\bbl at xin@{typography/frenchspacing}{\bbl at key@list}\fi
+  \ifin@
+    \bbl at extras@wrap{\\\bbl at pre@fs}%
+      {\bbl at pre@fs}%
+      {\bbl at post@fs}%
+  \fi
   % == Release saved transforms ==
   \bbl at release@transforms\relax % \relax closes the last item.
   % == main ==
@@ -11137,7 +11203,9 @@
   \fi}
 %    \end{macrocode}
 %
-% Depending on whether or not the language exists, we define two macros.
+% Depending on whether or not the language exists (based on
+% |\date<language>|), we define two macros. Remember
+% |\bbl at startcommands| opens a group.
 %
 %    \begin{macrocode}
 \def\bbl at provide@new#1{%
@@ -11176,37 +11244,11 @@
     \gdef\<#1hyphenmins>{%
       {\bbl at ifunset{bbl at lfthm@#1}{2}{\bbl at cs{lfthm@#1}}}%
       {\bbl at ifunset{bbl at rgthm@#1}{3}{\bbl at cs{rgthm@#1}}}}}%
-  % == hyphenrules ==
+  % == hyphenrules (also in renew) == 
   \bbl at provide@hyphens{#1}%
-  % == frenchspacing == (only if new)
-  \bbl at ifunset{bbl at frspc@#1}{}%
-    {\edef\bbl at tempa{\bbl at cl{frspc}}%
-     \edef\bbl at tempa{\expandafter\@car\bbl at tempa\@nil}%
-     \if u\bbl at tempa          % do nothing
-     \else\if n\bbl at tempa     % non french
-       \expandafter\bbl at add\csname extras#1\endcsname{%
-         \let\bbl at elt\bbl at fs@elt at i
-         \bbl at fs@chars}%
-     \else\if y\bbl at tempa     % french
-       \expandafter\bbl at add\csname extras#1\endcsname{%
-         \let\bbl at elt\bbl at fs@elt at ii
-         \bbl at fs@chars}%
-     \fi\fi\fi}%
-  %
   \ifx\bbl at KVP@main\@nil\else
      \expandafter\main at language\expandafter{#1}%
   \fi}
-% A couple of macros used above, to avoid hashes #######...
-\def\bbl at fs@elt at i#1#2#3{%
-  \ifnum\sfcode`#1=#2\relax
-    \babel at savevariable{\sfcode`#1}%
-    \sfcode`#1=#3\relax
-  \fi}%
-\def\bbl at fs@elt at ii#1#2#3{%
-  \ifnum\sfcode`#1=#3\relax
-    \babel at savevariable{\sfcode`#1}%
-    \sfcode`#1=#2\relax
-  \fi}%
 %
 \def\bbl at provide@renew#1{%
   \ifx\bbl at KVP@captions\@nil\else
@@ -11220,7 +11262,7 @@
      \bbl at savedate
    \EndBabelCommands
   \fi
-  % == hyphenrules ==
+  % == hyphenrules (also in new) ==
   \ifx\bbl at lbkflag\@empty
     \bbl at provide@hyphens{#1}%
   \fi}
@@ -11233,11 +11275,11 @@
 %
 %    \begin{macrocode}
 \def\bbl at load@basic#1{%
-  \bbl at ifunset{bbl at inidata@\languagename}{}%
-    {\getlocaleproperty\bbl at tempa{\languagename}{identification/load.level}%
-     \ifcase\bbl at tempa
-       \bbl at csarg\let{lname@\languagename}\relax
-     \fi}%
+  \ifcase\bbl at howloaded\or\or
+    \ifcase\csname bbl at llevel@\languagename\endcsname
+      \bbl at csarg\let{lname@\languagename}\relax
+    \fi
+  \fi
   \bbl at ifunset{bbl at lname@#1}% 
     {\def\BabelBeforeIni##1##2{%
        \begingroup
@@ -11320,16 +11362,17 @@
 %    \begin{macrocode}
 \def\bbl at iniline#1\bbl at iniline{%
   \@ifnextchar[\bbl at inisect{\@ifnextchar;\bbl at iniskip\bbl at inistore}#1\@@}% ]
-\def\bbl at inisect[#1]#2\@@{\def\bbl at section{#1}}% 
+\def\bbl at inisect[#1]#2\@@{\def\bbl at section{#1}} 
 \def\bbl at iniskip#1\@@{}%      if starts with ;
 \def\bbl at inistore#1=#2\@@{%      full (default)
   \bbl at trim@def\bbl at tempa{#1}%
   \bbl at trim\toks@{#2}%
-  \bbl at ifunset{bbl at KVP@\bbl at section/\bbl at tempa}%
-    {\bbl at exp{%
+  \bbl at xin@{;\bbl at section/\bbl at tempa;}{\bbl at key@list}%
+  \ifin@\else
+    \bbl at exp{%
       \\\g at addto@macro\\\bbl at inidata{%
-        \\\bbl at elt{\bbl at section}{\bbl at tempa}{\the\toks@}}}}%
-    {}}%
+        \\\bbl at elt{\bbl at section}{\bbl at tempa}{\the\toks@}}}%
+  \fi}
 \def\bbl at inistore@min#1=#2\@@{%  minimal (maybe set in \bbl at read@ini)
   \bbl at trim@def\bbl at tempa{#1}%
   \bbl at trim\toks@{#2}%
@@ -11337,7 +11380,7 @@
   \ifin@
     \bbl at exp{\\\g at addto@macro\\\bbl at inidata{%
       \\\bbl at elt{identification}{\bbl at tempa}{\the\toks@}}}%
-  \fi}%
+  \fi}
 %    \end{macrocode}
 %
 % Now, the ‘main loop’, which \textbf{**must be executed inside a
@@ -11355,6 +11398,7 @@
   \csname newread\endcsname\bbl at readstream
 \fi
 \def\bbl at read@ini#1#2{%
+  \global\let\bbl at extend@ini\@gobble
   \openin\bbl at readstream=babel-#1.ini
   \ifeof\bbl at readstream
     \bbl at error
@@ -11363,7 +11407,7 @@
        is not complete.}%
       {Fix the name or reinstall babel.}%
   \else
-    % Store ini data in \bbl at inidata
+    % == Store ini data in \bbl at inidata ==
     \catcode`\[=12 \catcode`\]=12 \catcode`\==12 \catcode`\&=12
     \catcode`\;=12 \catcode`\|=12 \catcode`\%=14 \catcode`\-=12
     \bbl at info{Importing
@@ -11386,22 +11430,10 @@
         \expandafter\bbl at iniline\bbl at line\bbl at iniline
       \fi
     \repeat
-    % Process stored data
+    % == Process stored data ==
     \bbl at csarg\xdef{lini@\languagename}{#1}%
-    \let\bbl at savestrings\@empty
-    \let\bbl at savetoday\@empty
-    \let\bbl at savedate\@empty
-    \def\bbl at elt##1##2##3{%
-      \def\bbl at section{##1}%
-      \in@{=date.}{=##1}% Find a better place
-      \ifin@
-        \bbl at ini@calendar{##1}%
-      \fi
-      \global\bbl at csarg\let{bbl at KVP@##1/##2}\relax
-      \bbl at ifunset{bbl at inikv@##1}{}%
-        {\csname bbl at inikv@##1\endcsname{##2}{##3}}}%
-    \bbl at inidata
-    % 'Export' data
+    \bbl at read@ini at aux
+    % == 'Export' data ==
     \bbl at ini@exports{#2}%
     \global\bbl at csarg\let{inidata@\languagename}\bbl at inidata
     \global\let\bbl at inidata\@empty
@@ -11408,8 +11440,54 @@
     \bbl at exp{\\\bbl at add@list\\\bbl at ini@loaded{\languagename}}%
     \bbl at toglobal\bbl at ini@loaded
   \fi}
+\def\bbl at read@ini at aux{%
+  \let\bbl at savestrings\@empty
+  \let\bbl at savetoday\@empty
+  \let\bbl at savedate\@empty
+  \def\bbl at elt##1##2##3{%
+    \def\bbl at section{##1}%
+    \in@{=date.}{=##1}% Find a better place
+    \ifin@
+      \bbl at ini@calendar{##1}%
+    \fi
+    \bbl at ifunset{bbl at inikv@##1}{}%
+      {\csname bbl at inikv@##1\endcsname{##2}{##3}}}%
+  \bbl at inidata}
 %    \end{macrocode}
 %
+% A variant to be used when the ini file has been already loaded,
+% because it's not the first |\babelprovide| for this language.
+%
+%    \begin{macrocode}
+\def\bbl at extend@ini at aux#1{%
+  \bbl at startcommands*{#1}{captions}%
+    % Activate captions/... and modify exports
+    \bbl at csarg\def{inikv at captions.licr}##1##2{%
+      \setlocalecaption{#1}{##1}{##2}}%
+    \def\bbl at inikv@captions##1##2{%
+      \bbl at ini@captions at aux{##1}{##2}}%
+    \def\bbl at stringdef##1##2{\gdef##1{##2}}% 
+    \def\bbl at exportkey##1##2##3{%
+      \bbl at ifunset{bbl@@kv@##2}{}%
+        {\expandafter\ifx\csname bbl@@kv@##2\endcsname\@empty\else
+           \bbl at exp{\global\let\<bbl@##1@\languagename>\<bbl@@kv@##2>}%
+         \fi}}%
+    % As with \bbl at read@ini, but with some changes
+    \bbl at read@ini at aux
+    \bbl at ini@exports\tw@
+    % Update inidata at lang by pretending the ini is read.
+    \def\bbl at elt##1##2##3{%
+      \def\bbl at section{##1}%
+      \bbl at iniline##2=##3\bbl at iniline}%
+    \csname bbl at inidata@#1\endcsname
+    \global\bbl at csarg\let{inidata@#1}\bbl at inidata
+  \StartBabelCommands*{#1}{date}% And from the import stuff
+    \def\bbl at stringdef##1##2{\gdef##1{##2}}%
+    \bbl at savetoday
+    \bbl at savedate
+  \bbl at endcommands}
+%    \end{macrocode}
+%
 % A somewhat hackish tool to handle calendar sections. To be improved.
 %
 %    \begin{macrocode}
@@ -11447,7 +11525,7 @@
   \edef\bbl at tempb{\zap at space #2 \@empty}%   key
   \bbl at trim\toks@{#3}%                      value
   \bbl at exp{%
-    \global\let\<bbl at KVP@\bbl at tempa/\bbl at tempb>\\\@empty % just a flag
+    \edef\\\bbl at key@list{\bbl at key@list \bbl at tempa/\bbl at tempb;}%
     \\\g at addto@macro\\\bbl at inidata{%
        \\\bbl at elt{\bbl at tempa}{\bbl at tempb}{\the\toks@}}}}%
 %    \end{macrocode}
@@ -11492,6 +11570,7 @@
   \or
     \bbl at iniwarning{.xelatex}%
   \fi%
+  \bbl at exportkey{llevel}{identification.load.level}{}%
   \bbl at exportkey{elname}{identification.name.english}{}%
   \bbl at exp{\\\bbl at exportkey{lname}{identification.name.opentype}%
     {\csname bbl at elname@\languagename\endcsname}}%
@@ -11517,9 +11596,9 @@
     \bbl at exportkey{hyotl}{typography.hyphenate.other.locale}{}%
     \bbl at exportkey{hyots}{typography.hyphenate.other.script}{}%
     \bbl at exportkey{intsp}{typography.intraspace}{}%
+    \bbl at exportkey{frspc}{typography.frenchspacing}{u}%
     \bbl at exportkey{chrng}{characters.ranges}{}%
     \bbl at exportkey{dgnat}{numbers.digits.native}{}%
-    \bbl at exportkey{frspc}{typography.frenchspacing}{u}%
     \ifnum#1=\tw@           % only (re)new
       \bbl at exportkey{rqtex}{identification.require.babel}{}%
       \bbl at toglobal\bbl at savetoday
@@ -11692,6 +11771,7 @@
       \bbl at replace\bbl at toreplace{[}{\csname the}% 
       \bbl at replace\bbl at toreplace{]}{\endcsname{}}% 
       \toks@\expandafter{\bbl at toreplace}%
+      % TODO. Execute only once:
       \bbl at exp{%
         \\\bbl at add\<extras\languagename>{%
           \\\babel at save\<labelenum\romannumeral\bbl at tempa>%
@@ -11794,9 +11874,7 @@
        \bbl at trim@def\bbl at toreplace{#5}%
        \bbl at TG@@date
        \bbl at ifunset{bbl at date@\languagename @}%
-         {\global\bbl at csarg\let{date@\languagename @}\bbl at toreplace
-         % TODO. Move to a better place.
-          \bbl at exp{%
+         {\bbl at exp{% TODO. Move to a better place.
             \gdef\<\languagename date>{\\\protect\<\languagename date >}%
             \gdef\<\languagename date >####1####2####3{%
               \\\bbl at usedategrouptrue
@@ -11804,9 +11882,10 @@
                 \\\localedate{####1}{####2}{####3}}}%
             \\\bbl at add\\\bbl at savetoday{%
               \\\SetString\\\today{%
-                \<\languagename date>%   
+                \<\languagename date>%
                    {\\\the\year}{\\\the\month}{\\\the\day}}}}}%
-         {}%
+         {}%      
+       \global\bbl at csarg\let{date@\languagename @}\bbl at toreplace
        \ifx\bbl at tempb\@empty\else
          \global\bbl at csarg\let{date@\languagename @\bbl at tempb}\bbl at toreplace
        \fi}%
@@ -13024,6 +13103,7 @@
         \expandafter\bbl at intrapenalty\bbl at KVP@intrapenalty\@@
       \fi
       \bbl at exp{%
+        % TODO. Execute only once (but redundant):
         \\\bbl at add\<extras\languagename>{%
           \XeTeXlinebreaklocale "\bbl at cl{tbcp}"%
           \<bbl at xeisp@\languagename>%
@@ -13783,8 +13863,8 @@
     Babel.arabic.elong_map[\the\localeid]   = {}
     luatexbase.add_to_callback('post_linebreak_filter',
       Babel.arabic.justify, 'Babel.arabic.justify')
-%     luatexbase.add_to_callback('hpack_filter',
-%       Babel.arabic.justify_hbox, 'Babel.arabic.justify_hbox')
+    luatexbase.add_to_callback('hpack_filter',
+      Babel.arabic.justify_hbox, 'Babel.arabic.justify_hbox')
   }}% 
 % Save both node lists to make replacement. TODO. Save also widths to
 % make computations
@@ -13862,8 +13942,14 @@
 end
 
 function Babel.arabic.justify_hbox(head, gc, size, pack)
+  local has_inf = false
   if Babel.arabic.justify_enabled and pack == 'exactly' then
-    Babel.arabic.justify_hlist(head, nil, gc, size, pack)
+    for n in node.traverse_id(12, head) do
+      if n.stretch_order > 0 then has_inf = true end
+    end
+    if not has_inf then
+      Babel.arabic.justify_hlist(head, nil, gc, size, pack)
+    end
   end
   return head
 end

Modified: trunk/Master/texmf-dist/source/latex/babel/babel.ins
===================================================================
--- trunk/Master/texmf-dist/source/latex/babel/babel.ins	2021-06-28 20:37:07 UTC (rev 59739)
+++ trunk/Master/texmf-dist/source/latex/babel/babel.ins	2021-06-28 20:38:19 UTC (rev 59740)
@@ -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{2021/06/02}
+\def\filedate{2021/06/28}
 \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	2021-06-28 20:37:07 UTC (rev 59739)
+++ trunk/Master/texmf-dist/source/latex/babel/bbcompat.dtx	2021-06-28 20:38:19 UTC (rev 59740)
@@ -30,7 +30,7 @@
 %
 % \iffalse
 %<*dtx>
-\ProvidesFile{bbcompat.dtx}[2021/06/02 v3.60]
+\ProvidesFile{bbcompat.dtx}[2021/06/28 v3.61]
 %</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-bidi-basic-r.lua
===================================================================
--- trunk/Master/texmf-dist/tex/generic/babel/babel-bidi-basic-r.lua	2021-06-28 20:37:07 UTC (rev 59739)
+++ trunk/Master/texmf-dist/tex/generic/babel/babel-bidi-basic-r.lua	2021-06-28 20:38:19 UTC (rev 59740)
@@ -12,6 +12,7 @@
 --           any individual authors listed elsewhere in this file.
 -- All rights reserved.
 --
+--
 -- This file is part of the Babel system.
 -- --------------------------------------
 --
@@ -26,7 +27,6 @@
 -- This work has the LPPL maintenance status "maintained".
 --
 -- The Current Maintainer of this work is Javier Bezos.
-
 --
 -- The list of derived (unpacked) files belonging to the distribution
 -- and covered by LPPL is defined by the unpacking scripts (with

Modified: trunk/Master/texmf-dist/tex/generic/babel/babel-bidi-basic.lua
===================================================================
--- trunk/Master/texmf-dist/tex/generic/babel/babel-bidi-basic.lua	2021-06-28 20:37:07 UTC (rev 59739)
+++ trunk/Master/texmf-dist/tex/generic/babel/babel-bidi-basic.lua	2021-06-28 20:38:19 UTC (rev 59740)
@@ -12,6 +12,7 @@
 --           any individual authors listed elsewhere in this file.
 -- All rights reserved.
 --
+--
 -- This file is part of the Babel system.
 -- --------------------------------------
 --
@@ -26,7 +27,6 @@
 -- This work has the LPPL maintenance status "maintained".
 --
 -- The Current Maintainer of this work is Javier Bezos.
-
 --
 -- The list of derived (unpacked) files belonging to the distribution
 -- and covered by LPPL is defined by the unpacking scripts (with

Modified: trunk/Master/texmf-dist/tex/generic/babel/babel-data-bidi.lua
===================================================================
--- trunk/Master/texmf-dist/tex/generic/babel/babel-data-bidi.lua	2021-06-28 20:37:07 UTC (rev 59739)
+++ trunk/Master/texmf-dist/tex/generic/babel/babel-data-bidi.lua	2021-06-28 20:38:19 UTC (rev 59740)
@@ -12,6 +12,7 @@
 --           any individual authors listed elsewhere in this file.
 -- All rights reserved.
 --
+--
 -- This file is part of the Babel system.
 -- --------------------------------------
 --
@@ -26,7 +27,6 @@
 -- This work has the LPPL maintenance status "maintained".
 --
 -- The Current Maintainer of this work is Javier Bezos.
-
 --
 -- The list of derived (unpacked) files belonging to the distribution
 -- and covered by LPPL is defined by the unpacking scripts (with

Modified: trunk/Master/texmf-dist/tex/generic/babel/babel-data-cjk.lua
===================================================================
--- trunk/Master/texmf-dist/tex/generic/babel/babel-data-cjk.lua	2021-06-28 20:37:07 UTC (rev 59739)
+++ trunk/Master/texmf-dist/tex/generic/babel/babel-data-cjk.lua	2021-06-28 20:38:19 UTC (rev 59740)
@@ -12,6 +12,7 @@
 --           any individual authors listed elsewhere in this file.
 -- All rights reserved.
 --
+--
 -- This file is part of the Babel system.
 -- --------------------------------------
 --
@@ -26,7 +27,6 @@
 -- This work has the LPPL maintenance status "maintained".
 --
 -- The Current Maintainer of this work is Javier Bezos.
-
 --
 -- The list of derived (unpacked) files belonging to the distribution
 -- and covered by LPPL is defined by the unpacking scripts (with

Modified: trunk/Master/texmf-dist/tex/generic/babel/babel.def
===================================================================
--- trunk/Master/texmf-dist/tex/generic/babel/babel.def	2021-06-28 20:37:07 UTC (rev 59739)
+++ trunk/Master/texmf-dist/tex/generic/babel/babel.def	2021-06-28 20:38:19 UTC (rev 59740)
@@ -12,6 +12,7 @@
 %%           any individual authors listed elsewhere in this file.
 %% All rights reserved.
 %%
+%%
 %% This file is part of the Babel system.
 %% --------------------------------------
 %%
@@ -26,7 +27,6 @@
 %% This work has the LPPL maintenance status "maintained".
 %%
 %% The Current Maintainer of this work is Javier Bezos.
-
 %%
 %% The list of derived (unpacked) files belonging to the distribution
 %% and covered by LPPL is defined by the unpacking scripts (with
@@ -40,7 +40,7 @@
     \wlog{File: #1 #4 #3 <#2>}%
     \let\ProvidesFile\@undefined}
 \fi
-\ProvidesFile{babel.def}[2021/06/02 3.60 Babel common definitions]
+\ProvidesFile{babel.def}[2021/06/28 3.61 Babel common definitions]
 \ifx\AtBeginDocument\@undefined  % TODO. change test.
     % == Code for plain ==
 \def\@empty{}
@@ -398,8 +398,8 @@
 \fi
 \countdef\last at language=19  % TODO. why? remove?
 \def\addlanguage{\csname newlanguage\endcsname}
-\def\bbl at version{3.60}
-\def\bbl at date{2021/06/02}
+\def\bbl at version{3.61}
+\def\bbl at date{2021/06/28}
 \def\adddialect#1#2{%
   \global\chardef#1#2\relax
   \bbl at usehooks{adddialect}{{#1}{#2}}%
@@ -587,13 +587,14 @@
   \expandafter\ifx\csname date\languagename\endcsname\relax\else
     \if at filesw
       \ifx\babel at aux\@gobbletwo\else % Set if single in the first, redundant
-        % \bbl at savelastskip
+        \bbl at savelastskip
         \protected at write\@auxout{}{\string\babel at aux{\bbl at auxname}{}}%
-        % \bbl at restorelastskip
+        \bbl at restorelastskip
       \fi
       \bbl at usehooks{write}{}%
     \fi
   \fi}
+\let\bbl at restorelastskip\relax
 \def\bbl at savelastskip{%
   \let\bbl at restorelastskip\relax
   \ifvmode
@@ -1093,6 +1094,16 @@
   \else
     \expandafter\@firstofone
   \fi}
+\def\bbl at extras@wrap#1#2#3{% 1:in-test, 2:before, 3:after
+  \toks@\expandafter\expandafter\expandafter{%
+    \csname extras\languagename\endcsname}%
+  \bbl at exp{\\\in@{#1}{\the\toks@}}%
+  \ifin@\else
+    \@temptokena{#2}%
+    \edef\bbl at tempc{\the\@temptokena\the\toks@}%
+    \toks@\expandafter{\bbl at tempc#3}%
+    \expandafter\edef\csname extras\languagename\endcsname{\the\toks@}%
+  \fi}
 \bbl at trace{Compatibility with language.def}
 \ifx\bbl at languages\@undefined
   \ifx\directlua\@undefined
@@ -1363,7 +1374,7 @@
 \def\@initiate at active@char#1#2#3{%
   \bbl at csarg\edef{oricat@#2}{\catcode`#2=\the\catcode`#2\relax}%
   \ifx#1\@undefined
-    \bbl at csarg\edef{oridef@#2}{\let\noexpand#1\noexpand\@undefined}%
+    \bbl at csarg\def{oridef@#2}{\def#1{\active at prefix#1\@undefined}}%
   \else
     \bbl at csarg\let{oridef@@#2}#1%
     \bbl at csarg\edef{oridef@#2}{%
@@ -1541,8 +1552,8 @@
      #1%
      \bbl at activate{#2}}%
     {\bbl at error
-       {Cannot declare a shorthand turned off (\string#2)}
-       {Sorry, but you cannot use shorthands which have been\\%
+       {I can't declare a shorthand turned off (\string#2)}
+       {Sorry, but you can't use shorthands which have been\\%
         turned off in the package options}}}
 \def\user at language@group{user@\language at group}
 \def\bbl at set@user at generic#1#2{%
@@ -1767,6 +1778,29 @@
   \bbl at elt{\string.}\@m{3000}\bbl at elt{\string?}\@m{3000}%
   \bbl at elt{\string!}\@m{3000}\bbl at elt{\string:}\@m{2000}%
   \bbl at elt{\string;}\@m{1500}\bbl at elt{\string,}\@m{1250}}
+\def\bbl at pre@fs{%
+  \def\bbl at elt##1##2##3{\sfcode`##1=\the\sfcode`##1\relax}%
+  \edef\bbl at save@sfcodes{\bbl at fs@chars}}%
+\def\bbl at post@fs{%
+  \bbl at save@sfcodes
+  \edef\bbl at tempa{\bbl at cl{frspc}}%
+  \edef\bbl at tempa{\expandafter\@car\bbl at tempa\@nil}%
+  \if u\bbl at tempa          % do nothing
+  \else\if n\bbl at tempa     % non french
+    \def\bbl at elt##1##2##3{%
+      \ifnum\sfcode`##1=##2\relax
+        \babel at savevariable{\sfcode`##1}%
+        \sfcode`##1=##3\relax
+      \fi}%
+    \bbl at fs@chars
+  \else\if y\bbl at tempa     % french
+    \def\bbl at elt##1##2##3{%
+      \ifnum\sfcode`##1=##3\relax
+        \babel at savevariable{\sfcode`##1}%
+        \sfcode`##1=##2\relax
+      \fi}%
+    \bbl at fs@chars
+  \fi\fi\fi}
 \bbl at trace{Short tags}
 \def\babeltags#1{%
   \edef\bbl at tempa{\zap at space#1 \@empty}%
@@ -2347,13 +2381,14 @@
   \input xebabel.def
 \fi
 \bbl at trace{Creating languages and reading ini files}
+\let\bbl at extend@ini\@gobble
 \newcommand\babelprovide[2][]{%
   \let\bbl at savelangname\languagename
   \edef\bbl at savelocaleid{\the\localeid}%
   % Set name and locale id
   \edef\languagename{#2}%
-  % \global\@namedef{bbl at lcname@#2}{#2}%
   \bbl at id@assign
+  % Initialize keys
   \let\bbl at KVP@captions\@nil
   \let\bbl at KVP@date\@nil
   \let\bbl at KVP@import\@nil
@@ -2376,13 +2411,18 @@
   \let\bbl at KVP@labels\@nil
   \bbl at csarg\let{KVP at labels*}\@nil
   \global\let\bbl at inidata\@empty
+  \global\let\bbl at extend@ini\@gobble
+  \gdef\bbl at key@list{;}%
   \bbl at forkv{#1}{%  TODO - error handling
     \in@{/}{##1}%
     \ifin@
+      \global\let\bbl at extend@ini\bbl at extend@ini at aux
       \bbl at renewinikey##1\@@{##2}%
     \else
       \bbl at csarg\def{KVP@##1}{##2}%
     \fi}%
+  \chardef\bbl at howloaded=% 0:none; 1:ldf without ini; 2:ini
+    \bbl at ifunset{date#2}\z@{\bbl at ifunset{bbl at llevel@#2}\@ne\tw@}%
   % == init ==
   \ifx\bbl at screset\@undefined
     \bbl at ldfinit
@@ -2389,14 +2429,16 @@
   \fi
   % ==
   \let\bbl at lbkflag\relax % \@empty = do setup linebreak
-  \bbl at ifunset{date#2}%
-    {\let\bbl at lbkflag\@empty}% new
-    {\ifx\bbl at KVP@hyphenrules\@nil\else
+  \ifcase\bbl at howloaded
+    \let\bbl at lbkflag\@empty % new
+  \else
+    \ifx\bbl at KVP@hyphenrules\@nil\else
        \let\bbl at lbkflag\@empty
-     \fi
-     \ifx\bbl at KVP@import\@nil\else
-       \let\bbl at lbkflag\@empty
-     \fi}%
+    \fi
+    \ifx\bbl at KVP@import\@nil\else
+      \let\bbl at lbkflag\@empty
+    \fi
+  \fi
   % == import, captions ==
   \ifx\bbl at KVP@import\@nil\else
     \bbl at exp{\\\bbl at ifblank{\bbl at KVP@import}}%
@@ -2418,13 +2460,19 @@
     \bbl at replace\bbl at KVP@transforms{ }{,}%
   \fi
   % Load ini
-  \bbl at ifunset{date#2}%
-    {\bbl at provide@new{#2}}%
-    {\bbl at ifblank{#1}%
+  \ifcase\bbl at howloaded
+    \bbl at provide@new{#2}%
+  \else
+    \bbl at ifblank{#1}%
       {}%  With \bbl at load@basic below
-      {\bbl at provide@renew{#2}}}%
+      {\bbl at provide@renew{#2}}%
+  \fi
   % Post tasks
   % ----------
+  % == subsequent calls after the first provide for a locale ==
+  \ifx\bbl at inidata\@empty\else
+    \bbl at extend@ini{#2}%
+  \fi
   % == ensure captions ==
   \ifx\bbl at KVP@captions\@nil\else
     \bbl at ifunset{bbl at extracaps@#2}%
@@ -2543,7 +2591,7 @@
     \bbl at csarg\edef{intsp@#2}{\bbl at KVP@intraspace}%
   \fi
   \bbl at provide@intraspace
-  %
+  % == Line breaking: justification ==
   \ifx\bbl at KVP@justification\@nil\else
      \let\bbl at KVP@linebreaking\bbl at KVP@justification
   \fi
@@ -2557,7 +2605,7 @@
   \bbl at xin@{/e}{/\bbl at cl{lnbrk}}%
   \ifin@\else\bbl at xin@{/k}{/\bbl at cl{lnbrk}}\fi
   \ifin@\bbl at arabicjust\fi
-  % == Line breaking: hyphenate.other.locale/.script==
+  % == Line breaking: hyphenate.other.(locale|script) ==
   \ifx\bbl at lbkflag\@empty
     \bbl at ifunset{bbl at hyotl@\languagename}{}%
       {\bbl at csarg\bbl at replace{hyotl@\languagename}{ }{,}%
@@ -2642,25 +2690,21 @@
   % restored correctly when exiting the language, so we ignore
   % this change with the \bbl at alph@saved trick.
   \ifx\bbl at KVP@alph\@nil\else
-    \toks@\expandafter\expandafter\expandafter{%
-      \csname extras\languagename\endcsname}%
+    \bbl at extras@wrap{\\\bbl at alph@saved}%
+      {\let\bbl at alph@saved\@alph}%
+      {\let\@alph\bbl at alph@saved
+       \babel at save\@alph}%
     \bbl at exp{%
-      \def\<extras\languagename>{%
-        \let\\\bbl at alph@saved\\\@alph
-        \the\toks@
-        \let\\\@alph\\\bbl at alph@saved
-        \\\babel at save\\\@alph
+      \\\bbl at add\<extras\languagename>{%
         \let\\\@alph\<bbl at cntr@\bbl at KVP@alph @\languagename>}}%
   \fi
   \ifx\bbl at KVP@Alph\@nil\else
-    \toks@\expandafter\expandafter\expandafter{%
-      \csname extras\languagename\endcsname}%
+    \bbl at extras@wrap{\\\bbl at Alph@saved}%
+      {\let\bbl at Alph@saved\@Alph}%
+      {\let\@Alph\bbl at Alph@saved
+       \babel at save\@Alph}%
     \bbl at exp{%
-      \def\<extras\languagename>{%
-        \let\\\bbl at Alph@saved\\\@Alph
-        \the\toks@
-        \let\\\@Alph\\\bbl at Alph@saved
-        \\\babel at save\\\@Alph
+      \\\bbl at add\<extras\languagename>{%
         \let\\\@Alph\<bbl at cntr@\bbl at KVP@Alph @\languagename>}}%
   \fi
   % == require.babel in ini ==
@@ -2674,8 +2718,17 @@
          \bbl at input@texini{\bbl at cs{rqtex@\languagename}}%
          \catcode`\@=\atcatcode
          \let\atcatcode\relax
+         \global\bbl at csarg\let{rqtex@\languagename}\relax
        \fi}%
   \fi
+  % == frenchspacing ==
+  \ifcase\bbl at howloaded\in at true\else\in at false\fi
+  \ifin@\else\bbl at xin@{typography/frenchspacing}{\bbl at key@list}\fi
+  \ifin@
+    \bbl at extras@wrap{\\\bbl at pre@fs}%
+      {\bbl at pre@fs}%
+      {\bbl at post@fs}%
+  \fi
   % == Release saved transforms ==
   \bbl at release@transforms\relax % \relax closes the last item.
   % == main ==
@@ -2719,36 +2772,11 @@
     \gdef\<#1hyphenmins>{%
       {\bbl at ifunset{bbl at lfthm@#1}{2}{\bbl at cs{lfthm@#1}}}%
       {\bbl at ifunset{bbl at rgthm@#1}{3}{\bbl at cs{rgthm@#1}}}}}%
-  % == hyphenrules ==
+  % == hyphenrules (also in renew) ==
   \bbl at provide@hyphens{#1}%
-  % == frenchspacing == (only if new)
-  \bbl at ifunset{bbl at frspc@#1}{}%
-    {\edef\bbl at tempa{\bbl at cl{frspc}}%
-     \edef\bbl at tempa{\expandafter\@car\bbl at tempa\@nil}%
-     \if u\bbl at tempa          % do nothing
-     \else\if n\bbl at tempa     % non french
-       \expandafter\bbl at add\csname extras#1\endcsname{%
-         \let\bbl at elt\bbl at fs@elt at i
-         \bbl at fs@chars}%
-     \else\if y\bbl at tempa     % french
-       \expandafter\bbl at add\csname extras#1\endcsname{%
-         \let\bbl at elt\bbl at fs@elt at ii
-         \bbl at fs@chars}%
-     \fi\fi\fi}%
-  %
   \ifx\bbl at KVP@main\@nil\else
      \expandafter\main at language\expandafter{#1}%
   \fi}
-\def\bbl at fs@elt at i#1#2#3{%
-  \ifnum\sfcode`#1=#2\relax
-    \babel at savevariable{\sfcode`#1}%
-    \sfcode`#1=#3\relax
-  \fi}%
-\def\bbl at fs@elt at ii#1#2#3{%
-  \ifnum\sfcode`#1=#3\relax
-    \babel at savevariable{\sfcode`#1}%
-    \sfcode`#1=#2\relax
-  \fi}%
 \def\bbl at provide@renew#1{%
   \ifx\bbl at KVP@captions\@nil\else
     \StartBabelCommands*{#1}{captions}%
@@ -2761,16 +2789,16 @@
      \bbl at savedate
    \EndBabelCommands
   \fi
-  % == hyphenrules ==
+  % == hyphenrules (also in new) ==
   \ifx\bbl at lbkflag\@empty
     \bbl at provide@hyphens{#1}%
   \fi}
 \def\bbl at load@basic#1{%
-  \bbl at ifunset{bbl at inidata@\languagename}{}%
-    {\getlocaleproperty\bbl at tempa{\languagename}{identification/load.level}%
-     \ifcase\bbl at tempa
-       \bbl at csarg\let{lname@\languagename}\relax
-     \fi}%
+  \ifcase\bbl at howloaded\or\or
+    \ifcase\csname bbl at llevel@\languagename\endcsname
+      \bbl at csarg\let{lname@\languagename}\relax
+    \fi
+  \fi
   \bbl at ifunset{bbl at lname@#1}%
     {\def\BabelBeforeIni##1##2{%
        \begingroup
@@ -2834,16 +2862,17 @@
   \bbl at esphack}
 \def\bbl at iniline#1\bbl at iniline{%
   \@ifnextchar[\bbl at inisect{\@ifnextchar;\bbl at iniskip\bbl at inistore}#1\@@}% ]
-\def\bbl at inisect[#1]#2\@@{\def\bbl at section{#1}}%
+\def\bbl at inisect[#1]#2\@@{\def\bbl at section{#1}}
 \def\bbl at iniskip#1\@@{}%      if starts with ;
 \def\bbl at inistore#1=#2\@@{%      full (default)
   \bbl at trim@def\bbl at tempa{#1}%
   \bbl at trim\toks@{#2}%
-  \bbl at ifunset{bbl at KVP@\bbl at section/\bbl at tempa}%
-    {\bbl at exp{%
+  \bbl at xin@{;\bbl at section/\bbl at tempa;}{\bbl at key@list}%
+  \ifin@\else
+    \bbl at exp{%
       \\\g at addto@macro\\\bbl at inidata{%
-        \\\bbl at elt{\bbl at section}{\bbl at tempa}{\the\toks@}}}}%
-    {}}%
+        \\\bbl at elt{\bbl at section}{\bbl at tempa}{\the\toks@}}}%
+  \fi}
 \def\bbl at inistore@min#1=#2\@@{%  minimal (maybe set in \bbl at read@ini)
   \bbl at trim@def\bbl at tempa{#1}%
   \bbl at trim\toks@{#2}%
@@ -2851,11 +2880,12 @@
   \ifin@
     \bbl at exp{\\\g at addto@macro\\\bbl at inidata{%
       \\\bbl at elt{identification}{\bbl at tempa}{\the\toks@}}}%
-  \fi}%
+  \fi}
 \ifx\bbl at readstream\@undefined
   \csname newread\endcsname\bbl at readstream
 \fi
 \def\bbl at read@ini#1#2{%
+  \global\let\bbl at extend@ini\@gobble
   \openin\bbl at readstream=babel-#1.ini
   \ifeof\bbl at readstream
     \bbl at error
@@ -2864,7 +2894,7 @@
        is not complete.}%
       {Fix the name or reinstall babel.}%
   \else
-    % Store ini data in \bbl at inidata
+    % == Store ini data in \bbl at inidata ==
     \catcode`\[=12 \catcode`\]=12 \catcode`\==12 \catcode`\&=12
     \catcode`\;=12 \catcode`\|=12 \catcode`\%=14 \catcode`\-=12
     \bbl at info{Importing
@@ -2887,22 +2917,10 @@
         \expandafter\bbl at iniline\bbl at line\bbl at iniline
       \fi
     \repeat
-    % Process stored data
+    % == Process stored data ==
     \bbl at csarg\xdef{lini@\languagename}{#1}%
-    \let\bbl at savestrings\@empty
-    \let\bbl at savetoday\@empty
-    \let\bbl at savedate\@empty
-    \def\bbl at elt##1##2##3{%
-      \def\bbl at section{##1}%
-      \in@{=date.}{=##1}% Find a better place
-      \ifin@
-        \bbl at ini@calendar{##1}%
-      \fi
-      \global\bbl at csarg\let{bbl at KVP@##1/##2}\relax
-      \bbl at ifunset{bbl at inikv@##1}{}%
-        {\csname bbl at inikv@##1\endcsname{##2}{##3}}}%
-    \bbl at inidata
-    % 'Export' data
+    \bbl at read@ini at aux
+    % == 'Export' data ==
     \bbl at ini@exports{#2}%
     \global\bbl at csarg\let{inidata@\languagename}\bbl at inidata
     \global\let\bbl at inidata\@empty
@@ -2909,6 +2927,46 @@
     \bbl at exp{\\\bbl at add@list\\\bbl at ini@loaded{\languagename}}%
     \bbl at toglobal\bbl at ini@loaded
   \fi}
+\def\bbl at read@ini at aux{%
+  \let\bbl at savestrings\@empty
+  \let\bbl at savetoday\@empty
+  \let\bbl at savedate\@empty
+  \def\bbl at elt##1##2##3{%
+    \def\bbl at section{##1}%
+    \in@{=date.}{=##1}% Find a better place
+    \ifin@
+      \bbl at ini@calendar{##1}%
+    \fi
+    \bbl at ifunset{bbl at inikv@##1}{}%
+      {\csname bbl at inikv@##1\endcsname{##2}{##3}}}%
+  \bbl at inidata}
+\def\bbl at extend@ini at aux#1{%
+  \bbl at startcommands*{#1}{captions}%
+    % Activate captions/... and modify exports
+    \bbl at csarg\def{inikv at captions.licr}##1##2{%
+      \setlocalecaption{#1}{##1}{##2}}%
+    \def\bbl at inikv@captions##1##2{%
+      \bbl at ini@captions at aux{##1}{##2}}%
+    \def\bbl at stringdef##1##2{\gdef##1{##2}}%
+    \def\bbl at exportkey##1##2##3{%
+      \bbl at ifunset{bbl@@kv@##2}{}%
+        {\expandafter\ifx\csname bbl@@kv@##2\endcsname\@empty\else
+           \bbl at exp{\global\let\<bbl@##1@\languagename>\<bbl@@kv@##2>}%
+         \fi}}%
+    % As with \bbl at read@ini, but with some changes
+    \bbl at read@ini at aux
+    \bbl at ini@exports\tw@
+    % Update inidata at lang by pretending the ini is read.
+    \def\bbl at elt##1##2##3{%
+      \def\bbl at section{##1}%
+      \bbl at iniline##2=##3\bbl at iniline}%
+    \csname bbl at inidata@#1\endcsname
+    \global\bbl at csarg\let{inidata@#1}\bbl at inidata
+  \StartBabelCommands*{#1}{date}% And from the import stuff
+    \def\bbl at stringdef##1##2{\gdef##1{##2}}%
+    \bbl at savetoday
+    \bbl at savedate
+  \bbl at endcommands}
 \def\bbl at ini@calendar#1{%
  \lowercase{\def\bbl at tempa{=#1=}}%
  \bbl at replace\bbl at tempa{=date.gregorian}{}%
@@ -2932,7 +2990,7 @@
   \edef\bbl at tempb{\zap at space #2 \@empty}%   key
   \bbl at trim\toks@{#3}%                      value
   \bbl at exp{%
-    \global\let\<bbl at KVP@\bbl at tempa/\bbl at tempb>\\\@empty % just a flag
+    \edef\\\bbl at key@list{\bbl at key@list \bbl at tempa/\bbl at tempb;}%
     \\\g at addto@macro\\\bbl at inidata{%
        \\\bbl at elt{\bbl at tempa}{\bbl at tempb}{\the\toks@}}}}%
 \def\bbl at exportkey#1#2#3{%
@@ -2960,6 +3018,7 @@
   \or
     \bbl at iniwarning{.xelatex}%
   \fi%
+  \bbl at exportkey{llevel}{identification.load.level}{}%
   \bbl at exportkey{elname}{identification.name.english}{}%
   \bbl at exp{\\\bbl at exportkey{lname}{identification.name.opentype}%
     {\csname bbl at elname@\languagename\endcsname}}%
@@ -2985,9 +3044,9 @@
     \bbl at exportkey{hyotl}{typography.hyphenate.other.locale}{}%
     \bbl at exportkey{hyots}{typography.hyphenate.other.script}{}%
     \bbl at exportkey{intsp}{typography.intraspace}{}%
+    \bbl at exportkey{frspc}{typography.frenchspacing}{u}%
     \bbl at exportkey{chrng}{characters.ranges}{}%
     \bbl at exportkey{dgnat}{numbers.digits.native}{}%
-    \bbl at exportkey{frspc}{typography.frenchspacing}{u}%
     \ifnum#1=\tw@           % only (re)new
       \bbl at exportkey{rqtex}{identification.require.babel}{}%
       \bbl at toglobal\bbl at savetoday
@@ -3121,6 +3180,7 @@
       \bbl at replace\bbl at toreplace{[}{\csname the}%
       \bbl at replace\bbl at toreplace{]}{\endcsname{}}%
       \toks@\expandafter{\bbl at toreplace}%
+      % TODO. Execute only once:
       \bbl at exp{%
         \\\bbl at add\<extras\languagename>{%
           \\\babel at save\<labelenum\romannumeral\bbl at tempa>%
@@ -3207,9 +3267,7 @@
        \bbl at trim@def\bbl at toreplace{#5}%
        \bbl at TG@@date
        \bbl at ifunset{bbl at date@\languagename @}%
-         {\global\bbl at csarg\let{date@\languagename @}\bbl at toreplace
-         % TODO. Move to a better place.
-          \bbl at exp{%
+         {\bbl at exp{% TODO. Move to a better place.
             \gdef\<\languagename date>{\\\protect\<\languagename date >}%
             \gdef\<\languagename date >####1####2####3{%
               \\\bbl at usedategrouptrue
@@ -3220,6 +3278,7 @@
                 \<\languagename date>%
                    {\\\the\year}{\\\the\month}{\\\the\day}}}}}%
          {}%
+       \global\bbl at csarg\let{date@\languagename @}\bbl at toreplace
        \ifx\bbl at tempb\@empty\else
          \global\bbl at csarg\let{date@\languagename @\bbl at tempb}\bbl at toreplace
        \fi}%

Modified: trunk/Master/texmf-dist/tex/generic/babel/babel.sty
===================================================================
--- trunk/Master/texmf-dist/tex/generic/babel/babel.sty	2021-06-28 20:37:07 UTC (rev 59739)
+++ trunk/Master/texmf-dist/tex/generic/babel/babel.sty	2021-06-28 20:38:19 UTC (rev 59740)
@@ -12,6 +12,7 @@
 %%           any individual authors listed elsewhere in this file.
 %% All rights reserved.
 %%
+%%
 %% This file is part of the Babel system.
 %% --------------------------------------
 %%
@@ -26,7 +27,6 @@
 %% This work has the LPPL maintenance status "maintained".
 %%
 %% The Current Maintainer of this work is Javier Bezos.
-
 %%
 %% The list of derived (unpacked) files belonging to the distribution
 %% and covered by LPPL is defined by the unpacking scripts (with
@@ -34,7 +34,7 @@
 %%
 
 \NeedsTeXFormat{LaTeX2e}[2005/12/01]
-\ProvidesPackage{babel}[2021/06/02 3.60 The Babel package]
+\ProvidesPackage{babel}[2021/06/28 3.61 The Babel package]
 \@ifpackagewith{babel}{debug}
   {\providecommand\bbl at trace[1]{\message{^^J[ #1 ]}}%
    \let\bbl at debug\@firstofone
@@ -217,6 +217,16 @@
   \else
     \expandafter\@firstofone
   \fi}
+\def\bbl at extras@wrap#1#2#3{% 1:in-test, 2:before, 3:after
+  \toks@\expandafter\expandafter\expandafter{%
+    \csname extras\languagename\endcsname}%
+  \bbl at exp{\\\in@{#1}{\the\toks@}}%
+  \ifin@\else
+    \@temptokena{#2}%
+    \edef\bbl at tempc{\the\@temptokena\the\toks@}%
+    \toks@\expandafter{\bbl at tempc#3}%
+    \expandafter\edef\csname extras\languagename\endcsname{\the\toks@}%
+  \fi}
   % Temporarily repeat here the code for errors. TODO.
   \def\bbl at error#1#2{%
     \begingroup
@@ -326,7 +336,7 @@
   \ifx\@empty#2%
     \edef\bbl at tempc{\ifx\bbl at tempc\@empty\else\bbl at tempc,\fi#1}%
   \else
-    \in@{,provide,}{,#1,}%
+    \in@{,provide=}{,#1}%
     \ifin@
       \edef\bbl at tempc{%
         \ifx\bbl at tempc\@empty\else\bbl at tempc,\fi#1.\bbl at tempb#2}%
@@ -350,7 +360,6 @@
 \DeclareOption{noconfigs}{}
 \DeclareOption{showlanguages}{}
 \DeclareOption{silent}{}
-\DeclareOption{mono}{}
 \DeclareOption{shorthands=off}{\bbl at tempa shorthands=\bbl at tempa}
 \chardef\bbl at iniflag\z@
 \DeclareOption{provide=*}{\chardef\bbl at iniflag\@ne}    % main -> +1
@@ -387,6 +396,7 @@
 \let\bbl at opt@main\@nnil
 \let\bbl at opt@headfoot\@nnil
 \let\bbl at opt@layout\@nnil
+\let\bbl at opt@provide\@nnil
 \def\bbl at tempa#1=#2\bbl at tempa{%
   \bbl at csarg\ifx{opt@#1}\@nnil
     \bbl at csarg\edef{opt@#1}{#2}%
@@ -407,6 +417,12 @@
     \bbl at add@list\bbl at language@opts{\CurrentOption}%
   \fi}
 \ProcessOptions*
+\ifx\bbl at opt@provide\@nnil\else % Tests. Ignore.
+  \chardef\bbl at iniflag\@ne
+  \bbl at replace\bbl at opt@provide{;}{,}
+  \bbl at add\bbl at opt@provide{,import}
+  \show\bbl at opt@provide
+\fi
 \bbl at trace{Conditional loading of shorthands}
 \def\bbl at sh@string#1{%
   \ifx#1\@empty\else
@@ -995,18 +1011,6 @@
                        *}}%
         \@empty}}
 \fi
-\ifx\@unexpandable at protect\@undefined
-  \def\@unexpandable at protect{\noexpand\protect\noexpand}
-  \long\def\protected at write#1#2#3{%
-    \begingroup
-      \let\thepage\relax
-      #2%
-      \let\protect\@unexpandable at protect
-      \edef\reserved at a{\write#1{#3}}%
-      \reserved at a
-    \endgroup
-    \if at nobreak\ifvmode\nobreak\fi\fi}
-\fi
 \bbl at trace{Language options}
 \let\bbl at afterlang\relax
 \let\BabelModifiers\relax
@@ -1153,7 +1157,11 @@
   \ifodd\bbl at iniflag  % case 1,3
     \bbl at ldfinit
     \let\CurrentOption\bbl at opt@main
-    \bbl at exp{\\\babelprovide[import,main]{\bbl at opt@main}}
+    \ifx\bbl at opt@provide\@nnil
+      \bbl at exp{\\\babelprovide[import,main]{\bbl at opt@main}}
+    \else
+      \bbl at exp{\\\babelprovide[\bbl at opt@provide,main]{\bbl at opt@main}}%
+    \fi
     \bbl at afterldf{}%
   \else % case 0,2
     \chardef\bbl at iniflag\z@  % Force ldf

Modified: trunk/Master/texmf-dist/tex/generic/babel/blplain.tex
===================================================================
--- trunk/Master/texmf-dist/tex/generic/babel/blplain.tex	2021-06-28 20:37:07 UTC (rev 59739)
+++ trunk/Master/texmf-dist/tex/generic/babel/blplain.tex	2021-06-28 20:38:19 UTC (rev 59740)
@@ -12,6 +12,7 @@
 %%           any individual authors listed elsewhere in this file.
 %% All rights reserved.
 %%
+%%
 %% This file is part of the Babel system.
 %% --------------------------------------
 %%
@@ -26,7 +27,6 @@
 %% This work has the LPPL maintenance status "maintained".
 %%
 %% The Current Maintainer of this work is Javier Bezos.
-
 %%
 %% The list of derived (unpacked) files belonging to the distribution
 %% and covered by LPPL is defined by the unpacking scripts (with

Modified: trunk/Master/texmf-dist/tex/generic/babel/bplain.tex
===================================================================
--- trunk/Master/texmf-dist/tex/generic/babel/bplain.tex	2021-06-28 20:37:07 UTC (rev 59739)
+++ trunk/Master/texmf-dist/tex/generic/babel/bplain.tex	2021-06-28 20:38:19 UTC (rev 59740)
@@ -12,6 +12,7 @@
 %%           any individual authors listed elsewhere in this file.
 %% All rights reserved.
 %%
+%%
 %% This file is part of the Babel system.
 %% --------------------------------------
 %%
@@ -26,7 +27,6 @@
 %% This work has the LPPL maintenance status "maintained".
 %%
 %% The Current Maintainer of this work is Javier Bezos.
-
 %%
 %% The list of derived (unpacked) files belonging to the distribution
 %% and covered by LPPL is defined by the unpacking scripts (with

Modified: trunk/Master/texmf-dist/tex/generic/babel/hyphen.cfg
===================================================================
--- trunk/Master/texmf-dist/tex/generic/babel/hyphen.cfg	2021-06-28 20:37:07 UTC (rev 59739)
+++ trunk/Master/texmf-dist/tex/generic/babel/hyphen.cfg	2021-06-28 20:38:19 UTC (rev 59740)
@@ -12,6 +12,7 @@
 %%           any individual authors listed elsewhere in this file.
 %% All rights reserved.
 %%
+%%
 %% This file is part of the Babel system.
 %% --------------------------------------
 %%
@@ -26,7 +27,6 @@
 %% This work has the LPPL maintenance status "maintained".
 %%
 %% The Current Maintainer of this work is Javier Bezos.
-
 %%
 %% The list of derived (unpacked) files belonging to the distribution
 %% and covered by LPPL is defined by the unpacking scripts (with
@@ -38,10 +38,10 @@
     \wlog{File: #1 #4 #3 <#2>}%
     \let\ProvidesFile\@undefined}
 \fi
-\ProvidesFile{hyphen.cfg}[2021/06/02 3.60 Babel hyphens]
+\ProvidesFile{hyphen.cfg}[2021/06/28 3.61 Babel hyphens]
 \xdef\bbl at format{\jobname}
-\def\bbl at version{3.60}
-\def\bbl at date{2021/06/02}
+\def\bbl at version{3.61}
+\def\bbl at date{2021/06/28}
 \ifx\AtBeginDocument\@undefined
   \def\@empty{}
   \let\orig at dump\dump

Modified: trunk/Master/texmf-dist/tex/generic/babel/locale/ar/babel-ar-DZ.ini
===================================================================
--- trunk/Master/texmf-dist/tex/generic/babel/locale/ar/babel-ar-DZ.ini	2021-06-28 20:37:07 UTC (rev 59739)
+++ trunk/Master/texmf-dist/tex/generic/babel/locale/ar/babel-ar-DZ.ini	2021-06-28 20:38:19 UTC (rev 59740)
@@ -11,8 +11,8 @@
 
 [identification]
 charset = utf8
-version = 1.8
-date = 2021-05-31
+version = 1.9
+date = 2021-06-25
 name.local = العربية
 name.english = Arabic
 name.babel = arabic-algeria arabic-dz
@@ -179,8 +179,7 @@
 maghrebi.abjad = ا ب ج د ه‍ و ز ح ط ي ك ل م ن ص ع ف ض ق ر س ت ث خ ذ ظ غ ش
 
 [transforms.prehyphenation]
-kashida.plain.1.0 ={
-()[يئهشسقفغعضصنمكلظطخحجثتب]()[ًٍَُِّ]*[يئهشسقفغعضصنمكلظطخحجثتباأإآوؤذدزرة] }
+kashida.plain.1.0 = { ()[يئهشسقفغعضصنمكلظطخحجثتب]()[ًٍَُِّ]*[يئهشسقفغعضصنمكلظطخحجثتباأإآوؤذدزرة] }
 kashida.plain.1.1 = { kashida = 500 }
 kashida.plain.2.0 = { ()ل()[اأإآ] }
 kashida.plain.2.1 = { kashida = 0 }

Modified: trunk/Master/texmf-dist/tex/generic/babel/locale/ar/babel-ar-MA.ini
===================================================================
--- trunk/Master/texmf-dist/tex/generic/babel/locale/ar/babel-ar-MA.ini	2021-06-28 20:37:07 UTC (rev 59739)
+++ trunk/Master/texmf-dist/tex/generic/babel/locale/ar/babel-ar-MA.ini	2021-06-28 20:38:19 UTC (rev 59740)
@@ -11,8 +11,8 @@
 
 [identification]
 charset = utf8
-version = 1.8
-date = 2021-05-31
+version = 1.9
+date = 2021-06-25
 name.local = العربية
 name.english = Arabic
 name.babel = arabic-morocco arabic-ma
@@ -179,8 +179,7 @@
 maghrebi.abjad = ا ب ج د ه‍ و ز ح ط ي ك ل م ن ص ع ف ض ق ر س ت ث خ ذ ظ غ ش
 
 [transforms.prehyphenation]
-kashida.plain.1.0 ={
-()[يئهشسقفغعضصنمكلظطخحجثتب]()[ًٍَُِّ]*[يئهشسقفغعضصنمكلظطخحجثتباأإآوؤذدزرة] }
+kashida.plain.1.0 = { ()[يئهشسقفغعضصنمكلظطخحجثتب]()[ًٍَُِّ]*[يئهشسقفغعضصنمكلظطخحجثتباأإآوؤذدزرة] }
 kashida.plain.1.1 = { kashida = 500 }
 kashida.plain.2.0 = { ()ل()[اأإآ] }
 kashida.plain.2.1 = { kashida = 0 }

Modified: trunk/Master/texmf-dist/tex/generic/babel/locale/ar/babel-ar-SY.ini
===================================================================
--- trunk/Master/texmf-dist/tex/generic/babel/locale/ar/babel-ar-SY.ini	2021-06-28 20:37:07 UTC (rev 59739)
+++ trunk/Master/texmf-dist/tex/generic/babel/locale/ar/babel-ar-SY.ini	2021-06-28 20:38:19 UTC (rev 59740)
@@ -11,8 +11,8 @@
 
 [identification]
 charset = utf8
-version = 1.8
-date = 2021-05-31
+version = 1.9
+date = 2021-06-25
 name.local = العربية
 name.english = Arabic
 name.babel = arabic-syria arabic-sy
@@ -178,8 +178,7 @@
 maghrebi.abjad = ا ب ج د ه‍ و ز ح ط ي ك ل م ن ص ع ف ض ق ر س ت ث خ ذ ظ غ ش
 
 [transforms.prehyphenation]
-kashida.plain.1.0 ={
-()[يئهشسقفغعضصنمكلظطخحجثتب]()[ًٍَُِّ]*[يئهشسقفغعضصنمكلظطخحجثتباأإآوؤذدزرة] }
+kashida.plain.1.0 = { ()[يئهشسقفغعضصنمكلظطخحجثتب]()[ًٍَُِّ]*[يئهشسقفغعضصنمكلظطخحجثتباأإآوؤذدزرة] }
 kashida.plain.1.1 = { kashida = 500 }
 kashida.plain.2.0 = { ()ل()[اأإآ] }
 kashida.plain.2.1 = { kashida = 0 }

Modified: trunk/Master/texmf-dist/tex/generic/babel/locale/ar/babel-ar.ini
===================================================================
--- trunk/Master/texmf-dist/tex/generic/babel/locale/ar/babel-ar.ini	2021-06-28 20:37:07 UTC (rev 59739)
+++ trunk/Master/texmf-dist/tex/generic/babel/locale/ar/babel-ar.ini	2021-06-28 20:38:19 UTC (rev 59740)
@@ -11,8 +11,8 @@
 
 [identification]
 charset = utf8
-version = 1.11
-date = 2021-05-31
+version = 1.12
+date = 2021-06-25
 name.local = العربية
 name.english = Arabic
 name.babel = arabic
@@ -24,9 +24,8 @@
 script.tag.bcp47 = Arab
 script.tag.opentype = arab
 level = 1
-encodings = 
+encodings = LAE
 derivate = no
-require.babel = arabic
 
 [captions]
 preface = مدخل
@@ -208,8 +207,7 @@
 transliteration.dad.8.0 = { ([{007C}AbtjHxdrzsSDTZ`RfqklmnhUIYaui+opCvgJe]) }
 transliteration.dad.8.1 =   { string = {1|{007C}AbtjHxdrzsSDTZ`RfqklmnhUIYaui+opCvgJe|ءابتجحخدرزسصضطظعغفقكلمنهوىيَُِّْپچڤگژۀ} }
 ; 
-kashida.plain.1.0 ={
-()[يئهشسقفغعضصنمكلظطخحجثتب]()[ًٍَُِّ]*[يئهشسقفغعضصنمكلظطخحجثتباأإآوؤذدزرة] }
+kashida.plain.1.0 = { ()[يئهشسقفغعضصنمكلظطخحجثتب]()[ًٍَُِّ]*[يئهشسقفغعضصنمكلظطخحجثتباأإآوؤذدزرة] }
 kashida.plain.1.1 = { kashida = 500 }
 kashida.plain.2.0 = { ()ل()[اأإآ] }
 kashida.plain.2.1 = { kashida = 0 }

Modified: trunk/Master/texmf-dist/tex/generic/babel/locale/as/babel-as.ini
===================================================================
--- trunk/Master/texmf-dist/tex/generic/babel/locale/as/babel-as.ini	2021-06-28 20:37:07 UTC (rev 59739)
+++ trunk/Master/texmf-dist/tex/generic/babel/locale/as/babel-as.ini	2021-06-28 20:38:19 UTC (rev 59740)
@@ -12,8 +12,8 @@
 
 [identification]
 charset = utf8
-version = 1.8
-date = 2020-10-11
+version = 1.9
+date = 2021-06-25
 name.local = অসমীয়া
 name.english = Assamese
 name.babel = assamese
@@ -147,4 +147,10 @@
 plusSign = +
 superscriptingExponent = ×
 
-[counters]
\ No newline at end of file
+[counters]
+
+[transforms.prehyphenation]
+danda.nobreak.1.0 = { |[।॥] }
+danda.nobreak.1.1 = { insert, penalty=10000 }
+danda.nobreak.1.2 = {}
+danda.nobreak.1.3 = {}
\ No newline at end of file

Modified: trunk/Master/texmf-dist/tex/generic/babel/locale/bn/babel-bn.ini
===================================================================
--- trunk/Master/texmf-dist/tex/generic/babel/locale/bn/babel-bn.ini	2021-06-28 20:37:07 UTC (rev 59739)
+++ trunk/Master/texmf-dist/tex/generic/babel/locale/bn/babel-bn.ini	2021-06-28 20:38:19 UTC (rev 59740)
@@ -11,8 +11,8 @@
 
 [identification]
 charset = utf8
-version = 1.8
-date = 2020-10-11
+version = 1.9
+date = 2021-06-25
 name.local = বাংলা
 name.english = Bangla
 name.babel = bengali
@@ -149,4 +149,10 @@
 superscriptingExponent = ×
 
 [counters]
-alphabetic = ক খ গ ঘ ঙ চ ছ জ ঝ ঞ ট ঠ ড ঢ ণ ত থ দ ধ ন প ফ ব ভ
\ No newline at end of file
+alphabetic = ক খ গ ঘ ঙ চ ছ জ ঝ ঞ ট ঠ ড ঢ ণ ত থ দ ধ ন প ফ ব ভ
+
+[transforms.prehyphenation]
+danda.nobreak.1.0 = { |[।॥] }
+danda.nobreak.1.1 = { insert, penalty=10000 }
+danda.nobreak.1.2 = {}
+danda.nobreak.1.3 = {}

Modified: trunk/Master/texmf-dist/tex/generic/babel/locale/gu/babel-gu.ini
===================================================================
--- trunk/Master/texmf-dist/tex/generic/babel/locale/gu/babel-gu.ini	2021-06-28 20:37:07 UTC (rev 59739)
+++ trunk/Master/texmf-dist/tex/generic/babel/locale/gu/babel-gu.ini	2021-06-28 20:38:19 UTC (rev 59740)
@@ -11,8 +11,8 @@
 
 [identification]
 charset = utf8
-version = 1.7
-date = 2020-10-11
+version = 1.8
+date = 2021-06-25
 name.local = ગુજરાતી
 name.english = Gujarati
 name.babel = gujarati
@@ -171,3 +171,9 @@
 superscriptingExponent = ×
 
 [counters]
+
+[transforms.prehyphenation]
+danda.nobreak.1.0 = { |[।॥] }
+danda.nobreak.1.1 = { insert, penalty=10000 }
+danda.nobreak.1.2 = {}
+danda.nobreak.1.3 = {}

Modified: trunk/Master/texmf-dist/tex/generic/babel/locale/hi/babel-hi.ini
===================================================================
--- trunk/Master/texmf-dist/tex/generic/babel/locale/hi/babel-hi.ini	2021-06-28 20:37:07 UTC (rev 59739)
+++ trunk/Master/texmf-dist/tex/generic/babel/locale/hi/babel-hi.ini	2021-06-28 20:38:19 UTC (rev 59740)
@@ -12,8 +12,8 @@
 
 [identification]
 charset = utf8
-version = 1.10
-date = 2021-04-24
+version = 1.11
+date = 2021-06-25
 name.local = हिन्दी
 name.english = Hindi
 name.babel = hindi
@@ -203,6 +203,11 @@
 alphabetic = क ख ग घ ङ च छ ज झ ञ ट ठ ड ढ ण त थ द ध न प फ ब भ म य र ल व श ष स ह
 
 [transforms.prehyphenation]
+danda.nobreak.1.0 = { |[।॥] }
+danda.nobreak.1.1 = { insert, penalty=10000 }
+danda.nobreak.1.2 = {}
+danda.nobreak.1.3 = {}
+;
 punctuation.space.1.0 = { {a}()|[:;!{?}]() }
 punctuation.space.1.1 = { insert, penalty = 10000 }
 punctuation.space.1.2 = { spacefactor= .8 .3 .8, data = 2 }

Modified: trunk/Master/texmf-dist/tex/generic/babel/locale/kn/babel-kn.ini
===================================================================
--- trunk/Master/texmf-dist/tex/generic/babel/locale/kn/babel-kn.ini	2021-06-28 20:37:07 UTC (rev 59739)
+++ trunk/Master/texmf-dist/tex/generic/babel/locale/kn/babel-kn.ini	2021-06-28 20:38:19 UTC (rev 59740)
@@ -11,8 +11,8 @@
 
 [identification]
 charset = utf8
-version = 1.7
-date = 2020-10-11
+version = 1.8
+date = 2021-06-25
 name.local = ಕನ್ನಡ
 name.english = Kannada
 name.babel = kannada
@@ -154,3 +154,9 @@
 superscriptingExponent = ×
 
 [counters]
+
+[transforms.prehyphenation]
+danda.nobreak.1.0 = { |[।॥] }
+danda.nobreak.1.1 = { insert, penalty=10000 }
+danda.nobreak.1.2 = {}
+danda.nobreak.1.3 = {}
\ No newline at end of file

Modified: trunk/Master/texmf-dist/tex/generic/babel/locale/ml/babel-ml.ini
===================================================================
--- trunk/Master/texmf-dist/tex/generic/babel/locale/ml/babel-ml.ini	2021-06-28 20:37:07 UTC (rev 59739)
+++ trunk/Master/texmf-dist/tex/generic/babel/locale/ml/babel-ml.ini	2021-06-28 20:38:19 UTC (rev 59740)
@@ -11,8 +11,8 @@
 
 [identification]
 charset = utf8
-version = 1.7
-date = 2021-04-24
+version = 1.8
+date = 2021-06-25
 name.local = മലയാളം
 name.english = Malayalam
 name.babel = malayalam
@@ -160,3 +160,9 @@
 superscriptingExponent = ×
 
 [counters]
+
+[transforms.prehyphenation]
+danda.nobreak.1.0 = { |[।॥] }
+danda.nobreak.1.1 = { insert, penalty=10000 }
+danda.nobreak.1.2 = {}
+danda.nobreak.1.3 = {}
\ No newline at end of file

Modified: trunk/Master/texmf-dist/tex/generic/babel/locale/mr/babel-mr.ini
===================================================================
--- trunk/Master/texmf-dist/tex/generic/babel/locale/mr/babel-mr.ini	2021-06-28 20:37:07 UTC (rev 59739)
+++ trunk/Master/texmf-dist/tex/generic/babel/locale/mr/babel-mr.ini	2021-06-28 20:38:19 UTC (rev 59740)
@@ -13,8 +13,8 @@
 
 [identification]
 charset = utf8
-version = 1.10
-date = 2021-04-05
+version = 1.11
+date = 2021-06-25
 name.local = मराठी
 name.english = Marathi
 name.babel = marathi
@@ -151,4 +151,10 @@
 superscriptingExponent = ×
 
 [counters]
-alphabetic = क ख ग घ ङ च छ ज झ ञ ट ठ ड ढ ण त थ द ध न प फ ब भ म य र ल व श ष स ह ळ
\ No newline at end of file
+alphabetic = क ख ग घ ङ च छ ज झ ञ ट ठ ड ढ ण त थ द ध न प फ ब भ म य र ल व श ष स ह ळ
+
+[transforms.prehyphenation]
+danda.nobreak.1.0 = { |[।॥] }
+danda.nobreak.1.1 = { insert, penalty=10000 }
+danda.nobreak.1.2 = {}
+danda.nobreak.1.3 = {}

Modified: trunk/Master/texmf-dist/tex/generic/babel/locale/or/babel-or.ini
===================================================================
--- trunk/Master/texmf-dist/tex/generic/babel/locale/or/babel-or.ini	2021-06-28 20:37:07 UTC (rev 59739)
+++ trunk/Master/texmf-dist/tex/generic/babel/locale/or/babel-or.ini	2021-06-28 20:38:19 UTC (rev 59740)
@@ -11,8 +11,8 @@
 
 [identification]
 charset = utf8
-version = 1.7
-date = 2020-10-11
+version = 1.8
+date = 2021-06-25
 name.local = ଓଡ଼ିଆ
 name.english = Odia
 name.babel = oriya
@@ -171,3 +171,9 @@
 superscriptingExponent = ×
 
 [counters]
+
+[transforms.prehyphenation]
+danda.nobreak.1.0 = { |[।॥] }
+danda.nobreak.1.1 = { insert, penalty=10000 }
+danda.nobreak.1.2 = {}
+danda.nobreak.1.3 = {}
\ No newline at end of file

Modified: trunk/Master/texmf-dist/tex/generic/babel/locale/ta/babel-ta.ini
===================================================================
--- trunk/Master/texmf-dist/tex/generic/babel/locale/ta/babel-ta.ini	2021-06-28 20:37:07 UTC (rev 59739)
+++ trunk/Master/texmf-dist/tex/generic/babel/locale/ta/babel-ta.ini	2021-06-28 20:38:19 UTC (rev 59740)
@@ -11,8 +11,8 @@
 
 [identification]
 charset = utf8
-version = 1.8
-date = 2020-10-11
+version = 1.9
+date = 2021-06-25
 name.local = தமிழ்
 name.english = Tamil
 name.babel = tamil
@@ -177,4 +177,11 @@
 ancient.3 = ௱ ௨௱ ௩௱ ௪௱ ௫௱ ௬௱ ௭௱ ௮௱ ௯௱
 ancient.4 = ௲ ௨௲ ௩௲ ௪௲ ௫௲ ௬௲ ௭௲ ௮௲ ௯௲
 
+[transforms.prehyphenation]
+danda.nobreak.1.0 = { |[।॥] }
+danda.nobreak.1.1 = { insert, penalty=10000 }
+danda.nobreak.1.2 = {}
+danda.nobreak.1.3 = {}
 
+
+

Modified: trunk/Master/texmf-dist/tex/generic/babel/locale/te/babel-te.ini
===================================================================
--- trunk/Master/texmf-dist/tex/generic/babel/locale/te/babel-te.ini	2021-06-28 20:37:07 UTC (rev 59739)
+++ trunk/Master/texmf-dist/tex/generic/babel/locale/te/babel-te.ini	2021-06-28 20:38:19 UTC (rev 59740)
@@ -11,8 +11,8 @@
 
 [identification]
 charset = utf8
-version = 1.7
-date = 2020-10-11
+version = 1.8
+date = 2021-06-25
 name.local = తెలుగు
 name.english = Telugu
 name.babel = telugu
@@ -149,3 +149,9 @@
 superscriptingExponent = ×
 
 [counters]
+
+[transforms.prehyphenation]
+danda.nobreak.1.0 = { |[।॥] }
+danda.nobreak.1.1 = { insert, penalty=10000 }
+danda.nobreak.1.2 = {}
+danda.nobreak.1.3 = {}
\ 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	2021-06-28 20:37:07 UTC (rev 59739)
+++ trunk/Master/texmf-dist/tex/generic/babel/luababel.def	2021-06-28 20:38:19 UTC (rev 59740)
@@ -12,6 +12,7 @@
 %%           any individual authors listed elsewhere in this file.
 %% All rights reserved.
 %%
+%%
 %% This file is part of the Babel system.
 %% --------------------------------------
 %%
@@ -26,7 +27,6 @@
 %% This work has the LPPL maintenance status "maintained".
 %%
 %% The Current Maintainer of this work is Javier Bezos.
-
 %%
 %% The list of derived (unpacked) files belonging to the distribution
 %% and covered by LPPL is defined by the unpacking scripts (with
@@ -558,6 +558,8 @@
     Babel.arabic.elong_map[\the\localeid]   = {}
     luatexbase.add_to_callback('post_linebreak_filter',
       Babel.arabic.justify, 'Babel.arabic.justify')
+    luatexbase.add_to_callback('hpack_filter',
+      Babel.arabic.justify_hbox, 'Babel.arabic.justify_hbox')
   }}%
 \def\bblar at fetchjalt#1#2#3#4{%
   \bbl at exp{\\\bbl at foreach{#1}}{%
@@ -629,8 +631,14 @@
 end
 
 function Babel.arabic.justify_hbox(head, gc, size, pack)
+  local has_inf = false
   if Babel.arabic.justify_enabled and pack == 'exactly' then
-    Babel.arabic.justify_hlist(head, nil, gc, size, pack)
+    for n in node.traverse_id(12, head) do
+      if n.stretch_order > 0 then has_inf = true end
+    end
+    if not has_inf then
+      Babel.arabic.justify_hlist(head, nil, gc, size, pack)
+    end
   end
   return head
 end

Modified: trunk/Master/texmf-dist/tex/generic/babel/nil.ldf
===================================================================
--- trunk/Master/texmf-dist/tex/generic/babel/nil.ldf	2021-06-28 20:37:07 UTC (rev 59739)
+++ trunk/Master/texmf-dist/tex/generic/babel/nil.ldf	2021-06-28 20:38:19 UTC (rev 59740)
@@ -12,6 +12,7 @@
 %%           any individual authors listed elsewhere in this file.
 %% All rights reserved.
 %%
+%%
 %% This file is part of the Babel system.
 %% --------------------------------------
 %%
@@ -26,7 +27,6 @@
 %% This work has the LPPL maintenance status "maintained".
 %%
 %% The Current Maintainer of this work is Javier Bezos.
-
 %%
 %% The list of derived (unpacked) files belonging to the distribution
 %% and covered by LPPL is defined by the unpacking scripts (with
@@ -33,7 +33,7 @@
 %% extension |.ins|) which are part of the distribution.
 %%
 
-\ProvidesLanguage{nil}[2021/06/02 3.60 Nil language]
+\ProvidesLanguage{nil}[2021/06/28 3.61 Nil language]
 \LdfInit{nil}{datenil}
 \ifx\l at nil\@undefined
   \newlanguage\l at nil

Modified: trunk/Master/texmf-dist/tex/generic/babel/plain.def
===================================================================
--- trunk/Master/texmf-dist/tex/generic/babel/plain.def	2021-06-28 20:37:07 UTC (rev 59739)
+++ trunk/Master/texmf-dist/tex/generic/babel/plain.def	2021-06-28 20:38:19 UTC (rev 59740)
@@ -12,6 +12,7 @@
 %%           any individual authors listed elsewhere in this file.
 %% All rights reserved.
 %%
+%%
 %% This file is part of the Babel system.
 %% --------------------------------------
 %%
@@ -26,7 +27,6 @@
 %% This work has the LPPL maintenance status "maintained".
 %%
 %% The Current Maintainer of this work is Javier Bezos.
-
 %%
 %% The list of derived (unpacked) files belonging to the distribution
 %% and covered by LPPL is defined by the unpacking scripts (with

Modified: trunk/Master/texmf-dist/tex/generic/babel/switch.def
===================================================================
--- trunk/Master/texmf-dist/tex/generic/babel/switch.def	2021-06-28 20:37:07 UTC (rev 59739)
+++ trunk/Master/texmf-dist/tex/generic/babel/switch.def	2021-06-28 20:38:19 UTC (rev 59740)
@@ -12,6 +12,7 @@
 %%           any individual authors listed elsewhere in this file.
 %% All rights reserved.
 %%
+%%
 %% This file is part of the Babel system.
 %% --------------------------------------
 %%
@@ -26,7 +27,6 @@
 %% This work has the LPPL maintenance status "maintained".
 %%
 %% The Current Maintainer of this work is Javier Bezos.
-
 %%
 %% The list of derived (unpacked) files belonging to the distribution
 %% and covered by LPPL is defined by the unpacking scripts (with

Modified: trunk/Master/texmf-dist/tex/generic/babel/txtbabel.def
===================================================================
--- trunk/Master/texmf-dist/tex/generic/babel/txtbabel.def	2021-06-28 20:37:07 UTC (rev 59739)
+++ trunk/Master/texmf-dist/tex/generic/babel/txtbabel.def	2021-06-28 20:38:19 UTC (rev 59740)
@@ -12,6 +12,7 @@
 %%           any individual authors listed elsewhere in this file.
 %% All rights reserved.
 %%
+%%
 %% This file is part of the Babel system.
 %% --------------------------------------
 %%
@@ -26,7 +27,6 @@
 %% This work has the LPPL maintenance status "maintained".
 %%
 %% The Current Maintainer of this work is Javier Bezos.
-
 %%
 %% The list of derived (unpacked) files belonging to the distribution
 %% and covered by LPPL is defined by the unpacking scripts (with

Modified: trunk/Master/texmf-dist/tex/generic/babel/xebabel.def
===================================================================
--- trunk/Master/texmf-dist/tex/generic/babel/xebabel.def	2021-06-28 20:37:07 UTC (rev 59739)
+++ trunk/Master/texmf-dist/tex/generic/babel/xebabel.def	2021-06-28 20:38:19 UTC (rev 59740)
@@ -12,6 +12,7 @@
 %%           any individual authors listed elsewhere in this file.
 %% All rights reserved.
 %%
+%%
 %% This file is part of the Babel system.
 %% --------------------------------------
 %%
@@ -26,7 +27,6 @@
 %% This work has the LPPL maintenance status "maintained".
 %%
 %% The Current Maintainer of this work is Javier Bezos.
-
 %%
 %% The list of derived (unpacked) files belonging to the distribution
 %% and covered by LPPL is defined by the unpacking scripts (with
@@ -73,6 +73,7 @@
         \expandafter\bbl at intrapenalty\bbl at KVP@intrapenalty\@@
       \fi
       \bbl at exp{%
+        % TODO. Execute only once (but redundant):
         \\\bbl at add\<extras\languagename>{%
           \XeTeXlinebreaklocale "\bbl at cl{tbcp}"%
           \<bbl at xeisp@\languagename>%



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