texlive[75053] Master/texmf-dist: babel (29apr25)

commits+karl at tug.org commits+karl at tug.org
Tue Apr 29 21:45:17 CEST 2025


Revision: 75053
          https://tug.org/svn/texlive?view=revision&revision=75053
Author:   karl
Date:     2025-04-29 21:45:16 +0200 (Tue, 29 Apr 2025)
Log Message:
-----------
babel (29apr25)

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/shared/babel-Hebr.ini
    trunk/Master/texmf-dist/tex/generic/babel/nil.ldf
    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	2025-04-29 17:38:33 UTC (rev 75052)
+++ trunk/Master/texmf-dist/doc/latex/babel/README.md	2025-04-29 19:45:16 UTC (rev 75053)
@@ -1,6 +1,6 @@
-## Babel 25.7
+## Babel 25.8
 
-2025-04-14
+2025-04-29
 
 `Babel` is the multilingual framework to localize documents. It fully
 supports pdfLaTeX and the Unicode engines LuaLaTeX and XeLaTeX. A few
@@ -21,9 +21,9 @@
 
 The latest stable version is available on <https://ctan.org/pkg/babel>.
 
-Changes in version 25.7 are described in:
+Changes in version 25.8 are described in:
 
-https://latex3.github.io/babel/news/whats-new-in-babel-25.7.html
+https://latex3.github.io/babel/news/whats-new-in-babel-25.8.html
 
 Apart from the manual, you can find information and examples in:
 
@@ -59,13 +59,11 @@
 
 ### Summary of latest changes
 ```
-25.7   2025-04-14
-       * New macro: \ShowBabelTransforms.
-       * Fixes:
-       - Incorrect kashida placement (#336).
-       - Ancient Hebrew vowel characters not recognised as Hebrew text (#337).
-       - babel-cy.ini captions and captions.licr inconsistent (#338).
-       * New locale: ancienthebrew.
+25.8   2025-04-29
+       * The document 'lang' metadata, if provided, is used to set the
+         main language. This is a potentially breaking change. See the
+         news page for further info.
+       * Hebrew justification with inter-letter spacing.
 ```
 
 ### 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	2025-04-29 17:38:33 UTC (rev 75052)
+++ trunk/Master/texmf-dist/source/latex/babel/babel.dtx	2025-04-29 19:45:16 UTC (rev 75053)
@@ -37,7 +37,7 @@
   lang       = en-001,
 }
 \ProvidesFile{babel.dtx}%
-  [2025/04/14 v25.7
+  [2025/04/29 v25.8
    The multilingual framework for pdfLaTeX, LuaLaTeX and XeLaTeX] 
 \documentclass{ltxdoc}
 \GetFileInfo{babel.dtx}
@@ -428,6 +428,27 @@
 \textsf{fontspec}, although \babel{} provides a higher level interface
 (see |\babelfont| below). 
 
+\New{25.8} The PDF document language can also be set with
+|\DocumentMetadata| before |\documentclass|. See the liked news page
+for further info. For example, the following setting will pass
+\texttt{british} as the main language to \babel:
+\begin{verbatim}
+\DocumentMetadata{_lang=en-GB_}
+\documentclass{article}
+\usepackage{babel}
+\end{verbatim}
+The basic tag lookup explained below is applied here, so that
+\texttt{fr-Latn-FR} is valid and mapped to \texttt{fr}, which is in
+turn mapped to \texttt{french}. This eases the localization of
+automatically generated documents.
+
+\begin{warning}
+  This is a \textbf{breaking change}, because until now with this
+  example the dummy language \texttt{nil} was loaded. Tags are not
+  validated, which means mistakes like |en-UK| or wrong tags like
+  |de-AUS| or |la-x-classical| might be accepted without complaining.
+\end{warning}
+
 \begin{example}
   Here is a simple full example for “traditional” \TeX{} engines (see
   below for \luatex{} and \xetex{}). The package |fontenc| does not
@@ -513,14 +534,11 @@
 \begin{verbatim}
 \usepackage[_pdflang=es-MX_]{hyperref}
 \end{verbatim}
-This is not currently done by \babel{} and you must set it by hand. The
-PDF document language can also be set with |\DocumentMetadata|, before
-|\documentclass|; for example:
-\begin{verbatim}
-\DocumentMetadata{_lang=es-MX_}
-\end{verbatim}
+This is not currently done by \babel{} and you must set it by hand.
 \end{note}
 
+
+
 \begin{warning}
   In the preamble, \textit{no} language has been selected, except
   hyphenation patterns and the name assigned to |\localename| (and
@@ -4329,10 +4347,17 @@
 does it. To prevent the conversion (an abbreviation, for example), write
 |"s|.}
 
-\trans{Hebrew, Yiddish}{transliteration.cj}{A transliteration system
-based on that devised by Christian Justen for `cjhebrew`. Final letters
-are not converted, and the furtive patah is not shifted.}
+\trans{Hebrew, Yiddish, Ladino, Ancient Hebrew}{transliteration.cj}{A
+transliteration system based on that devised by Christian Justen for
+`cjhebrew`. Final letters are not converted, and the furtive patah is
+not shifted.}
 
+\trans{Hebrew, Yiddish, Ladino, Ancient
+Hebrew}{justification.interletter}{justification.interletter}{Hebrew
+justification is based on variations in the spacing between individual
+letters within words. This transform activates this justification
+method. See \New{25.8} for further details and an example.}
+
 \trans{Hindi, Sanskrit}{punctuation.space}{Inserts a space before the
 following four characters: \textit{!?:;}\,.}
 
@@ -6081,8 +6106,8 @@
 % \section{Tools}
 %
 %    \begin{macrocode}
-%<<version=25.7>>
-%<<date=2025/04/14>>
+%<<version=25.8>>
+%<<date=2025/04/29>>
 %    \end{macrocode}
 %
 % \textbf{Do not use the following macros in \texttt{ldf} files. They
@@ -7163,13 +7188,13 @@
 %
 %    \begin{macrocode}
 \chardef\localeid\z@
-\def\bbl at id@last{0}    % No real need for a new counter
+\gdef\bbl at id@last{0}    % No real need for a new counter
 \def\bbl at id@assign{%
   \bbl at ifunset{bbl at id@@\languagename}%
     {\count@\bbl at id@last\relax
      \advance\count@\@ne
      \global\bbl at csarg\chardef{id@@\languagename}\count@
-     \edef\bbl at id@last{\the\count@}%
+     \xdef\bbl at id@last{\the\count@}%
      \ifcase\bbl at engine\or
        \directlua{
          Babel.locale_props[\bbl at id@last] = {}
@@ -7298,8 +7323,6 @@
 \newif\ifbbl at usedategroup
 \let\bbl at savedextras\@empty
 \def\bbl at switch#1{%  from select@, foreign@
-  % make sure there is info for the language if so requested
-  \bbl at ensureinfo{#1}%
   % restore
   \originalTeX
   \expandafter\def\expandafter\originalTeX\expandafter{%
@@ -8016,7 +8039,7 @@
 %
 % At the start of processing a language definition file we always
 % check the category code of the at-sign. We make sure that it is
-% a `letter' during the processing of the file. We also save its
+% a ‘letter’ during the processing of the file. We also save its
 % name as the last called option, even if not loaded.
 %
 % Another character that needs to have the correct category code
@@ -8057,6 +8080,15 @@
   \catcode`\@=11\relax
   \chardef\eqcatcode=\catcode`\=
   \catcode`\==12\relax
+  \@ifpackagewith{babel}{ensureinfo=off}{}%
+    {\ifx\InputIfFileExists\@undefined\else
+       \bbl at ifunset{bbl at lname@#1}%
+         {{\let\bbl at ensuring\@empty % Flag used in babel-serbianc.tex
+          \def\languagename{#1}%
+          \bbl at id@assign
+          \bbl at load@info{#1}}}%
+        {}%
+     \fi}%
   \expandafter\if\expandafter\@backslashchar
                  \expandafter\@car\string#2\@nil
     \ifx#2\@undefined\else
@@ -8072,6 +8104,8 @@
 %
 % \macro{\ldf at quit}
 % This macro interrupts the processing of a language definition file.
+% Remember |\endinput| is not executed immediately, but delayed to
+% the end of the current line in the input file.
 %
 %    \begin{macrocode}
 \def\ldf at quit#1{%
@@ -8091,7 +8125,7 @@
 % code of the @-sign.
 %
 %    \begin{macrocode}
-\def\bbl at afterldf#1{%
+\def\bbl at afterldf{%
   \bbl at afterlang
   \let\bbl at afterlang\relax
   \let\BabelModifiers\relax
@@ -8098,7 +8132,7 @@
   \let\bbl at screset\relax}%
 \def\ldf at finish#1{%
   \loadlocalcfg{#1}%
-  \bbl at afterldf{#1}%
+  \bbl at afterldf
   \expandafter\main at language\expandafter{#1}%
   \catcode`\@=\atcatcode \let\atcatcode\relax
   \catcode`\==\eqcatcode \let\eqcatcode\relax}
@@ -10795,12 +10829,17 @@
 % counters); finally, ‘export’ some values by defining global macros
 % (identification, typography, characters, numbers). The second
 % argument is 0 when called to read the minimal data for fonts; with
-% |\babelprovide| it's either 1 or 2.
+% |\babelprovide| it's either 1 (without \texttt{import}) or 2 (which
+% |import|). The value $-$1 is used with |\DocumentMetadata|.
 %
 % |\bbl at loop@ini| is the reader, line by line (1: stream), and calls
 % |\bbl at iniline| to save the key/value pairs. If |\bbl at inistore| finds
 % the |@include| directive, the input stream is switched temporarily and
 % |\bbl at read@subini| is called.
+% 
+% When the language is being set based on the document metadata (\#2 in
+% |\bbl at read@ini| is $-$1), there is an interlude to get the name,
+% after the data have been collected, and before it’s processed.
 %
 %    \begin{macrocode}
 \def\bbl at loop@ini#1{%
@@ -10836,19 +10875,33 @@
     % == Store ini data in \bbl at inidata ==
     \catcode`\[=12 \catcode`\]=12 \catcode`\==12 \catcode`\&=12
     \catcode`\;=12 \catcode`\|=12 \catcode`\%=14 \catcode`\-=12
+    \ifnum#2=\m at ne % Just for the info
+      \edef\languagename{tag \bbl at metalang}%
+    \fi  
     \bbl at info{Importing
                 \ifcase#2font and identification \or basic \fi
                  data for \languagename\\%
               from babel-#1.ini. Reported}%
-    \ifnum#2=\z@
+    \ifnum#2<\@ne
       \global\let\bbl at inidata\@empty
-      \let\bbl at inistore\bbl at inistore@min    % Remember it's local
+      \let\bbl at inistore\bbl at inistore@min  % Remember it's local
     \fi
     \def\bbl at section{identification}%
-    \bbl at exp{\\\bbl at inistore tag.ini=#1\\\@@}%
-    \bbl at inistore load.level=#2\@@
+    \bbl at exp{%
+      \\\bbl at inistore tag.ini=#1\\\@@
+      \\\bbl at inistore load.level=\ifnum#2<\@ne 0\else #2\fi\\\@@}%
     \bbl at loop@ini\bbl at readstream
     % == Process stored data ==
+    \ifnum#2=\m at ne
+      \def\bbl at tempa##1 ##2\@@{##1}% Get first name
+      \def\bbl at elt##1##2##3{%
+        \bbl at ifsamestring{identification/name.babel}{##1/##2}%
+          {\edef\languagename{\bbl at tempa##3 \@@}%
+           \bbl at id@assign
+           \def\bbl at elt####1####2####3{}}%
+          {}}%
+      \bbl at inidata
+    \fi
     \bbl at csarg\xdef{lini@\languagename}{#1}%
     \bbl at read@ini at aux
     % == 'Export' data ==
@@ -10996,6 +11049,16 @@
 %
 \let\bbl at release@transforms\@empty
 \let\bbl at release@casing\@empty
+%    \end{macrocode}
+%
+% Relevant keys are ‘exported’, i.e., global macros with short names
+% are created with values taken from the corresponding keys. The
+% number of exported keys depends on the loading level (\#1): $-$1 and
+% 0 only info (the identificacion section), 1 also basic (like
+% linebreaking or character ranges), 2 also (re)new (with date and
+% captions).
+%
+%    \begin{macrocode}
 \def\bbl at ini@exports#1{%
   % Identification always exported
   \bbl at iniwarning{}%
@@ -11026,9 +11089,7 @@
   \bbl at exportkey{extu}{identification.extension.u.tag.bcp47}{}%
   \bbl at exportkey{extx}{identification.extension.x.tag.bcp47}{}%
   % Also maps bcp47 -> languagename
-  \ifbbl at bcptoname
-    \bbl at csarg\xdef{bcp at map@\bbl at cl{tbcp}}{\languagename}%
-  \fi
+  \bbl at csarg\xdef{bcp at map@\bbl at cl{tbcp}}{\languagename}%
   \ifcase\bbl at engine\or
     \directlua{%
       Babel.locale_props[\the\bbl at cs{id@@\languagename}].script
@@ -11035,7 +11096,7 @@
         = '\bbl at cl{sbcp}'}%
   \fi
   % Conditional
-  \ifnum#1>\z@         % 0 = only info, 1, 2 = basic, (re)new
+  \ifnum#1>\z@      % -1 or 0 = only info, 1 = basic, 2 = (re)new
     \bbl at exportkey{calpr}{date.calendar.preferred}{}%
     \bbl at exportkey{lnbrk}{typography.linebreaking}{h}%
     \bbl at exportkey{hyphr}{typography.hyphenrules}{}%
@@ -11390,7 +11451,7 @@
 \newcommand\babelcalendar[2][\the\year-\the\month-\the\day]{%
   \@nameuse{bbl at ca@#2}#1\@@}
 \newcommand\BabelDateSpace{\nobreakspace}
-\newcommand\BabelDateDot{.\@}  % TODO. \let instead of repeating
+\newcommand\BabelDateDot{.\@}
 \newcommand\BabelDated[1]{{\number#1}}
 \newcommand\BabelDatedd[1]{{\ifnum#1<10 0\fi\number#1}}
 \newcommand\BabelDateM[1]{{\number#1}}
@@ -11454,12 +11515,20 @@
 %
 % \textbf{Transforms.}
 %
+% Process the transforms read from |ini| files, converts them to a form
+% close to the user interface (with |\babelprehyphenation| and
+% |\babelprehyphenation|), wrapped with |\bbl at transforms@aux| \ldots
+% |\relax|, and stores them in |\bbl at release@transforms|. However,
+% since building a list enclosed in braces isn’t trivial, the
+% replacements are added after a comma, and then |\bbl at transforms@aux|
+% adds the braces.
+%
 %    \begin{macrocode}
 \bbl at csarg\let{inikv at transforms.prehyphenation}\bbl at inikv
 \bbl at csarg\let{inikv at transforms.posthyphenation}\bbl at inikv
 \def\bbl at transforms@aux#1#2#3#4,#5\relax{%
   #1[#2]{#3}{#4}{#5}}
-\begingroup %  A hack. TODO. Don't require a specific order
+\begingroup
   \catcode`\%=12
   \catcode`\&=14
   \gdef\bbl at transforms#1#2#3{&%
@@ -11513,8 +11582,11 @@
 %
 % \subsection{Handle language system}
 %
-% Language and Script values to be used when defining a font or
-% setting the direction are set with the following macros.
+% The language system (i.e., |Language| and |Script|) to be used when
+% defining a font or setting the direction are set with the following
+% macros. It also deals with unhyphenated line breaking in \xetex\ 
+% (e.g., Thai and traditional Sanskrit), which is done with a hack at
+% the font level because this engine doesn’t support it.
 %
 %    \begin{macrocode}
 \def\bbl at provide@lsys#1{%
@@ -11542,26 +11614,6 @@
         \fi}}%
   \fi
   \bbl at csarg\bbl at toglobal{lsys@#1}}
-\def\bbl at xenohyph@d{%
-  \bbl at ifset{bbl at prehc@\languagename}%
-    {\ifnum\hyphenchar\font=\defaulthyphenchar
-       \iffontchar\font\bbl at cl{prehc}\relax
-         \hyphenchar\font\bbl at cl{prehc}\relax
-       \else\iffontchar\font"200B
-         \hyphenchar\font"200B
-       \else
-         \bbl at warning
-           {Neither 0 nor ZERO WIDTH SPACE are available\\%
-            in the current font, and therefore the hyphen\\%
-            will be printed. Try changing the fontspec's\\%
-            'HyphenChar' to another value, but be aware\\%
-            this setting is not safe (see the manual).\\%
-            Reported}%
-         \hyphenchar\font\defaulthyphenchar
-       \fi\fi
-     \fi}%
-    {\hyphenchar\font\defaulthyphenchar}}
-  % \fi}
 %    \end{macrocode}
 %
 % The following |ini| reader ignores everything but the
@@ -11668,7 +11720,7 @@
      \bbl at cs{cntr@#1.3@\languagename}#6%
      \bbl at cs{cntr@#1.2@\languagename}#7%
      \bbl at cs{cntr@#1.1@\languagename}#8%
-     \ifnum#6#7#8>\z@ % TODO. An ad hoc rule for Greek. Ugly.
+     \ifnum#6#7#8>\z@
        \bbl at ifunset{bbl at cntr@#1.S.321@\languagename}{}%
          {\bbl at cs{cntr@#1.S.321@\languagename}}%
      \fi}%
@@ -11769,31 +11821,17 @@
 %    \end{macrocode}
 %
 % With version 3.75 |\BabelEnsureInfo| is executed always, but there is
-% an option to disable it.
+% an option to disable it. Since the info in |ini| files are always
+% loaded, it has be made no-op in version 25.8.
 %
 %    \begin{macrocode} 
 %<<*More package options>>
 \DeclareOption{ensureinfo=off}{}
 %<</More package options>>
-\let\bbl at ensureinfo\@gobble
-\newcommand\BabelEnsureInfo{%
-  \ifx\InputIfFileExists\@undefined\else
-    \def\bbl at ensureinfo##1{%
-      \bbl at ifunset{bbl at lname@##1}{\bbl at load@info{##1}}{}}%
-  \fi
-  \bbl at foreach\bbl at loaded{{%
-    \let\bbl at ensuring\@empty % Flag used in a couple of babel-*.tex files
-    \def\languagename{##1}%
-    \bbl at ensureinfo{##1}}}}
-\@ifpackagewith{babel}{ensureinfo=off}{}%
-  {\AtEndOfPackage{% Test for plain.
-    \ifx\@undefined\bbl at loaded\else\BabelEnsureInfo\fi}}
+\let\BabelEnsureInfo\relax
 %    \end{macrocode}
 %
-% More general, but non-expandable, is |\getlocaleproperty|. To inspect
-% every possible loaded |ini|, we define |\LocaleForEach|, where
-% |\bbl at ini@loaded| is a comma-separated list of locales, built by
-% |\bbl at read@ini|.
+% More general, but non-expandable, is |\getlocaleproperty|. 
 %
 %    \begin{macrocode}
 \newcommand\getlocaleproperty{%
@@ -11811,6 +11849,13 @@
   \ifx#1\relax
     \bbl at error{unknown-locale-key}{#1}{#2}{#3}%
   \fi}
+%    \end{macrocode}
+%
+%  To inspect every possible loaded |ini|, we define |\LocaleForEach|,
+%  where |\bbl at ini@loaded| is a comma-separated list of locales, built
+%  by |\bbl at read@ini|.
+%
+%    \begin{macrocode}
 \let\bbl at ini@loaded\@empty
 \newcommand\LocaleForEach{\bbl at foreach\bbl at ini@loaded}
 \def\ShowLocaleProperties#1{%
@@ -11823,6 +11868,17 @@
 %
 % \subsection{BCP 47 related commands}
 %
+% This macro is called by language selectors when the language isn’t
+% recognized. So, it’s the core for (1) mapping from a BCP 27 tag to
+% the actual language, if |bcp47.toname| is enabled (i.e., if
+% |bbl at bcptoname| is true), and (2) lazy loading. With |autoload.bcp47|
+% enabled \textit{and} lazy loading, we must first build a name for the
+% language, with the help of |autoload.bcp47.prefix|. Then we use
+% |\provideprovide| passing the options set with
+% |autoload.bcp47.options| (by default |import|). Finally, and if the
+% locale has not been loaded before, we use |\provideprovide| with the
+% language name as passed to the selector.
+%
 %    \begin{macrocode}
 \newif\ifbbl at bcpallowed
 \bbl at bcpallowedfalse
@@ -11832,8 +11888,11 @@
     \bbl at error{base-on-the-fly}{}{}{}%
   \fi
   \let\bbl at auxname\languagename % Still necessary.
-  \bbl at ifunset{bbl at bcp@map@\languagename}{}% Move uplevel??
-    {\edef\languagename{\@nameuse{bbl at bcp@map@\languagename}}}%
+  \ifbbl at bcptoname
+    \bbl at ifunset{bbl at bcp@map@\languagename}{}% Move uplevel??
+      {\edef\languagename{\@nameuse{bbl at bcp@map@\languagename}}%
+       \let\localename\languagename}%
+  \fi
   \ifbbl at bcpallowed
     \expandafter\ifx\csname date\languagename\endcsname\relax
       \expandafter
@@ -11840,7 +11899,7 @@
       \bbl at bcplookup\languagename-\@empty-\@empty-\@empty\@@
       \ifx\bbl at bcp\relax\else  % Returned by \bbl at bcplookup
         \edef\languagename{\bbl at bcp@prefix\bbl at bcp}%
-        \edef\localename{\bbl at bcp@prefix\bbl at bcp}%
+        \let\localename\languagename
         \expandafter\ifx\csname date\languagename\endcsname\relax
           \let\bbl at initoload\bbl at bcp
           \bbl at exp{\\\babelprovide[\bbl at autoload@bcpoptions]{\languagename}}%
@@ -11972,8 +12031,7 @@
   \def\bbl at autoload@bcpoptions{#1}}
 \newif\ifbbl at bcptoname
 \@namedef{bbl at ADJ@bcp47.toname at on}{%
-  \bbl at bcptonametrue
-  \BabelEnsureInfo}
+  \bbl at bcptonametrue}
 \@namedef{bbl at ADJ@bcp47.toname at off}{%
   \bbl at bcptonamefalse}
 \@namedef{bbl at ADJ@prehyphenation.disable at nohyphenation}{%
@@ -12926,7 +12984,8 @@
                        *}}%
         \@empty}}
 \fi
-%    \end{macrocode}%
+%    \end{macrocode}
+%
 % \subsection{Language options}
 %
 % Languages are loaded when processing the corresponding option
@@ -12995,7 +13054,29 @@
 % of the file with the package option |config=<name>|, which will
 % load |<name>.cfg| instead.
 %
+% If the language as been set as metadata, read the info from the
+% corresponding \texttt{ini} file and extract the \babel\ name. Then
+% added it as a package option at the end, so that it becomes the main
+% language. The behavior of a metatag with a global language option is
+% not well defined, so if there is not a |main| option we set here
+% explicitly.
+%
 %    \begin{macrocode}
+\ifx\GetDocumentProperties\@undefined\else
+  \edef\bbl at metalang{\GetDocumentProperties{document/lang}}%
+  \ifx\bbl at metalang\@empty\else
+    \begingroup
+      \expandafter
+      \bbl at bcplookup\bbl at metalang-\@empty-\@empty-\@empty\@@
+      \bbl at read@ini{\bbl at bcp}\m at ne
+      \xdef\bbl at language@opts{\bbl at language@opts,\languagename}%
+      \ifx\bbl at opt@main\@nnil
+        \global\let\bbl at opt@main\languagename
+      \fi
+      \bbl at info{Passing \languagename\space to babel}%
+    \endgroup
+  \fi
+\fi
 \ifx\bbl at opt@config\@nnil
   \@ifpackagewith{babel}{noconfigs}{}%
     {\InputIfFileExists{bblopts.cfg}%
@@ -13050,10 +13131,13 @@
       \fi}%
   \fi
 \else
-  \bbl at info{Main language set with 'main='. Except if you have\\%
-            problems, prefer the default mechanism for setting\\%
-            the main language, i.e., as the last declared.\\%
-            Reported}
+  \ifx\bbl at metalang\@undefined\else\ifx\bbl at metalang\@empty\else
+    \bbl at afterfi\expandafter\@gobble 
+  \fi\fi  % except if explicit lang metatag:
+    {\bbl at info{Main language set with 'main='. Except if you have\\%
+               problems, prefer the default mechanism for setting\\%
+               the main language, i.e., as the last declared.\\%
+               Reported}}
 \fi
 %    \end{macrocode}
 %
@@ -13083,7 +13167,7 @@
       \DeclareOption{#1}{%
         \bbl at ldfinit
         \babelprovide[@import]{#1}% %%%%%
-        \bbl at afterldf{}}%
+        \bbl at afterldf}%
     \fi
   \fi}
 \bbl at foreach\bbl at tempf{%
@@ -13100,7 +13184,7 @@
          {\DeclareOption{#1}{%
             \bbl at ldfinit
             \babelprovide[@import]{#1}%  %%%%%%
-            \bbl at afterldf{}}}%
+            \bbl at afterldf}}%
          {}%
      \fi
   \fi}
@@ -13163,7 +13247,7 @@
        \\\babelprovide
          [\bbl at opt@provide, at import,main]%  %%%%%
          {\bbl at opt@main}}%
-    \bbl at afterldf{}
+    \bbl at afterldf
     \DeclareOption{\bbl at opt@main}{}
   \else % case 0,2 (main is ldf)
     \ifx\bbl at loadmain\relax
@@ -14171,6 +14255,31 @@
 \def\bbl at provide@extra#1{}
 %    \end{macrocode}
 %
+% Hack for unhyphenated line breaking. See |\bbl at provide@lsys| in the
+% common code.
+%
+%    \begin{macrocode}
+\def\bbl at xenohyph@d{%
+  \bbl at ifset{bbl at prehc@\languagename}%
+    {\ifnum\hyphenchar\font=\defaulthyphenchar
+       \iffontchar\font\bbl at cl{prehc}\relax
+         \hyphenchar\font\bbl at cl{prehc}\relax
+       \else\iffontchar\font"200B
+         \hyphenchar\font"200B
+       \else
+         \bbl at warning
+           {Neither 0 nor ZERO WIDTH SPACE are available\\%
+            in the current font, and therefore the hyphen\\%
+            will be printed. Try changing the fontspec's\\%
+            'HyphenChar' to another value, but be aware\\%
+            this setting is not safe (see the manual).\\%
+            Reported}%
+         \hyphenchar\font\defaulthyphenchar
+       \fi\fi
+     \fi}%
+    {\hyphenchar\font\defaulthyphenchar}}
+%    \end{macrocode}
+%
 % \subsection{Support for interchar}
 %
 % \xetex{} reserves some values for CJK (although they are not set in
@@ -25533,7 +25642,6 @@
 \let\bbl at opt@shorthands\@nnil
 \def\bbl at ifshorthand#1#2#3{#2}%
 \let\bbl at language@opts\@empty
-\let\bbl at ensureinfo\@gobble
 \let\bbl at provide@locale\relax
 \ifx\babeloptionstrings\@undefined
   \let\bbl at opt@strings\@nnil

Modified: trunk/Master/texmf-dist/source/latex/babel/babel.ins
===================================================================
--- trunk/Master/texmf-dist/source/latex/babel/babel.ins	2025-04-29 17:38:33 UTC (rev 75052)
+++ trunk/Master/texmf-dist/source/latex/babel/babel.ins	2025-04-29 19:45:16 UTC (rev 75053)
@@ -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{2025/04/14}
+\def\filedate{2025/04/29}
 \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	2025-04-29 17:38:33 UTC (rev 75052)
+++ trunk/Master/texmf-dist/source/latex/babel/bbcompat.dtx	2025-04-29 19:45:16 UTC (rev 75053)
@@ -30,7 +30,7 @@
 %
 % \iffalse
 %<*dtx>
-\ProvidesFile{bbcompat.dtx}[2025/04/14 v25.7]
+\ProvidesFile{bbcompat.dtx}[2025/04/29 v25.8]
 %</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	2025-04-29 17:38:33 UTC (rev 75052)
+++ trunk/Master/texmf-dist/tex/generic/babel/babel.def	2025-04-29 19:45:16 UTC (rev 75053)
@@ -39,7 +39,7 @@
     \wlog{File: #1 #4 #3 <#2>}%
     \let\ProvidesFile\@undefined}
 \fi
-\ProvidesFile{babel.def}[2025/04/14 v25.7 Babel common definitions]
+\ProvidesFile{babel.def}[2025/04/29 v25.8 Babel common definitions]
 \ifx\AtBeginDocument\@undefined
   \def\@empty{}
 \def\loadlocalcfg#1{%
@@ -387,7 +387,6 @@
 \let\bbl at opt@shorthands\@nnil
 \def\bbl at ifshorthand#1#2#3{#2}%
 \let\bbl at language@opts\@empty
-\let\bbl at ensureinfo\@gobble
 \let\bbl at provide@locale\relax
 \ifx\babeloptionstrings\@undefined
   \let\bbl at opt@strings\@nnil
@@ -603,8 +602,8 @@
     \toks@\expandafter{\bbl at tempc#3}%
     \expandafter\edef\csname extras\languagename\endcsname{\the\toks@}%
   \fi}
-\def\bbl at version{25.7}
-\def\bbl at date{2025/04/14}
+\def\bbl at version{25.8}
+\def\bbl at date{2025/04/29}
 \ifx\language\@undefined
   \csname newcount\endcsname\language
 \fi
@@ -720,13 +719,13 @@
   \expandafter\bbl at set@language\expandafter{\languagename}%
   \let\bbl at ifrestoring\@secondoftwo}
 \chardef\localeid\z@
-\def\bbl at id@last{0}    % No real need for a new counter
+\gdef\bbl at id@last{0}    % No real need for a new counter
 \def\bbl at id@assign{%
   \bbl at ifunset{bbl at id@@\languagename}%
     {\count@\bbl at id@last\relax
      \advance\count@\@ne
      \global\bbl at csarg\chardef{id@@\languagename}\count@
-     \edef\bbl at id@last{\the\count@}%
+     \xdef\bbl at id@last{\the\count@}%
      \ifcase\bbl at engine\or
        \directlua{
          Babel.locale_props[\bbl at id@last] = {}
@@ -788,8 +787,6 @@
 \newif\ifbbl at usedategroup
 \let\bbl at savedextras\@empty
 \def\bbl at switch#1{%  from select@, foreign@
-  % make sure there is info for the language if so requested
-  \bbl at ensureinfo{#1}%
   % restore
   \originalTeX
   \expandafter\def\expandafter\originalTeX\expandafter{%
@@ -1221,6 +1218,15 @@
   \catcode`\@=11\relax
   \chardef\eqcatcode=\catcode`\=
   \catcode`\==12\relax
+  \@ifpackagewith{babel}{ensureinfo=off}{}%
+    {\ifx\InputIfFileExists\@undefined\else
+       \bbl at ifunset{bbl at lname@#1}%
+         {{\let\bbl at ensuring\@empty % Flag used in babel-serbianc.tex
+          \def\languagename{#1}%
+          \bbl at id@assign
+          \bbl at load@info{#1}}}%
+        {}%
+     \fi}%
   \expandafter\if\expandafter\@backslashchar
                  \expandafter\@car\string#2\@nil
     \ifx#2\@undefined\else
@@ -1237,7 +1243,7 @@
   \catcode`\@=\atcatcode \let\atcatcode\relax
   \catcode`\==\eqcatcode \let\eqcatcode\relax
   \endinput}
-\def\bbl at afterldf#1{%
+\def\bbl at afterldf{%
   \bbl at afterlang
   \let\bbl at afterlang\relax
   \let\BabelModifiers\relax
@@ -1244,7 +1250,7 @@
   \let\bbl at screset\relax}%
 \def\ldf at finish#1{%
   \loadlocalcfg{#1}%
-  \bbl at afterldf{#1}%
+  \bbl at afterldf
   \expandafter\main at language\expandafter{#1}%
   \catcode`\@=\atcatcode \let\atcatcode\relax
   \catcode`\==\eqcatcode \let\eqcatcode\relax}

Modified: trunk/Master/texmf-dist/tex/generic/babel/babel.sty
===================================================================
--- trunk/Master/texmf-dist/tex/generic/babel/babel.sty	2025-04-29 17:38:33 UTC (rev 75052)
+++ trunk/Master/texmf-dist/tex/generic/babel/babel.sty	2025-04-29 19:45:16 UTC (rev 75053)
@@ -34,7 +34,7 @@
 %%
 \NeedsTeXFormat{LaTeX2e}
 \ProvidesPackage{babel}%
-  [2025/04/14 v25.7
+  [2025/04/29 v25.8
    The multilingual framework for pdfLaTeX, LuaLaTeX and XeLaTeX]
 \@ifpackagewith{babel}{debug}
   {\providecommand\bbl at trace[1]{\message{^^J[ #1 ]}}%
@@ -474,8 +474,8 @@
       \expandafter\@secondoftwo
     \fi}
 \fi
-\def\bbl at version{25.7}
-\def\bbl at date{2025/04/14}
+\def\bbl at version{25.8}
+\def\bbl at date{2025/04/29}
 \ifx\language\@undefined
   \csname newcount\endcsname\language
 \fi
@@ -591,13 +591,13 @@
   \expandafter\bbl at set@language\expandafter{\languagename}%
   \let\bbl at ifrestoring\@secondoftwo}
 \chardef\localeid\z@
-\def\bbl at id@last{0}    % No real need for a new counter
+\gdef\bbl at id@last{0}    % No real need for a new counter
 \def\bbl at id@assign{%
   \bbl at ifunset{bbl at id@@\languagename}%
     {\count@\bbl at id@last\relax
      \advance\count@\@ne
      \global\bbl at csarg\chardef{id@@\languagename}\count@
-     \edef\bbl at id@last{\the\count@}%
+     \xdef\bbl at id@last{\the\count@}%
      \ifcase\bbl at engine\or
        \directlua{
          Babel.locale_props[\bbl at id@last] = {}
@@ -659,8 +659,6 @@
 \newif\ifbbl at usedategroup
 \let\bbl at savedextras\@empty
 \def\bbl at switch#1{%  from select@, foreign@
-  % make sure there is info for the language if so requested
-  \bbl at ensureinfo{#1}%
   % restore
   \originalTeX
   \expandafter\def\expandafter\originalTeX\expandafter{%
@@ -1092,6 +1090,15 @@
   \catcode`\@=11\relax
   \chardef\eqcatcode=\catcode`\=
   \catcode`\==12\relax
+  \@ifpackagewith{babel}{ensureinfo=off}{}%
+    {\ifx\InputIfFileExists\@undefined\else
+       \bbl at ifunset{bbl at lname@#1}%
+         {{\let\bbl at ensuring\@empty % Flag used in babel-serbianc.tex
+          \def\languagename{#1}%
+          \bbl at id@assign
+          \bbl at load@info{#1}}}%
+        {}%
+     \fi}%
   \expandafter\if\expandafter\@backslashchar
                  \expandafter\@car\string#2\@nil
     \ifx#2\@undefined\else
@@ -1108,7 +1115,7 @@
   \catcode`\@=\atcatcode \let\atcatcode\relax
   \catcode`\==\eqcatcode \let\eqcatcode\relax
   \endinput}
-\def\bbl at afterldf#1{%
+\def\bbl at afterldf{%
   \bbl at afterlang
   \let\bbl at afterlang\relax
   \let\BabelModifiers\relax
@@ -1115,7 +1122,7 @@
   \let\bbl at screset\relax}%
 \def\ldf at finish#1{%
   \loadlocalcfg{#1}%
-  \bbl at afterldf{#1}%
+  \bbl at afterldf
   \expandafter\main at language\expandafter{#1}%
   \catcode`\@=\atcatcode \let\atcatcode\relax
   \catcode`\==\eqcatcode \let\eqcatcode\relax}
@@ -2633,19 +2640,33 @@
     % == Store ini data in \bbl at inidata ==
     \catcode`\[=12 \catcode`\]=12 \catcode`\==12 \catcode`\&=12
     \catcode`\;=12 \catcode`\|=12 \catcode`\%=14 \catcode`\-=12
+    \ifnum#2=\m at ne % Just for the info
+      \edef\languagename{tag \bbl at metalang}%
+    \fi
     \bbl at info{Importing
                 \ifcase#2font and identification \or basic \fi
                  data for \languagename\\%
               from babel-#1.ini. Reported}%
-    \ifnum#2=\z@
+    \ifnum#2<\@ne
       \global\let\bbl at inidata\@empty
-      \let\bbl at inistore\bbl at inistore@min    % Remember it's local
+      \let\bbl at inistore\bbl at inistore@min  % Remember it's local
     \fi
     \def\bbl at section{identification}%
-    \bbl at exp{\\\bbl at inistore tag.ini=#1\\\@@}%
-    \bbl at inistore load.level=#2\@@
+    \bbl at exp{%
+      \\\bbl at inistore tag.ini=#1\\\@@
+      \\\bbl at inistore load.level=\ifnum#2<\@ne 0\else #2\fi\\\@@}%
     \bbl at loop@ini\bbl at readstream
     % == Process stored data ==
+    \ifnum#2=\m at ne
+      \def\bbl at tempa##1 ##2\@@{##1}% Get first name
+      \def\bbl at elt##1##2##3{%
+        \bbl at ifsamestring{identification/name.babel}{##1/##2}%
+          {\edef\languagename{\bbl at tempa##3 \@@}%
+           \bbl at id@assign
+           \def\bbl at elt####1####2####3{}}%
+          {}}%
+      \bbl at inidata
+    \fi
     \bbl at csarg\xdef{lini@\languagename}{#1}%
     \bbl at read@ini at aux
     % == 'Export' data ==
@@ -2773,9 +2794,7 @@
   \bbl at exportkey{extu}{identification.extension.u.tag.bcp47}{}%
   \bbl at exportkey{extx}{identification.extension.x.tag.bcp47}{}%
   % Also maps bcp47 -> languagename
-  \ifbbl at bcptoname
-    \bbl at csarg\xdef{bcp at map@\bbl at cl{tbcp}}{\languagename}%
-  \fi
+  \bbl at csarg\xdef{bcp at map@\bbl at cl{tbcp}}{\languagename}%
   \ifcase\bbl at engine\or
     \directlua{%
       Babel.locale_props[\the\bbl at cs{id@@\languagename}].script
@@ -2782,7 +2801,7 @@
         = '\bbl at cl{sbcp}'}%
   \fi
   % Conditional
-  \ifnum#1>\z@         % 0 = only info, 1, 2 = basic, (re)new
+  \ifnum#1>\z@      % -1 or 0 = only info, 1 = basic, 2 = (re)new
     \bbl at exportkey{calpr}{date.calendar.preferred}{}%
     \bbl at exportkey{lnbrk}{typography.linebreaking}{h}%
     \bbl at exportkey{hyphr}{typography.hyphenrules}{}%
@@ -3060,7 +3079,7 @@
 \newcommand\babelcalendar[2][\the\year-\the\month-\the\day]{%
   \@nameuse{bbl at ca@#2}#1\@@}
 \newcommand\BabelDateSpace{\nobreakspace}
-\newcommand\BabelDateDot{.\@}  % TODO. \let instead of repeating
+\newcommand\BabelDateDot{.\@}
 \newcommand\BabelDated[1]{{\number#1}}
 \newcommand\BabelDatedd[1]{{\ifnum#1<10 0\fi\number#1}}
 \newcommand\BabelDateM[1]{{\number#1}}
@@ -3116,7 +3135,7 @@
 \bbl at csarg\let{inikv at transforms.posthyphenation}\bbl at inikv
 \def\bbl at transforms@aux#1#2#3#4,#5\relax{%
   #1[#2]{#3}{#4}{#5}}
-\begingroup %  A hack. TODO. Don't require a specific order
+\begingroup
   \catcode`\%=12
   \catcode`\&=14
   \gdef\bbl at transforms#1#2#3{&%
@@ -3191,26 +3210,6 @@
         \fi}}%
   \fi
   \bbl at csarg\bbl at toglobal{lsys@#1}}
-\def\bbl at xenohyph@d{%
-  \bbl at ifset{bbl at prehc@\languagename}%
-    {\ifnum\hyphenchar\font=\defaulthyphenchar
-       \iffontchar\font\bbl at cl{prehc}\relax
-         \hyphenchar\font\bbl at cl{prehc}\relax
-       \else\iffontchar\font"200B
-         \hyphenchar\font"200B
-       \else
-         \bbl at warning
-           {Neither 0 nor ZERO WIDTH SPACE are available\\%
-            in the current font, and therefore the hyphen\\%
-            will be printed. Try changing the fontspec's\\%
-            'HyphenChar' to another value, but be aware\\%
-            this setting is not safe (see the manual).\\%
-            Reported}%
-         \hyphenchar\font\defaulthyphenchar
-       \fi\fi
-     \fi}%
-    {\hyphenchar\font\defaulthyphenchar}}
-  % \fi}
 \def\bbl at load@info#1{%
   \def\BabelBeforeIni##1##2{%
     \begingroup
@@ -3279,7 +3278,7 @@
      \bbl at cs{cntr@#1.3@\languagename}#6%
      \bbl at cs{cntr@#1.2@\languagename}#7%
      \bbl at cs{cntr@#1.1@\languagename}#8%
-     \ifnum#6#7#8>\z@ % TODO. An ad hoc rule for Greek. Ugly.
+     \ifnum#6#7#8>\z@
        \bbl at ifunset{bbl at cntr@#1.S.321@\languagename}{}%
          {\bbl at cs{cntr@#1.S.321@\languagename}}%
      \fi}%
@@ -3358,19 +3357,7 @@
 \@namedef{bbl at info@extension.t.tag.bcp47}{extt}
 \@namedef{bbl at info@extension.u.tag.bcp47}{extu}
 \@namedef{bbl at info@extension.x.tag.bcp47}{extx}
-\let\bbl at ensureinfo\@gobble
-\newcommand\BabelEnsureInfo{%
-  \ifx\InputIfFileExists\@undefined\else
-    \def\bbl at ensureinfo##1{%
-      \bbl at ifunset{bbl at lname@##1}{\bbl at load@info{##1}}{}}%
-  \fi
-  \bbl at foreach\bbl at loaded{{%
-    \let\bbl at ensuring\@empty % Flag used in a couple of babel-*.tex files
-    \def\languagename{##1}%
-    \bbl at ensureinfo{##1}}}}
-\@ifpackagewith{babel}{ensureinfo=off}{}%
-  {\AtEndOfPackage{% Test for plain.
-    \ifx\@undefined\bbl at loaded\else\BabelEnsureInfo\fi}}
+\let\BabelEnsureInfo\relax
 \newcommand\getlocaleproperty{%
   \@ifstar\bbl at getproperty@s\bbl at getproperty@x}
 \def\bbl at getproperty@s#1#2#3{%
@@ -3402,8 +3389,11 @@
     \bbl at error{base-on-the-fly}{}{}{}%
   \fi
   \let\bbl at auxname\languagename % Still necessary.
-  \bbl at ifunset{bbl at bcp@map@\languagename}{}% Move uplevel??
-    {\edef\languagename{\@nameuse{bbl at bcp@map@\languagename}}}%
+  \ifbbl at bcptoname
+    \bbl at ifunset{bbl at bcp@map@\languagename}{}% Move uplevel??
+      {\edef\languagename{\@nameuse{bbl at bcp@map@\languagename}}%
+       \let\localename\languagename}%
+  \fi
   \ifbbl at bcpallowed
     \expandafter\ifx\csname date\languagename\endcsname\relax
       \expandafter
@@ -3410,7 +3400,7 @@
       \bbl at bcplookup\languagename-\@empty-\@empty-\@empty\@@
       \ifx\bbl at bcp\relax\else  % Returned by \bbl at bcplookup
         \edef\languagename{\bbl at bcp@prefix\bbl at bcp}%
-        \edef\localename{\bbl at bcp@prefix\bbl at bcp}%
+        \let\localename\languagename
         \expandafter\ifx\csname date\languagename\endcsname\relax
           \let\bbl at initoload\bbl at bcp
           \bbl at exp{\\\babelprovide[\bbl at autoload@bcpoptions]{\languagename}}%
@@ -3517,8 +3507,7 @@
   \def\bbl at autoload@bcpoptions{#1}}
 \newif\ifbbl at bcptoname
 \@namedef{bbl at ADJ@bcp47.toname at on}{%
-  \bbl at bcptonametrue
-  \BabelEnsureInfo}
+  \bbl at bcptonametrue}
 \@namedef{bbl at ADJ@bcp47.toname at off}{%
   \bbl at bcptonamefalse}
 \@namedef{bbl at ADJ@prehyphenation.disable at nohyphenation}{%
@@ -4079,6 +4068,21 @@
 \DeclareOption{russian}{\bbl at try@load at lang{}{russianb}{}}
 \DeclareOption{ukrainian}{\bbl at try@load at lang{}{ukraineb}{}}
 \DeclareOption{uppersorbian}{\bbl at try@load at lang{}{usorbian}{}}
+\ifx\GetDocumentProperties\@undefined\else
+  \edef\bbl at metalang{\GetDocumentProperties{document/lang}}%
+  \ifx\bbl at metalang\@empty\else
+    \begingroup
+      \expandafter
+      \bbl at bcplookup\bbl at metalang-\@empty-\@empty-\@empty\@@
+      \bbl at read@ini{\bbl at bcp}\m at ne
+      \xdef\bbl at language@opts{\bbl at language@opts,\languagename}%
+      \ifx\bbl at opt@main\@nnil
+        \global\let\bbl at opt@main\languagename
+      \fi
+      \bbl at info{Passing \languagename\space to babel}%
+    \endgroup
+  \fi
+\fi
 \ifx\bbl at opt@config\@nnil
   \@ifpackagewith{babel}{noconfigs}{}%
     {\InputIfFileExists{bblopts.cfg}%
@@ -4114,10 +4118,13 @@
       \fi}%
   \fi
 \else
-  \bbl at info{Main language set with 'main='. Except if you have\\%
-            problems, prefer the default mechanism for setting\\%
-            the main language, i.e., as the last declared.\\%
-            Reported}
+  \ifx\bbl at metalang\@undefined\else\ifx\bbl at metalang\@empty\else
+    \bbl at afterfi\expandafter\@gobble
+  \fi\fi  % except if explicit lang metatag:
+    {\bbl at info{Main language set with 'main='. Except if you have\\%
+               problems, prefer the default mechanism for setting\\%
+               the main language, i.e., as the last declared.\\%
+               Reported}}
 \fi
 \ifx\bbl at opt@main\@nnil\else
   \bbl at ncarg\let\bbl at loadmain{ds@\bbl at opt@main}%
@@ -4134,7 +4141,7 @@
       \DeclareOption{#1}{%
         \bbl at ldfinit
         \babelprovide[@import]{#1}% %%%%%
-        \bbl at afterldf{}}%
+        \bbl at afterldf}%
     \fi
   \fi}
 \bbl at foreach\bbl at tempf{%
@@ -4151,7 +4158,7 @@
          {\DeclareOption{#1}{%
             \bbl at ldfinit
             \babelprovide[@import]{#1}%  %%%%%%
-            \bbl at afterldf{}}}%
+            \bbl at afterldf}}%
          {}%
      \fi
   \fi}
@@ -4190,7 +4197,7 @@
        \\\babelprovide
          [\bbl at opt@provide, at import,main]%  %%%%%
          {\bbl at opt@main}}%
-    \bbl at afterldf{}
+    \bbl at afterldf
     \DeclareOption{\bbl at opt@main}{}
   \else % case 0,2 (main is ldf)
     \ifx\bbl at loadmain\relax

Modified: trunk/Master/texmf-dist/tex/generic/babel/hyphen.cfg
===================================================================
--- trunk/Master/texmf-dist/tex/generic/babel/hyphen.cfg	2025-04-29 17:38:33 UTC (rev 75052)
+++ trunk/Master/texmf-dist/tex/generic/babel/hyphen.cfg	2025-04-29 19:45:16 UTC (rev 75053)
@@ -37,10 +37,10 @@
     \wlog{File: #1 #4 #3 <#2>}%
     \let\ProvidesFile\@undefined}
 \fi
-\ProvidesFile{hyphen.cfg}[2025/04/14 v25.7 Babel hyphens]
+\ProvidesFile{hyphen.cfg}[2025/04/29 v25.8 Babel hyphens]
 \xdef\bbl at format{\jobname}
-\def\bbl at version{25.7}
-\def\bbl at date{2025/04/14}
+\def\bbl at version{25.8}
+\def\bbl at date{2025/04/29}
 \ifx\AtBeginDocument\@undefined
   \def\@empty{}
 \fi

Modified: trunk/Master/texmf-dist/tex/generic/babel/locale/shared/babel-Hebr.ini
===================================================================
--- trunk/Master/texmf-dist/tex/generic/babel/locale/shared/babel-Hebr.ini	2025-04-29 17:38:33 UTC (rev 75052)
+++ trunk/Master/texmf-dist/tex/generic/babel/locale/shared/babel-Hebr.ini	2025-04-29 19:45:16 UTC (rev 75053)
@@ -33,4 +33,10 @@
 transliteration.cj.6.1 =   { string = {1|o*|וֹוּ} }
 transliteration.cj.7.0 = { ([aAbdeEghikKlmMnNoOpPqrstuUwyz{*}:'’`‘;]) }
 transliteration.cj.7.1 =   { string = {1|aAbdeEghikKlmMnNoOpPqrstuUwyz*:'’`‘;|ַָבדֵֶגהִכךלמםנןֹוֹפףקרסתֻוּויזְּאאעע׃} }
+;
+justification.interletter.1.0 = { [֑-ׇֽֿׁׂׅׄא-ײﬞ][א-ײ] }
+justification.interletter.1.1 =  {}
+justification.interletter.1.2 =  { insert, penalty = 10000 }
+justification.interletter.1.3 =  { insert, spacefactor = 0 {interletter.plus|.5} 0 }
+justification.interletter.1.4 =  {}
 

Modified: trunk/Master/texmf-dist/tex/generic/babel/nil.ldf
===================================================================
--- trunk/Master/texmf-dist/tex/generic/babel/nil.ldf	2025-04-29 17:38:33 UTC (rev 75052)
+++ trunk/Master/texmf-dist/tex/generic/babel/nil.ldf	2025-04-29 19:45:16 UTC (rev 75053)
@@ -32,7 +32,7 @@
 %% and covered by LPPL is defined by the unpacking scripts (with
 %% extension |.ins|) which are part of the distribution.
 %%
-\ProvidesLanguage{nil}[2025/04/14 v25.7 Nil language]
+\ProvidesLanguage{nil}[2025/04/29 v25.8 Nil language]
 \LdfInit{nil}{datenil}
 \ifx\l at nil\@undefined
   \newlanguage\l at nil

Modified: trunk/Master/texmf-dist/tex/generic/babel/xebabel.def
===================================================================
--- trunk/Master/texmf-dist/tex/generic/babel/xebabel.def	2025-04-29 17:38:33 UTC (rev 75052)
+++ trunk/Master/texmf-dist/tex/generic/babel/xebabel.def	2025-04-29 19:45:16 UTC (rev 75053)
@@ -258,6 +258,25 @@
   \bbl at csarg\def{famrst@#4}{\bbl at font@set{#1}#2#3}}
 \def\bbl at font@fams{rm,sf,tt}
 \def\bbl at provide@extra#1{}
+\def\bbl at xenohyph@d{%
+  \bbl at ifset{bbl at prehc@\languagename}%
+    {\ifnum\hyphenchar\font=\defaulthyphenchar
+       \iffontchar\font\bbl at cl{prehc}\relax
+         \hyphenchar\font\bbl at cl{prehc}\relax
+       \else\iffontchar\font"200B
+         \hyphenchar\font"200B
+       \else
+         \bbl at warning
+           {Neither 0 nor ZERO WIDTH SPACE are available\\%
+            in the current font, and therefore the hyphen\\%
+            will be printed. Try changing the fontspec's\\%
+            'HyphenChar' to another value, but be aware\\%
+            this setting is not safe (see the manual).\\%
+            Reported}%
+         \hyphenchar\font\defaulthyphenchar
+       \fi\fi
+     \fi}%
+    {\hyphenchar\font\defaulthyphenchar}}
 \ifnum\xe at alloc@intercharclass<\thr@@
   \xe at alloc@intercharclass\thr@@
 \fi



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