texlive[74953] Master/texmf-dist: babel (15apr25)

commits+karl at tug.org commits+karl at tug.org
Tue Apr 15 21:57:55 CEST 2025


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

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-transforms.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/hyphen.cfg
    trunk/Master/texmf-dist/tex/generic/babel/locale/cy/babel-cy.ini
    trunk/Master/texmf-dist/tex/generic/babel/locale/he/babel-he.ini
    trunk/Master/texmf-dist/tex/generic/babel/locale/lad/babel-lad.ini
    trunk/Master/texmf-dist/tex/generic/babel/locale/shared/babel-Arab.ini
    trunk/Master/texmf-dist/tex/generic/babel/locale/yi/babel-yi.ini
    trunk/Master/texmf-dist/tex/generic/babel/luababel.def
    trunk/Master/texmf-dist/tex/generic/babel/nil.ldf

Added Paths:
-----------
    trunk/Master/texmf-dist/tex/generic/babel/locale/hbo/
    trunk/Master/texmf-dist/tex/generic/babel/locale/hbo/babel-ancienthebrew.tex
    trunk/Master/texmf-dist/tex/generic/babel/locale/hbo/babel-hbo.ini
    trunk/Master/texmf-dist/tex/generic/babel/locale/shared/babel-Hebr.ini

Removed Paths:
-------------
    trunk/Master/texmf-dist/tex/generic/babel/babel-bidi-basic-0.lua
    trunk/Master/texmf-dist/tex/generic/babel/babel-bidi-basic-1.lua

Modified: trunk/Master/texmf-dist/doc/latex/babel/README.md
===================================================================
--- trunk/Master/texmf-dist/doc/latex/babel/README.md	2025-04-15 17:54:06 UTC (rev 74952)
+++ trunk/Master/texmf-dist/doc/latex/babel/README.md	2025-04-15 19:57:54 UTC (rev 74953)
@@ -1,6 +1,6 @@
-## Babel 25.6
+## Babel 25.7
 
-2025-03-27
+2025-04-14
 
 `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.6 are described in:
+Changes in version 25.7 are described in:
 
-https://latex3.github.io/babel/news/whats-new-in-babel-25.6.html
+https://latex3.github.io/babel/news/whats-new-in-babel-25.7.html
 
 Apart from the manual, you can find information and examples in:
 
@@ -59,12 +59,13 @@
 
 ### Summary of latest changes
 ```
-25.6   2025-03-27
-       * Transforms for Chinese and Japanese:
-         - Improved 'spacing.basic'.
-         - New: 'input.nospaces.
-       * @include directive in ini files.
-       * Fix error with CJK in lists (tex.sx 739783).
+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.
 ```
 
 ### 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-15 17:54:06 UTC (rev 74952)
+++ trunk/Master/texmf-dist/source/latex/babel/babel.dtx	2025-04-15 19:57:54 UTC (rev 74953)
@@ -37,7 +37,7 @@
   lang       = en-001,
 }
 \ProvidesFile{babel.dtx}%
-  [2025/03/27 v25.6
+  [2025/04/14 v25.7
    The multilingual framework for pdfLaTeX, LuaLaTeX and XeLaTeX] 
 \documentclass{ltxdoc}
 \GetFileInfo{babel.dtx}
@@ -484,7 +484,7 @@
 \end{example}
 
 \begin{note}
-  Because of the way \babel{} has evolved, ``language'' can refer to
+  Because of the way \babel{} has evolved, “language” can refer to
   (1) a set of hyphenation patterns as preloaded into the format, (2) a
   package option, (3) an |ldf| file, and (4) a name used in the
   document to select a language. Please, read the documentation for
@@ -1108,6 +1108,7 @@
 \tagmin{ancientegyptian}{}{egy}
 \tag{ancientgreek}{\hascapu\hascapl}{grc}\note{It’s a different
 language from \texttt{greek}.}
+\tagmin{ancienthebrew}{}{hbo}
 \tag{arabic}{\hascapu}{ar}
 \subtag{arabic-algeria}{\hascapu}{ar-DZ}
 \subtag{arabic-dz}{\hascapu}{ar-DZ}
@@ -2232,7 +2233,7 @@
 
 \Describe{\iflanguage}{\marg{language}\marg{true}\marg{false}}
 
-Here ``language'' is used in the \TeX{} sense, as a set of hyphenation
+Here “language” is used in the \TeX{} sense, as a set of hyphenation
 patterns, and \textit{not} as its \textsf{babel} name. The first
 argument is the name of a language.
 
@@ -2584,12 +2585,6 @@
   redefined easily.
 \end{note}
 
-% \begin{example}
-%   Let's assume you need only the basic features of `spanish`, so that
-%   the |ini| file is enough, and also a variant with your own
-%   hyphenation with
-% \end{example}
-
 \subsection{Selection based on BCP 47 tags}
 \label{bcp47}
 
@@ -2790,7 +2785,7 @@
 the language name, and are prefixed with a dot (only when the language
 is set as package option -- neither global options nor the |main| key
 accepts them). An example is (spaces are not significant and they can
-be added or removed):\footnote{No predefined ``axis'' for modifiers
+be added or removed):\footnote{No predefined “axis” for modifiers
 is provided because languages and their scripts have quite different
 needs.}
 \begin{verbatim}
@@ -3048,7 +3043,7 @@
 \subsection{Manage auxiliary files}
 
 \Describe{\BabelContentsFiles}{}
-\New{3.9a} This macro contains a list of ``toc'' types requiring a
+\New{3.9a} This macro contains a list of “toc” types requiring a
 command to switch the language. Its default value is |toc,lof,lot|, but
 you may redefine it with |\renewcommand| to add further types in case
 you need or there is a package enabling additional files, e.g., for
@@ -3329,7 +3324,7 @@
 
 \Describe{onchar=}{\texttt{ids} $\string|$ \texttt{fonts}
   $\string|$ \texttt{letters}}
-  
+
 \New{3.38} This option is much like an ‘event’ called when a character
 belonging to the script of this locale is found (as its name implies,
 it acts on characters, not on spaces).
@@ -3386,7 +3381,7 @@
 \begin{note}
   (1) If you need shorthands, you can define them with |\useshorthands|
   and |\defineshorthand| as described above. (2) Captions and |\today|
-  are ``ensured'' with |\babelensure| (this is the default in
+  are “ensured” with |\babelensure| (this is the default in
   |ini|-based languages).
 \end{note}
 
@@ -3472,9 +3467,9 @@
 
 It can be used only in the preamble, and patterns are added when the
 language is first selected, thus taking into account changes of
-|\lccodes|'s done in |\extras<language>| as well as the language-specific
+|\lccodes|’s done in |\extras<language>| as well as the language-specific
 encoding (not set in the preamble by default). Multiple
-|\babelpatterns|'s are allowed.
+|\babelpatterns|’s are allowed.
 
 Listed patterns are saved expanded and therefore it relies on the
 LICR\@. Of course, it also works without the LICR if the input and the
@@ -3490,7 +3485,7 @@
 \New{3.27} Interword spacing for Thai, Lao and Khmer is activated
 automatically if a language with one of those scripts is loaded with
 |\babelprovide|. See the sample on the \babel{} repository. With both
-Unicode engines, spacing is based on the ``current'' em unit (the size
+Unicode engines, spacing is based on the “current” em unit (the size
 of the previous char in \luatex, and the font size set by the last
 |\selectfont| in \xetex).
 
@@ -3542,7 +3537,7 @@
 entered as \verb|-|, and (2) \textit{optional} or \textit{soft
 hyphens}, which are entered as \verb|\-|. Strictly, a \textit{soft
 hyphen} is not a hyphen, but just a breaking opportunity or, in
-\TeX\ terms, a ``discretionary''; a \textit{hard hyphen} is a hyphen
+\TeX\ terms, a “discretionary”; a \textit{hard hyphen} is a hyphen
 with a breaking opportunity after it. A further type is a
 \textit{non-breaking hyphen}, a hyphen without a breaking
 opportunity.
@@ -3557,7 +3552,7 @@
 cannot insert a soft hyphen without breaking opportunities in the rest
 of the word.
 
-Therefore, some macros are provided with a set of basic ``hyphens''
+Therefore, some macros are provided with a set of basic “hyphens”
 which can be used by themselves, to define a user shorthand, or even
 in language files.
 \begin{itemize}
@@ -3570,7 +3565,7 @@
   after it (even if a space follows).
 \item |\babelhyphen{empty}| inserts a break opportunity without
   a hyphen at all.
-\item |\babelhyphen|\marg{text} is a hard ``hyphen'' using \m{text}
+\item |\babelhyphen|\marg{text} is a hard “hyphen” using \m{text}
   instead. A typical case is |\babelhyphen{/}|.
 \end{itemize}
 With all of them, hyphenation in the rest of the word is enabled. If
@@ -3734,7 +3729,7 @@
 
 \New{3.9a} However, |\shorthandoff| does not behave as
 you would expect with characters like |~| or |^|, because they
-usually are not ``other''. For them |\shorthandoff*| is provided,
+usually are not “other”. For them |\shorthandoff*| is provided,
 so that with
 \begin{verbatim}
 \shorthandoff*{~^}
@@ -3783,7 +3778,7 @@
 
 User shorthands override language ones, which in turn override system
 shorthands. Language-dependent user shorthands take precedence over
-``normal'' user shorthands.
+“normal” user shorthands.
 
 \begin{example}
   Let's assume you want a unified set of shorthands for discretionaries
@@ -4369,7 +4364,6 @@
 \trans{Latin}{letters.uv}{Replaces \textit{v}, \textit{U} with
 \textit{u}, \textit{V}.}
 
-
 \trans{Serbian}{transliteration.gajica}{(Note |serbian| with |ini|
 files refers to the Cyrillic script, which is here the target.) The
 standard system devised by Ljudevit Gaj.}
@@ -4530,6 +4524,17 @@
 the current language. Font dependent transforms are always enabled and
 cannot be disabled.
 
+\Describe{\ShowBabelTransforms}{\marg{string}}
+
+\New{25.7} Applies the current transforms to the string and shows in
+the |log| the transformations performed. Don’t rely on the current
+format, because it may change. In the process, penalties,
+discretionaries, etc., can be inserted, which are currently printed as
+a boxed ‘?’, as a boxed ‘US’ (because it’s the ‘unit separator’) or in
+another way. With this macros you can better understand what’s going
+on, so that you can debug the transforms. Use it only in the document
+body.
+
 \subsection{Support for \xetex{} interchar}
 \label{interchar}
 
@@ -4726,10 +4731,10 @@
 loaded. For example, if you load |LY1,LGR|, then it is set to |LY1|,
 but if you load |LY1,T2A| it is set to |T2A|. The symbol encodings
 |TS1|, |T3|, and |TS3| are not taken into account, since they are not
-used for ``ordinary'' text (they are stored in |\BabelNonText|, used
+used for “ordinary” text (they are stored in |\BabelNonText|, used
 in some special cases when no Latin encoding is explicitly set).
 
-The foregoing rules (which are applied ``at begin document'') cover
+The foregoing rules (which are applied “at begin document”) cover
 most of the cases. No assumption is made on characters above
 127, which may not follow the LICR conventions -- the goal is just
 to ensure most of the ASCII letters and symbols are the right ones.
@@ -4934,7 +4939,7 @@
   it can depend on the counter format.
 
   With |counters|, |\arabic| is not only considered L text always (with
-  |\babelsublr|, see below), but also an ``isolated'' block which does
+  |\babelsublr|, see below), but also an “isolated” block which does
   not interact with the surrounding chars. So, while |1.2| in R text is
   rendered in that order with |bidi=basic| (as a decimal number), in
   |\arabic{c1}.\arabic{c2}| the visual order is \textit{c2.c1}. Of
@@ -5279,13 +5284,13 @@
 the main exception being \luatex) require hyphenation patterns to be
 preloaded when a format is created (e.g., \LaTeX, Xe\LaTeX, pdf\LaTeX).
 \babel{} provides a tool which has become standard in many
-distributions and based on a ``configuration file'' named
+distributions and based on a “configuration file” named
 \file{language.dat}. The exact way this file is used depends on the
 distribution, so please, read the documentation for the latter (note
 also some distributions generate the file with some tool).
 
 \New{3.9q} With \luatex, however, patterns are loaded on the fly when
-requested by the language (except the ``0th'' language, typically
+requested by the language (except the “0th” language, typically
 \textsf{english}, which is preloaded always). You may want to have a
 local |language.dat| for a particular project (for example, a book on
 Chemistry). The loader for lua(e)tex is slightly different as it's not
@@ -5397,13 +5402,13 @@
   (high-level, which in turn may switch the font encoding). Usage of things
   like |\latintext| is deprecated (but not removed, for backward
   compatibility).
-\item Please, for ``private'' internal macros do not use the |\bbl@|
+\item Please, for “private” internal macros do not use the |\bbl@|
   prefix. It is used by \babel{} and it can lead to incompatibilities.
 \end{itemize}
 
 There are no special requirements for documenting your language files.
 Just provide a standalone document suited to your needs, as well as
-other files you think can be useful. A PDF and a ``readme'' are
+other files you think can be useful. A PDF and a “readme” are
 strongly recommended.
 
 \subsection{Guidelines for contributed languages}
@@ -5459,7 +5464,7 @@
 \DescribeMacro{\addlanguage}
 The macro |\addlanguage| is a non-outer version of the macro
 |\newlanguage|, defined in \file{plain.tex} version~3.x. Here
-``language'' is used in the \TeX{} sense of set of hyphenation
+“language” is used in the \TeX{} sense of set of hyphenation
 patterns.
 
 \DescribeMacro{\adddialect}
@@ -5468,7 +5473,7 @@
 languages for which no patterns are preloaded in the format. In such
 cases the default behavior of the \babel{} system is to define this
 language as a ‘dialect’ of the language for which the patterns were
-loaded as |\language0|. Here ``language'' is used in the \TeX{} sense
+loaded as |\language0|. Here “language” is used in the \TeX{} sense
 of set of hyphenation patterns, while “dialect”, which is misnomer,
 refers just to a language with the same hyphenation patterns as another
 (there is no relation with its linguistic meaning).
@@ -5650,12 +5655,12 @@
 shorthands this definition belongs to; the character (sequence) that
 makes up the shorthand, i.e., |~| or |"a|; and the code to be executed
 when the shorthand is encountered. (It does \textit{not} raise an
-error if the shorthand character has not been ``initiated''.)
+error if the shorthand character has not been “initiated”.)
 
-\DescribeMacro{\bbl at add@special} The \TeX book states: ``Plain \TeX\
+\DescribeMacro{\bbl at add@special} The \TeX book states: “Plain \TeX\
 includes a macro called |\dospecials| that is essentially a set macro,
 representing the set of all characters that have a special category
-code.'' \cite[p.~380]{DEK} It is used to set text `verbatim'. To make
+code.” \cite[p.~380]{DEK} It is used to set text `verbatim'. To make
 this work if more characters get a special category code, you have to
 add this character to the macro |\dospecials|. \LaTeX\ adds another
 macro called |\@sanitize| representing the same character set, but
@@ -5781,7 +5786,7 @@
 but this is discouraged -- an explicit name (or names) is much better
 and clearer.
 
-A ``selector'' selects a group of definition that are to be used, optionally
+A “selector” selects a group of definition that are to be used, optionally
 followed by extra info about the encodings to be used. The name
 |unicode| must be used for \luatex{} and \xetex{}. Without a selector,
 the LICR representation (i.e., with macros like |\~{n}| instead of |ñ|)
@@ -5906,7 +5911,7 @@
 transformation corresponding to the current charset or defined with
 the hook |stringprocess|).
 
-Use this command to define strings, without including any ``logic'' if
+Use this command to define strings, without including any “logic” if
 possible, which should be a separate macro. See the example above for
 the date.
 
@@ -6045,7 +6050,7 @@
 % There some additional |tex|, |def| and |lua| files.
 %
 % The \babel{} installer extends \textsf{docstrip} with a few
-% ``pseudo-guards'' to set ``variables'' used at installation time.
+% “pseudo-guards” to set “variables” used at installation time.
 % They are used with \texttt{<@name@>} at the appropriate places in the
 % source code and defined with either
 % $\langle\langle$\textit{name}=\textit{value}$\rangle\rangle$, or with
@@ -6076,8 +6081,8 @@
 % \section{Tools}
 %
 %    \begin{macrocode}
-%<<version=25.6>>
-%<<date=2025/03/27>>
+%<<version=25.7>>
+%<<date=2025/04/14>>
 %    \end{macrocode}
 %
 % \textbf{Do not use the following macros in \texttt{ldf} files. They
@@ -6137,8 +6142,8 @@
 % Because the code that is used in the handling of active characters
 % may need to look ahead, we take extra care to `throw' it over the
 % |\else| and |\fi| parts of an |\if|-statement\footnote{This code is
-% based on code presented in TUGboat vol. 12, no2, June 1991 in ``An
-% expansion Power Lemma'' by Sonja Maus.}. These macros will break if
+% based on code presented in TUGboat vol. 12, no2, June 1991 in “An
+% expansion Power Lemma” by Sonja Maus.}. These macros will break if
 % another |\if...\fi| statement appears in one of the arguments and it
 % is not enclosed in braces.
 %
@@ -6699,7 +6704,7 @@
 % which has been declared above or follow the syntax |<key>=<value>|,
 % the second one loads the requested languages, except the main one if
 % set with the key |main|, and the third one loads the latter. First,
-% we ``flag'' valid keys with a nil value.
+% we “flag” valid keys with a nil value.
 %
 %    \begin{macrocode}
 \let\bbl at opt@shorthands\@nnil
@@ -6930,7 +6935,7 @@
 % Otherwise raises an error.
 %
 % The argument of |\bbl at fixname| has to be a macro name, as it may get
-% ``fixed'' if casing (lc/uc) is wrong. It's an attempt to fix a
+% “fixed” if casing (lc/uc) is wrong. It's an attempt to fix a
 % long-standing bug when |\foreignlanguage| and the like appear in a
 % |\MakeXXXcase|. However, a lowercase form is not imposed to improve
 % backward compatibility (perhaps you defined a language named
@@ -7427,7 +7432,7 @@
 %
 % At the end of the environment we need to switch off the extra
 % definitions. The grouping mechanism of the environment will take
-% care of resetting the correct hyphenation rules and ``extras''.
+% care of resetting the correct hyphenation rules and “extras”.
 %
 %    \begin{macrocode}
 \expandafter\let\csname endotherlanguage*\endcsname\relax
@@ -7772,7 +7777,7 @@
 % The user command just parses the optional argument and creates a
 % new macro named |\bbl at e@<language>|. We register a hook at the
 % |afterextras| event which just executes this macro in a
-% ``complete'' selection (which, if undefined, is |\relax| and does
+% “complete” selection (which, if undefined, is |\relax| and does
 % nothing). This part is somewhat involved because we have to make
 % sure things are expanded the correct number of times.
 %
@@ -8235,8 +8240,8 @@
 % created, and |\active at char"| is a single token). In protected
 % contexts, it expands to |\protect "| or |\noexpand "| (i.e., with the
 % original |"|); otherwise |\active at char"| is executed. This macro in
-% turn expands to |\normal at char"| in ``safe'' contexts (e.g., |\label|),
-% but |\user at active"| in normal ``unsafe'' ones. The latter search a
+% turn expands to |\normal at char"| in “safe” contexts (e.g., |\label|),
+% but |\user at active"| in normal “unsafe” ones. The latter search a
 % definition in the user, language and system levels, in this order,
 % but if none is found, |\normal at char"| is used. However, a deactivated
 % shorthand (with |\bbl at deactivate| is defined as
@@ -8545,9 +8550,9 @@
 %
 % \macro{\bbl at restore@actives}
 % When the output routine kicks in while the active characters were
-% made ``safe'' this must be undone in the headers to prevent
+% made “safe” this must be undone in the headers to prevent
 % unexpected typeset results. For this situation we define a command to
-% make them ``unsafe'' again.
+% make them “unsafe” again.
 %
 %    \begin{macrocode}
 \def\bbl at restore@actives{\if at safe@actives\@safe at activesfalse\fi}
@@ -9337,7 +9342,7 @@
     {\lowercase{\csname bbl at hy@#1#2\@empty\endcsname}}}
 %    \end{macrocode}
 %
-% The following two commands are used to wrap the ``hyphen'' and
+% The following two commands are used to wrap the “hyphen” and
 % set the behavior of the rest of the word -- the version with a
 % single |@| is used when further hyphenation is allowed, while
 % that with |@@| if no more hyphens are allowed. In both cases, if
@@ -9346,7 +9351,7 @@
 %
 % There should not be a discretionary after a hyphen at the
 % beginning of a word, so it is prevented if preceded by a
-% skip. Unfortunately, this does handle cases like ``(-suffix)''.
+% skip. Unfortunately, this does handle cases like “(-suffix)”.
 % |\nobreak| is always preceded by |\leavevmode|, in case the
 % shorthand starts a paragraph.
 %
@@ -9370,7 +9375,7 @@
   \fi}
 %    \end{macrocode}
 %
-% Finally, we define the hyphen ``types''. Their names will not change,
+% Finally, we define the hyphen “types”. Their names will not change,
 % so you may use them in |ldf|'s. After a space, the |\mbox| in
 % |\bbl at hy@nobreak| is redundant.
 %
@@ -9608,9 +9613,9 @@
 % Now we define commands to be used inside |\StartBabelCommands|.
 %
 % \paragraph{Strings} The following macro is the actual definition
-% of |\SetString| when it is ``active''
+% of |\SetString| when it is “active”
 %
-% First save the ``switcher''. Create it if undefined. Strings are
+% First save the “switcher”. Create it if undefined. Strings are
 % defined only if undefined (i.e., like |\providescommmand|). With
 % the event |stringprocess| you can preprocess the string by
 % manipulating the value of |\BabelString|. If there are several
@@ -9643,7 +9648,7 @@
 % |\StartBabelCommands|. The current definition is somewhat complicated
 % because we need a count, but |\count@| is not under our control
 % (remember |\SetString| may call hooks). Instead of defining a
-% dedicated count, we just ``pre-expand'' its value.
+% dedicated count, we just “pre-expand” its value.
 %
 %    \begin{macrocode}
 %<<*Macros local to BabelCommands>>
@@ -11373,7 +11378,7 @@
 %    \end{macrocode}
 %
 % \textbf{Dates} will require some macros for the basic formatting.
-% They may be redefined by language, so ``semi-public'' names (camel
+% They may be redefined by language, so “semi-public” names (camel
 % case) are used. Oddly enough, the CLDR places particles like “de”
 % inconsistently in either in the date or in the month name. Note after
 % |\bbl at replace| |\toks@| contains the resulting string, which is used
@@ -12540,7 +12545,7 @@
 % encodings are currently stored in |\@fontenc at load@list|. If a
 % non-ASCII has been loaded, we define versions of |\TeX| and |\LaTeX|
 % for them using |\ensureascii|. The default ASCII encoding is set,
-% too (in reverse order): the ``main'' encoding (when the document
+% too (in reverse order): the “main” encoding (when the document
 % begins), the last loaded, or |OT1|.
 %
 % \macro{\ensureascii}
@@ -14488,7 +14493,7 @@
 % The default setup preloads the first language into the format. This
 % is intended mainly for `english', so that it's available without
 % further intervention from the user.  To avoid duplicating it, the
-% following rule applies: if the ``0th'' language and the first
+% following rule applies: if the “0th” language and the first
 % language in |language.dat| have the same name then just ignore the
 % latter. If there are new synonymous, the are added, but note if the
 % language patterns have not been preloaded they won't at run time.
@@ -14496,7 +14501,7 @@
 % Other preloaded languages could be read twice, if they have been
 % preloaded into the format. This is not optimal, but it shouldn't
 % happen very often -- with \luatex{} patterns are best loaded when
-% the document is typeset, and the ``0th'' language is preloaded just
+% the document is typeset, and the “0th” language is preloaded just
 % for backwards compatibility.
 %
 % As of 1.1b, lua(e)tex is taken into account. Formerly, loading of
@@ -15498,7 +15503,8 @@
               {0x20000, 0x2A6DF}, {0x2A700, 0x2B73F},
               {0x2B740, 0x2B81F}, {0x2B820, 0x2CEAF},
               {0x2CEB0, 0x2EBEF}, {0x2F800, 0x2FA1F}},
-  ['Hebr'] = {{0x0590, 0x05FF}},
+  ['Hebr'] = {{0x0590, 0x05FF},
+              {0xFB1F, 0xFB4E}}, % <- Includes some <reserved>
   ['Jpan'] = {{0x3000, 0x303F}, {0x3040, 0x309F}, {0x30A0, 0x30FF},
               {0x4E00, 0x9FAF}, {0xFF00, 0xFFEF}},
   ['Khmr'] = {{0x1780, 0x17FF}, {0x19E0, 0x19FF}},
@@ -15851,6 +15857,12 @@
   \bbl at ifunset{bbl at ATR@#1@\languagename @}%
     {\bbl at error{transform-not-available-b}{#1}{}{}}%
     {\bbl at csarg\unsetattribute{ATR@#1@\languagename @}}}
+%    \end{macrocode}
+%
+% The following two macros load the Lua code for transforms, but only
+% once. The only difference is in |add_after| and |add_before|.
+%
+%    \begin{macrocode}
 \def\bbl at activateposthyphen{%
   \let\bbl at activateposthyphen\relax
   \ifx\bbl at attr@hboxed\@undefined
@@ -15875,6 +15887,22 @@
   }}
 %    \end{macrocode}
 %
+% The code in |babel-transforms.lua| prints at some points the current
+% string being transformed. This macro first make sure this file is
+% loaded. Then, activates temporarily this feature and typeset inside a
+% box the text in the argument.
+%        
+%    \begin{macrocode}
+\newcommand\ShowBabelTransforms[1]{%
+  \bbl at activateprehyphen
+  \bbl at activateposthyphen
+  \begingroup 
+    \directlua{ Babel.show_transforms = true }%
+    \setbox\z@\vbox{#1}%
+    \directlua{ Babel.show_transforms = false }%
+  \endgroup}
+%    \end{macrocode}
+%
 % The following experimental (and unfinished) macro applies the
 % prehyphenation transforms for the current locale to a string
 % (characters and spaces) and processes it in a fully expandable way
@@ -16736,6 +16764,8 @@
   return (node.lang == Babel.nohyphenation)
 end
 
+Babel.show_transforms = false
+
 -- Merging both functions doesn't seen feasible, because there are too
 -- many differences.
 Babel.fetch_subtext[0] = function(head)
@@ -16795,6 +16825,7 @@
   if word_string:sub(-1) == ' ' then
     word_string = word_string:sub(1,-2)
   end
+  if Babel.show_transforms then texio.write_nl(word_string) end
   word_string = unicode.utf8.gsub(word_string, Babel.us_char .. '+$', '')
   return word_string, word_nodes, item, lang
 end
@@ -16817,15 +16848,15 @@
 
     elseif item.id == 29 then
       if item.lang == lang or lang == nil then
-        if (item.char ~= 124) and (item.char ~= 61) then -- not =, not |
-          lang = lang or item.lang
-          if node.has_attribute(item, Babel.attr_hboxed) then
-            word_string = word_string .. Babel.us_char
-          else
-            word_string = word_string .. unicode.utf8.char(item.char)
-          end
-          word_nodes[#word_nodes+1] = item
+        lang = lang or item.lang
+        if node.has_attribute(item, Babel.attr_hboxed) then
+          word_string = word_string .. Babel.us_char
+        elseif (item.char == 124) or (item.char == 61) then -- not =, not |   
+          word_string = word_string .. Babel.us_char
+        else
+          word_string = word_string .. unicode.utf8.char(item.char)
         end
+        word_nodes[#word_nodes+1] = item
       else
         break
       end
@@ -16862,7 +16893,7 @@
 
     item = item.next
   end
-
+  if Babel.show_transforms then texio.write_nl(word_string) end
   word_string = unicode.utf8.gsub(word_string, Babel.us_char .. '+$', '')
   return word_string, word_nodes, item, lang
 end
@@ -16884,6 +16915,10 @@
 
   local word_head = head
 
+  if Babel.show_transforms then
+    texio.write_nl('\n==== Showing ' .. (mode == 0 and 'pre' or 'post') .. 'hyphenation ====')
+  end
+
   while true do  -- for each subtext block
 
     local w, w_nodes, nw, lang = Babel.fetch_subtext[mode](word_head)
@@ -17021,7 +17056,7 @@
           if not enabled then
             last_match = save_last
             goto next
-          
+
           elseif crep and next(crep) == nil then -- = {}
             if step == 0 then
               last_match = save_last    -- Optimization
@@ -17174,6 +17209,7 @@
 
         end  -- for each replacement
 
+        if Babel.show_transforms then texio.write_nl('>  ' .. w) end
         if Babel.debug then
             print('.....', '/')
             Babel.debug_hyph(w, w_nodes, sc, first, last, last_match)
@@ -17191,6 +17227,8 @@
     ::next::
     word_head = nw
   end  -- for substring
+
+  if Babel.show_transforms then texio.write_nl(string.rep('-', 32) .. '\n') end
   return head
 end
 
@@ -23397,7 +23435,7 @@
 %    \end{macrocode}
 %
 % \textbf{Mirroring.}  Each chunk of text in a certain language is
-% considered a ``closed'' sequence.  If <r on r> and <l on l>, it's
+% considered a “closed” sequence.  If <r on r> and <l on l>, it's
 % clearly <r> and <l>, resptly, but with other combinations depends on
 % outer. From all these, we select only those resolving <on> $\to$
 % <r>. At the beginning (when |last_lr| is nil) of an R text, they are
@@ -23582,11 +23620,11 @@
   local fontmap = Babel.fontmap
 
   for item in node.traverse(head) do
-    
+
     -- Mask: DxxxPPTT (Done, Pardir [0-2], Textdir [0-2])
     locale_d = node.get_attribute(item, ATDIR)
     node.set_attribute(item, ATDIR, 0x80)
-    
+
     -- In what follows, #node is the last (previous) node, because the
     -- current one is not added until we start processing the neutrals.
     -- three cases: glyph, dir, otherwise
@@ -24936,7 +24974,7 @@
 % in a plain-based \TeX-format.
 % When asked he responded:
 % \begin{quote}
-%   That file name is ``sacred'', and if anybody changes it they will
+%   That file name is “sacred”, and if anybody changes it they will
 %   cause severe upward/downward compatibility headaches.
 %
 %   People can have a file localhyphen.tex or whatever they like,

Modified: trunk/Master/texmf-dist/source/latex/babel/babel.ins
===================================================================
--- trunk/Master/texmf-dist/source/latex/babel/babel.ins	2025-04-15 17:54:06 UTC (rev 74952)
+++ trunk/Master/texmf-dist/source/latex/babel/babel.ins	2025-04-15 19:57:54 UTC (rev 74953)
@@ -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/03/27}
+\def\filedate{2025/04/14}
 \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-15 17:54:06 UTC (rev 74952)
+++ trunk/Master/texmf-dist/source/latex/babel/bbcompat.dtx	2025-04-15 19:57:54 UTC (rev 74953)
@@ -30,7 +30,7 @@
 %
 % \iffalse
 %<*dtx>
-\ProvidesFile{bbcompat.dtx}[2025/03/27 v25.6]
+\ProvidesFile{bbcompat.dtx}[2025/04/14 v25.7]
 %</dtx>
 %
 %% File 'bbcompat.dtx'

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

Deleted: trunk/Master/texmf-dist/tex/generic/babel/babel-bidi-basic-0.lua
===================================================================
--- trunk/Master/texmf-dist/tex/generic/babel/babel-bidi-basic-0.lua	2025-04-15 17:54:06 UTC (rev 74952)
+++ trunk/Master/texmf-dist/tex/generic/babel/babel-bidi-basic-0.lua	2025-04-15 19:57:54 UTC (rev 74953)
@@ -1,504 +0,0 @@
---
--- This is file `babel-bidi-basic.lua',
--- generated with the docstrip utility.
---
--- The original source files were:
---
--- babel.dtx  (with options: `basic')
--- 
---
--- Copyright (C) 2012-2025 Javier Bezos and Johannes L. Braams.
--- Copyright (C) 1989-2012 Johannes L. Braams and
---           any individual authors listed elsewhere in this file.
--- All rights reserved.
---
---
--- This file is part of the Babel system.
--- --------------------------------------
---
--- It may be distributed and/or modified under the
--- conditions of the LaTeX Project Public License, either version 1.3
--- of this license or (at your option) any later version.
--- The latest version of this license is in
---   http://www.latex-project.org/lppl.txt
--- and version 1.3 or later is part of all distributions of LaTeX
--- version 2003/12/01 or later.
---
--- 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
--- extension |.ins|) which are part of the distribution.
---
--- e.g., Babel.fontmap[1][<prefontid>]=<dirfontid>
-
-Babel.fontmap = Babel.fontmap or {}
-Babel.fontmap[0] = {}      -- l
-Babel.fontmap[1] = {}      -- r
-Babel.fontmap[2] = {}      -- al/an
-
--- To cancel mirroring. Also OML, OMS, U?
-Babel.symbol_fonts = Babel.symbol_fonts or {}
-Babel.symbol_fonts[font.id('tenln')] = true
-Babel.symbol_fonts[font.id('tenlnw')] = true
-Babel.symbol_fonts[font.id('tencirc')] = true
-Babel.symbol_fonts[font.id('tencircw')] = true
-
-Babel.bidi_enabled = true
-Babel.mirroring_enabled = true
-
-require('babel-data-bidi.lua')
-
-local characters = Babel.characters
-local ranges = Babel.ranges
-
-local DIR = node.id('dir')
-local GLYPH = node.id('glyph')
-
-local function insert_implicit(head, state, outer)
-  local new_state = state
-  if state.sim and state.eim and state.sim ~= state.eim then
-    dir = ((outer == 'r') and 'TLT' or 'TRT') -- i.e., reverse
-    local d = node.new(DIR)
-    d.dir = '+' .. dir
-    node.insert_before(head, state.sim, d)
-    local d = node.new(DIR)
-    d.dir = '-' .. dir
-    node.insert_after(head, state.eim, d)
-  end
-  new_state.sim, new_state.eim = nil, nil
-  return head, new_state
-end
-
-local function insert_numeric(head, state)
-  local new
-  local new_state = state
-  if state.san and state.ean and state.san ~= state.ean then
-    local d = node.new(DIR)
-    d.dir = '+TLT'
-    _, new = node.insert_before(head, state.san, d)
-    if state.san == state.sim then state.sim = new end
-    local d = node.new(DIR)
-    d.dir = '-TLT'
-    _, new = node.insert_after(head, state.ean, d)
-    if state.ean == state.eim then state.eim = new end
-  end
-  new_state.san, new_state.ean = nil, nil
-  return head, new_state
-end
-
-local function glyph_not_symbol_font(node)
-  if node.id == GLYPH then
-    return not Babel.symbol_fonts[node.font]
-  else
-   return false
-  end
-end
-
--- TODO - \hbox with an explicit dir can lead to wrong results
--- <R \hbox dir TLT{<R>}> and <L \hbox dir TRT{<L>}>. A small attempt
--- was made to improve the situation, but the problem is the 3-dir
--- model in babel/Unicode and the 2-dir model in LuaTeX don't fit
--- well.
-
-function Babel.bidi(head, ispar, hdir)
-  local d   -- d is used mainly for computations in a loop
-  local prev_d = ''
-  local new_d = false
-
-  local nodes = {}
-  local outer_first = nil
-  local inmath = false
-
-  local glue_d = nil
-  local glue_i = nil
-
-  local has_en = false
-  local first_et = nil
-
-  local has_hyperlink = false
-
-  local ATDIR = Babel.attr_dir
-  local attr_d, temp
-  local locale_d
-
-  local save_outer
-  local locale_d = node.get_attribute(head, ATDIR)
-  if locale_d then
-    locale_d = locale_d & 0x3
-    save_outer = (locale_d == 0 and 'l') or
-                 (locale_d == 1 and 'r') or
-                 (locale_d == 2 and 'al')
-  elseif ispar then            -- Or error? Shouldn't happen
-    save_outer = ('TRT' == tex.pardir) and 'r' or 'l'
-  else                         -- Or error? Shouldn't happen
-    save_outer = ('TRT' == hdir) and 'r' or 'l'
-  end
-    -- when the callback is called, we are just _after_ the box,
-    -- and the textdir is that of the surrounding text
-  -- if not ispar and hdir ~= tex.textdir then
-  --   save_outer = ('TRT' == hdir) and 'r' or 'l'
-  -- end
-  local outer = save_outer
-  local last = outer
-  -- 'al' is only taken into account in the first, current loop
-  if save_outer == 'al' then save_outer = 'r' end
-
-  local fontmap = Babel.fontmap
-
-  for item in node.traverse(head) do
-
-    -- Mask: DxxxPPTT (Done, Pardir, Textdir)
-    locale_d = node.get_attribute(item, ATDIR)
-    texio.write_nl(locale_d or '???')
-    node.set_attribute(item, ATDIR, 0x80)
-
-    -- In what follows, #node is the last (previous) node, because the
-    -- current one is not added until we start processing the neutrals.
-    -- three cases: glyph, dir, otherwise
-    if glyph_not_symbol_font(item)
-       or (item.id == 7 and item.subtype == 2) then
-
-      if locale_d == 0x80 then goto nextnode end
-
-      local d_font = nil
-      local item_r
-      if item.id == 7 and item.subtype == 2 then
-        item_r = item.replace    -- automatic discs have just 1 glyph
-      else
-        item_r = item
-      end
-
-      local chardata = characters[item_r.char]
-      d = chardata and chardata.d or nil
-      if not d or d == 'nsm' then
-        for nn, et in ipairs(ranges) do
-          if item_r.char < et[1] then
-            break
-          elseif item_r.char <= et[2] then
-            if not d then d = et[3]
-            elseif d == 'nsm' then d_font = et[3]
-            end
-            break
-          end
-        end
-      end
-      d = d or 'l'
-
-      -- A short 'pause' in bidi for mapfont
-      -- %%%% TODO. move if fontmap here
-      d_font = d_font or d
-      d_font = (d_font == 'l' and 0) or
-               (d_font == 'nsm' and 0) or
-               (d_font == 'r' and 1) or
-               (d_font == 'al' and 2) or
-               (d_font == 'an' and 2) or nil
-      if d_font and fontmap and fontmap[d_font][item_r.font] then
-        item_r.font = fontmap[d_font][item_r.font]
-      end
-
-      if new_d then
-        table.insert(
-          nodes, {nil, (outer == 'l') and 'l' or 'r', nil, locale_d})
-        if inmath then
-          attr_d = 0
-        else
-          attr_d = locale_d & 0x3
-        end
-        if attr_d == 1 then
-          outer_first = 'r'
-          last = 'r'
-        elseif attr_d == 2 then
-          outer_first = 'r'
-          last = 'al'
-        else
-          outer_first = 'l'
-          last = 'l'
-        end
-        outer = last
-        has_en = false
-        first_et = nil
-        new_d = false
-      end
-
-      if glue_d then
-        if (d == 'l' and 'l' or 'r') ~= glue_d then
-           table.insert(nodes, {glue_i, 'on', nil, locale_d})
-        end
-        glue_d = nil
-        glue_i = nil
-      end
-
-    elseif item.id == DIR then
-      d = nil
-
-      if head ~= item then new_d = true end
-
-    elseif item.id == node.id'glue' and item.subtype == 13 then
-      glue_d = d
-      glue_i = item
-      d = nil
-
-    elseif item.id == node.id'math' then
-      inmath = (item.subtype == 0)
-
-    elseif item.id == 8 and item.subtype == 19 then
-      has_hyperlink = true
-
-    else
-      d = nil
-    end
-
-    -- AL <= EN/ET/ES     -- W2 + W3 + W6
-    if last == 'al' and d == 'en' then
-      d = 'an'           -- W3
-    elseif last == 'al' and (d == 'et' or d == 'es') then
-      d = 'on'           -- W6
-    end
-
-    -- EN + CS/ES + EN     -- W4
-    if d == 'en' and #nodes >= 2 then
-      if (nodes[#nodes][2] == 'es' or nodes[#nodes][2] == 'cs')
-          and nodes[#nodes-1][2] == 'en' then
-        nodes[#nodes][2] = 'en'
-      end
-    end
-
-    -- AN + CS + AN        -- W4 too, because uax9 mixes both cases
-    if d == 'an' and #nodes >= 2 then
-      if (nodes[#nodes][2] == 'cs')
-          and nodes[#nodes-1][2] == 'an' then
-        nodes[#nodes][2] = 'an'
-      end
-    end
-
-    -- ET/EN               -- W5 + W7->l / W6->on
-    if d == 'et' then
-      first_et = first_et or (#nodes + 1)
-    elseif d == 'en' then
-      has_en = true
-      first_et = first_et or (#nodes + 1)
-    elseif first_et then       -- d may be nil here !
-      if has_en then
-        if last == 'l' then
-          temp = 'l'    -- W7
-        else
-          temp = 'en'   -- W5
-        end
-      else
-        temp = 'on'     -- W6
-      end
-      for e = first_et, #nodes do
-        if glyph_not_symbol_font(nodes[e][1]) then nodes[e][2] = temp end
-      end
-      first_et = nil
-      has_en = false
-    end
-
-    -- Force mathdir in math if ON (currently works as expected only
-    -- with 'l')
-
-    if inmath and d == 'on' then
-      d = ('TRT' == tex.mathdir) and 'r' or 'l'
-    end
-
-    if d then
-      if d == 'al' then
-        d = 'r'
-        last = 'al'
-      elseif d == 'l' or d == 'r' then
-        last = d
-      end
-      prev_d = d
-      table.insert(nodes, {item, d, outer_first, locale_d})
-    end
-
-    outer_first = nil
-
-    ::nextnode::
-
-  end -- for each node
-
-  -- TODO -- repeated here in case EN/ET is the last node. Find a
-  -- better way of doing things:
-  if first_et then       -- dir may be nil here !
-    if has_en then
-      if last == 'l' then
-        temp = 'l'    -- W7
-      else
-        temp = 'en'   -- W5
-      end
-    else
-      temp = 'on'     -- W6
-    end
-    for e = first_et, #nodes do
-      if glyph_not_symbol_font(nodes[e][1]) then nodes[e][2] = temp end
-    end
-  end
-
-  -- dummy node, to close things
-  table.insert(
-    nodes, {nil, (outer == 'l') and 'l' or 'r', nil, locale_d})
-
-  ---------------  NEUTRAL -----------------
-
-  outer = save_outer
-  last = outer
-
-  local first_on = nil
-
-  for q = 1, #nodes do
-    local item
-
-    local outer_first = nodes[q][3]
-    outer = outer_first or outer
-    last = outer_first or last
-
-    local d = nodes[q][2]
-    if d == 'an' or d == 'en' then d = 'r' end
-    if d == 'cs' or d == 'et' or d == 'es' then d = 'on' end --- W6
-
-    if d == 'on' then
-      first_on = first_on or q
-    elseif first_on then
-      if last == d then
-        temp = d
-      else
-        temp = outer
-      end
-      for r = first_on, q - 1 do
-        nodes[r][2] = temp
-        item = nodes[r][1]    -- MIRRORING
-        if Babel.mirroring_enabled and glyph_not_symbol_font(item)
-             and temp == 'r' and characters[item.char] then
-          local font_mode = ''
-          if item.font > 0 and font.fonts[item.font].properties then
-            font_mode = font.fonts[item.font].properties.mode
-          end
-          if font_mode ~= 'harf' and font_mode ~= 'plug' and
-              (nodes[r][4] or 0) & 0x3 > 0 then
-            item.char = characters[item.char].m or item.char
-          end
-        end
-      end
-      first_on = nil
-    end
-
-    if d == 'r' or d == 'l' then last = d end
-  end
-
-  --------------  IMPLICIT, REORDER ----------------
-
-  outer = save_outer
-  last = outer
-
-  local state = {}
-  state.has_r = false
-
-  for q = 1, #nodes do
-
-    local item = nodes[q][1]
-
-    outer = nodes[q][3] or outer
-
-    local d = nodes[q][2]
-
-    if d == 'nsm' then d = last end             -- W1
-    if d == 'en' then d = 'an' end
-    local isdir = (d == 'r' or d == 'l')
-
-    if outer == 'l' and d == 'an' then
-      state.san = state.san or item
-      state.ean = item
-    elseif state.san then
-      head, state = insert_numeric(head, state)
-    end
-
-    if outer == 'l' then
-      if d == 'an' or d == 'r' then     -- im -> implicit
-        if d == 'r' then state.has_r = true end
-        state.sim = state.sim or item
-        state.eim = item
-      elseif d == 'l' and state.sim and state.has_r then
-        head, state = insert_implicit(head, state, outer)
-      elseif d == 'l' then
-        state.sim, state.eim, state.has_r = nil, nil, false
-      end
-    else
-      if d == 'an' or d == 'l' then
-        if nodes[q][3] then -- nil except after an explicit dir
-          state.sim = item  -- so we move sim 'inside' the group
-        else
-          state.sim = state.sim or item
-        end
-        state.eim = item
-      elseif d == 'r' and state.sim then
-        head, state = insert_implicit(head, state, outer)
-      elseif d == 'r' then
-        state.sim, state.eim = nil, nil
-      end
-    end
-
-    if isdir then
-      last = d           -- Don't search back - best save now
-    elseif d == 'on' and state.san  then
-      state.san = state.san or item
-      state.ean = item
-    end
-
-  end
-
-  head = node.prev(head) or head
-  --- FIXES ---
-  if has_hyperlink then
-    local flag, linking = 0, 0
-    for item in node.traverse(head) do
-      if item.id == DIR then
-        if item.dir == '+TRT' or item.dir == '+TLT' then
-          flag = flag + 1
-        elseif item.dir == '-TRT' or item.dir == '-TLT' then
-          flag = flag - 1
-        end
-      elseif item.id == 8 and item.subtype == 19 then
-        linking = flag
-      elseif item.id == 8 and item.subtype == 20 then
-        if linking > 0 then
-          if item.prev.id == DIR and
-              (item.prev.dir == '-TRT' or item.prev.dir == '-TLT') then
-            d = node.new(DIR)
-            d.dir = item.prev.dir
-            node.remove(head, item.prev)
-            node.insert_after(head, item, d)
-          end
-        end
-        linking = 0
-      end
-    end
-  end
-
-  for item in node.traverse_id(10, head) do
-    local p = item
-    local flag = false
-    while p.prev and p.prev.id == 14 do
-      flag = true
-      p = p.prev
-    end
-    if flag then
-      node.insert_before(head, p, node.copy(item))
-      node.remove(head,item)
-    end
-  end
-
-  return head
-end
--- Make sure anything is marked as 'bidi done' (including nodes inserted
--- after the babel algorithm). 128 = 1000 0000.
-function Babel.unset_atdir(head)
-  local ATDIR = Babel.attr_dir
-  for item in node.traverse(head) do
-    node.set_attribute(item, ATDIR, 128)
-  end
-  return head
-end

Deleted: trunk/Master/texmf-dist/tex/generic/babel/babel-bidi-basic-1.lua
===================================================================
--- trunk/Master/texmf-dist/tex/generic/babel/babel-bidi-basic-1.lua	2025-04-15 17:54:06 UTC (rev 74952)
+++ trunk/Master/texmf-dist/tex/generic/babel/babel-bidi-basic-1.lua	2025-04-15 19:57:54 UTC (rev 74953)
@@ -1,522 +0,0 @@
---
--- This is file `babel-bidi-basic.lua',
--- generated with the docstrip utility.
---
--- The original source files were:
---
--- babel.dtx  (with options: `basic')
--- 
---
--- Copyright (C) 2012-2025 Javier Bezos and Johannes L. Braams.
--- Copyright (C) 1989-2012 Johannes L. Braams and
---           any individual authors listed elsewhere in this file.
--- All rights reserved.
---
---
--- This file is part of the Babel system.
--- --------------------------------------
---
--- It may be distributed and/or modified under the
--- conditions of the LaTeX Project Public License, either version 1.3
--- of this license or (at your option) any later version.
--- The latest version of this license is in
---   http://www.latex-project.org/lppl.txt
--- and version 1.3 or later is part of all distributions of LaTeX
--- version 2003/12/01 or later.
---
--- 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
--- extension |.ins|) which are part of the distribution.
---
--- e.g., Babel.fontmap[1][<prefontid>]=<dirfontid>
-
-Babel.fontmap = Babel.fontmap or {}
-Babel.fontmap[0] = {}      -- l
-Babel.fontmap[1] = {}      -- r
-Babel.fontmap[2] = {}      -- al/an
-
--- To cancel mirroring. Also OML, OMS, U?
-Babel.symbol_fonts = Babel.symbol_fonts or {}
-Babel.symbol_fonts[font.id('tenln')] = true
-Babel.symbol_fonts[font.id('tenlnw')] = true
-Babel.symbol_fonts[font.id('tencirc')] = true
-Babel.symbol_fonts[font.id('tencircw')] = true
-
-Babel.bidi_enabled = true
-Babel.mirroring_enabled = true
-
-require('babel-data-bidi.lua')
-
-local characters = Babel.characters
-local ranges = Babel.ranges
-
-local DIR = node.id('dir')
-local GLYPH = node.id('glyph')
-
-local function insert_implicit(head, state, outer)
-  local new_state = state
-  if state.sim and state.eim and state.sim ~= state.eim then
-    dir = ((outer == 'r') and 'TLT' or 'TRT') -- i.e., reverse
-    local d = node.new(DIR)
-    d.dir = '+' .. dir
-    node.insert_before(head, state.sim, d)
-    local d = node.new(DIR)
-    d.dir = '-' .. dir
-    node.insert_after(head, state.eim, d)
-  end
-  new_state.sim, new_state.eim = nil, nil
-  return head, new_state
-end
-
-local function insert_numeric(head, state)
-  local new
-  local new_state = state
-  if state.san and state.ean and state.san ~= state.ean then
-    local d = node.new(DIR)
-    d.dir = '+TLT'
-    _, new = node.insert_before(head, state.san, d)
-    if state.san == state.sim then state.sim = new end
-    local d = node.new(DIR)
-    d.dir = '-TLT'
-    _, new = node.insert_after(head, state.ean, d)
-    if state.ean == state.eim then state.eim = new end
-  end
-  new_state.san, new_state.ean = nil, nil
-  return head, new_state
-end
-
-local function glyph_not_symbol_font(node)
-  if node.id == GLYPH then
-    return not Babel.symbol_fonts[node.font]
-  else
-   return false
-  end
-end
-
--- TODO - \hbox with an explicit dir can lead to wrong results
--- <R \hbox dir TLT{<R>}> and <L \hbox dir TRT{<L>}>. A small attempt
--- was made to improve the situation, but the problem is the 3-dir
--- model in babel/Unicode and the 2-dir model in LuaTeX don't fit
--- well.
-
-function Babel.bidi(head, ispar, hdir)
-  local d   -- d is used mainly for computations in a loop
-  local prev_d = ''
-  local new_d = false
-
-  local nodes = {}
-  local outer_first = nil
-  local inmath = false
-
-  local glue_d = nil
-  local glue_i = nil
-
-  local has_en = false
-  local first_et = nil
-
-  local has_hyperlink = false
-
-  local ATDIR = Babel.attr_dir
-  local attr_d, temp
-  local locale_d
-
-  local save_outer
-  local locale_d = node.get_attribute(head, ATDIR)
-  if locale_d then
-    locale_d = locale_d & 0x3
-    save_outer = (locale_d == 0 and 'l') or
-                 (locale_d == 1 and 'r') or
-                 (locale_d == 2 and 'al')
-    texio.write_nl('++ ' .. save_outer)
-  elseif ispar then             -- Or error? Shouldn't happen
-    texio.write_nl('++ P')
-    save_outer = ('TRT' == tex.pardir) and 'r' or 'l'
-  else          
-    texio.write_nl('++ H')      -- Or error? Shouldn't happen
-    save_outer = ('TRT' == hdir) and 'r' or 'l'
-  end
-  -- texio.write('hdir=' .. tex.pardir)
-  texio.write(save_outer)
-    -- when the callback is called, we are just _after_ the box,
-    -- and the textdir is that of the surrounding text
-  -- if not ispar and hdir ~= tex.textdir then
-  --   save_outer = ('TRT' == hdir) and 'r' or 'l'
-  -- end
-  local outer = save_outer
-  local last = outer
-  if head.id == DIR then
-     outer = 'l'
-  end
-  -- 'al' is only taken into account in the first, current loop
-  if save_outer == 'al' then save_outer = 'r' end
-
-  local fontmap = Babel.fontmap
-
-  for item in node.traverse(head) do
-
-    -- Mask: DxxxPPTT (Done, Pardir [0-2], Textdir [0-2])
-    locale_d = node.get_attribute(item, ATDIR)
-    --texio.write_nl('ld=' .. (locale_d or '?'))
-    node.set_attribute(item, ATDIR, 0x80)
-
-    -- In what follows, #node is the last (previous) node, because the
-    -- current one is not added until we start processing the neutrals.
-    -- three cases: glyph, dir, otherwise
-    if glyph_not_symbol_font(item)
-       or (item.id == 7 and item.subtype == 2) then
-
-      if locale_d == 0x80 then goto nextnode end
-
-      local d_font = nil
-      local item_r
-      if item.id == 7 and item.subtype == 2 then
-        item_r = item.replace    -- automatic discs have just 1 glyph
-      else
-        item_r = item
-      end
-
-      local chardata = characters[item_r.char]
-      d = chardata and chardata.d or nil
-      if not d or d == 'nsm' then
-        for nn, et in ipairs(ranges) do
-          if item_r.char < et[1] then
-            break
-          elseif item_r.char <= et[2] then
-            if not d then d = et[3]
-            elseif d == 'nsm' then d_font = et[3]
-            end
-            break
-          end
-        end
-      end
-      d = d or 'l'
-
-      -- A short 'pause' in bidi for mapfont
-      -- %%%% TODO. move if fontmap here
-      d_font = d_font or d
-      d_font = (d_font == 'l' and 0) or
-               (d_font == 'nsm' and 0) or
-               (d_font == 'r' and 1) or
-               (d_font == 'al' and 2) or
-               (d_font == 'an' and 2) or nil
-      if d_font and fontmap and fontmap[d_font][item_r.font] then
-        item_r.font = fontmap[d_font][item_r.font]
-      end
-
-      if new_d then
-        table.insert(
-          nodes, {nil, (outer == 'l') and 'l' or 'r', nil, locale_d})
-        if inmath then
-          attr_d = 0
-        else
-          attr_d = locale_d & 0x3
-        end
-        if attr_d == 1 then
-          outer_first = 'r'
-          last = 'r'
-        elseif attr_d == 2 then
-          outer_first = 'r'
-          last = 'al'
-        else
-          outer_first = 'l'
-          last = 'l'
-        end
-        outer = last
-        has_en = false
-        first_et = nil
-        new_d = false
-      end
-
-      if glue_d then
-        if (d == 'l' and 'l' or 'r') ~= glue_d then
-           table.insert(nodes, {glue_i, 'on', nil, locale_d})
-        end
-        glue_d = nil
-        glue_i = nil
-      end
-
-    elseif item.id == DIR then
-      d = nil
-
-      if head ~= item then new_d = true end
-     -- new_d = true
-
-    elseif item.id == node.id'glue' and item.subtype == 13 then
-      glue_d = d
-      glue_i = item
-      d = nil
-
-    elseif item.id == node.id'math' then
-      inmath = (item.subtype == 0)
-
-    elseif item.id == 8 and item.subtype == 19 then
-      has_hyperlink = true
-
-    else
-      d = nil
-    end
-
-    -- AL <= EN/ET/ES     -- W2 + W3 + W6
-    if last == 'al' and d == 'en' then
-      d = 'an'           -- W3
-    elseif last == 'al' and (d == 'et' or d == 'es') then
-      d = 'on'           -- W6
-    end
-
-    -- EN + CS/ES + EN     -- W4
-    if d == 'en' and #nodes >= 2 then
-      if (nodes[#nodes][2] == 'es' or nodes[#nodes][2] == 'cs')
-          and nodes[#nodes-1][2] == 'en' then
-        nodes[#nodes][2] = 'en'
-      end
-    end
-
-    -- AN + CS + AN        -- W4 too, because uax9 mixes both cases
-    if d == 'an' and #nodes >= 2 then
-      if (nodes[#nodes][2] == 'cs')
-          and nodes[#nodes-1][2] == 'an' then
-        nodes[#nodes][2] = 'an'
-      end
-    end
-
-    -- ET/EN               -- W5 + W7->l / W6->on
-    if d == 'et' then
-      first_et = first_et or (#nodes + 1)
-    elseif d == 'en' then
-      has_en = true
-      first_et = first_et or (#nodes + 1)
-    elseif first_et then       -- d may be nil here !
-      if has_en then
-        if last == 'l' then
-          temp = 'l'    -- W7
-        else
-          temp = 'en'   -- W5
-        end
-      else
-        temp = 'on'     -- W6
-      end
-      for e = first_et, #nodes do
-        if glyph_not_symbol_font(nodes[e][1]) then nodes[e][2] = temp end
-      end
-      first_et = nil
-      has_en = false
-    end
-
-    -- Force mathdir in math if ON (currently works as expected only
-    -- with 'l')
-
-    if inmath and d == 'on' then
-      d = ('TRT' == tex.mathdir) and 'r' or 'l'
-    end
-
-    if d then
-      if d == 'al' then
-        d = 'r'
-        last = 'al'
-      elseif d == 'l' or d == 'r' then
-        last = d
-      end
-      prev_d = d
-      table.insert(nodes, {item, d, outer_first, locale_d})
-    end
-
-    outer_first = nil
-
-    ::nextnode::
-    
-  end -- for each node
-
-  -- TODO -- repeated here in case EN/ET is the last node. Find a
-  -- better way of doing things:
-  if first_et then       -- dir may be nil here !
-    if has_en then
-      if last == 'l' then
-        temp = 'l'    -- W7
-      else
-        temp = 'en'   -- W5
-      end
-    else
-      temp = 'on'     -- W6
-    end
-    for e = first_et, #nodes do
-      if glyph_not_symbol_font(nodes[e][1]) then nodes[e][2] = temp end
-    end
-  end
-
-  -- dummy node, to close things
-  table.insert(
-    nodes, {nil, (outer == 'l') and 'l' or 'r', nil, locale_d})
-
-  ---------------  NEUTRAL -----------------
-
-  outer = save_outer
-  last = outer
-
-  local first_on = nil
-
-  for q = 1, #nodes do
-    local item
-
-    local outer_first = nodes[q][3]
-    outer = outer_first or outer
-    last = outer_first or last
-
-    local d = nodes[q][2]
-    if d == 'an' or d == 'en' then d = 'r' end
-    if d == 'cs' or d == 'et' or d == 'es' then d = 'on' end --- W6
-
-    if d == 'on' then
-      first_on = first_on or q
-    elseif first_on then
-      if last == d then
-        temp = d
-      else
-        temp = outer
-      end
-      for r = first_on, q - 1 do
-        nodes[r][2] = temp
-        item = nodes[r][1]    -- MIRRORING
-        if Babel.mirroring_enabled and glyph_not_symbol_font(item)
-             and temp == 'r' and characters[item.char] then
-          local font_mode = ''
-          if item.font > 0 and font.fonts[item.font].properties then
-            font_mode = font.fonts[item.font].properties.mode
-          end
-          texio.write_nl('id=' .. node.get_attribute(
-                 item, Babel.attr_locale) or '?')
-          texio.write(' from= ' .. item.char or '?')
-          texio.write(' dir=' .. ((nodes[r][4] or 3)))
-          texio.write(' nodedir=' .. (nodes[r][2]))
-          if font_mode ~= 'harf' and font_mode ~= 'plug' then
-            -- if Babel.locale_props[tonumber(node.get_attribute(
-                 -- item, Babel.attr_locale))].textdir ~= 'x' then
-              -- item.char = characters[item.char].m or item.char
-            -- end
-            -- if (nodes[r][4] or 0) & 0x3 > 0 then
-              item.char = characters[item.char].m or item.char
-              texio.write(' to= ' .. item.char or '?')
-            -- end
-          end
-        end
-      end
-      first_on = nil
-    end
-
-    if d == 'r' or d == 'l' then last = d end
-  end
-
-  --------------  IMPLICIT, REORDER ----------------
-
-  outer = save_outer
-  last = outer
-
-  local state = {}
-  state.has_r = false
-
-  for q = 1, #nodes do
-
-    local item = nodes[q][1]
-
-    outer = nodes[q][3] or outer
-
-    local d = nodes[q][2]
-
-    if d == 'nsm' then d = last end             -- W1
-    if d == 'en' then d = 'an' end
-    local isdir = (d == 'r' or d == 'l')
-
-    if outer == 'l' and d == 'an' then
-      state.san = state.san or item
-      state.ean = item
-    elseif state.san then
-      head, state = insert_numeric(head, state)
-    end
-
-    if outer == 'l' then
-      if d == 'an' or d == 'r' then     -- im -> implicit
-        if d == 'r' then state.has_r = true end
-        state.sim = state.sim or item
-        state.eim = item
-      elseif d == 'l' and state.sim and state.has_r then
-        head, state = insert_implicit(head, state, outer)
-      elseif d == 'l' then
-        state.sim, state.eim, state.has_r = nil, nil, false
-      end
-    else
-      if d == 'an' or d == 'l' then
-        if nodes[q][3] then -- nil except after an explicit dir
-          state.sim = item  -- so we move sim 'inside' the group
-        else
-          state.sim = state.sim or item
-        end
-        state.eim = item
-      elseif d == 'r' and state.sim then
-        head, state = insert_implicit(head, state, outer)
-      elseif d == 'r' then
-        state.sim, state.eim = nil, nil
-      end
-    end
-
-    if isdir then
-      last = d           -- Don't search back - best save now
-    elseif d == 'on' and state.san  then
-      state.san = state.san or item
-      state.ean = item
-    end
-
-  end
-
-  head = node.prev(head) or head
-  --- FIXES ---
-  if has_hyperlink then
-    local flag, linking = 0, 0
-    for item in node.traverse(head) do
-      if item.id == DIR then
-        if item.dir == '+TRT' or item.dir == '+TLT' then
-          flag = flag + 1
-        elseif item.dir == '-TRT' or item.dir == '-TLT' then
-          flag = flag - 1
-        end
-      elseif item.id == 8 and item.subtype == 19 then
-        linking = flag
-      elseif item.id == 8 and item.subtype == 20 then
-        if linking > 0 then
-          if item.prev.id == DIR and
-              (item.prev.dir == '-TRT' or item.prev.dir == '-TLT') then
-            d = node.new(DIR)
-            d.dir = item.prev.dir
-            node.remove(head, item.prev)
-            node.insert_after(head, item, d)
-          end
-        end
-        linking = 0
-      end
-    end
-  end
-
-  for item in node.traverse_id(10, head) do
-    local p = item
-    local flag = false
-    while p.prev and p.prev.id == 14 do
-      flag = true
-      p = p.prev
-    end
-    if flag then
-      node.insert_before(head, p, node.copy(item))
-      node.remove(head,item)
-    end
-  end
-
-  return head
-end
-function Babel.unset_atdir(head)
-  local ATDIR = Babel.attr_dir
-  for item in node.traverse(head) do
-    node.set_attribute(item, ATDIR, 0x80)
-  end
-  return head
-end

Modified: trunk/Master/texmf-dist/tex/generic/babel/babel-transforms.lua
===================================================================
--- trunk/Master/texmf-dist/tex/generic/babel/babel-transforms.lua	2025-04-15 17:54:06 UTC (rev 74952)
+++ trunk/Master/texmf-dist/tex/generic/babel/babel-transforms.lua	2025-04-15 19:57:54 UTC (rev 74953)
@@ -59,6 +59,8 @@
   return (node.lang == Babel.nohyphenation)
 end
 
+Babel.show_transforms = false
+
 -- Merging both functions doesn't seen feasible, because there are too
 -- many differences.
 Babel.fetch_subtext[0] = function(head)
@@ -118,6 +120,7 @@
   if word_string:sub(-1) == ' ' then
     word_string = word_string:sub(1,-2)
   end
+  if Babel.show_transforms then texio.write_nl(word_string) end
   word_string = unicode.utf8.gsub(word_string, Babel.us_char .. '+$', '')
   return word_string, word_nodes, item, lang
 end
@@ -140,15 +143,15 @@
 
     elseif item.id == 29 then
       if item.lang == lang or lang == nil then
-        if (item.char ~= 124) and (item.char ~= 61) then -- not =, not |
-          lang = lang or item.lang
-          if node.has_attribute(item, Babel.attr_hboxed) then
-            word_string = word_string .. Babel.us_char
-          else
-            word_string = word_string .. unicode.utf8.char(item.char)
-          end
-          word_nodes[#word_nodes+1] = item
+        lang = lang or item.lang
+        if node.has_attribute(item, Babel.attr_hboxed) then
+          word_string = word_string .. Babel.us_char
+        elseif (item.char == 124) or (item.char == 61) then -- not =, not |
+          word_string = word_string .. Babel.us_char
+        else
+          word_string = word_string .. unicode.utf8.char(item.char)
         end
+        word_nodes[#word_nodes+1] = item
       else
         break
       end
@@ -185,7 +188,7 @@
 
     item = item.next
   end
-
+  if Babel.show_transforms then texio.write_nl(word_string) end
   word_string = unicode.utf8.gsub(word_string, Babel.us_char .. '+$', '')
   return word_string, word_nodes, item, lang
 end
@@ -207,6 +210,10 @@
 
   local word_head = head
 
+  if Babel.show_transforms then
+    texio.write_nl('\n==== Showing ' .. (mode == 0 and 'pre' or 'post') .. 'hyphenation ====')
+  end
+
   while true do  -- for each subtext block
 
     local w, w_nodes, nw, lang = Babel.fetch_subtext[mode](word_head)
@@ -497,6 +504,7 @@
 
         end  -- for each replacement
 
+        if Babel.show_transforms then texio.write_nl('>  ' .. w) end
         if Babel.debug then
             print('.....', '/')
             Babel.debug_hyph(w, w_nodes, sc, first, last, last_match)
@@ -514,6 +522,8 @@
     ::next::
     word_head = nw
   end  -- for substring
+
+  if Babel.show_transforms then texio.write_nl(string.rep('-', 32) .. '\n') end
   return head
 end
 

Modified: trunk/Master/texmf-dist/tex/generic/babel/babel.def
===================================================================
--- trunk/Master/texmf-dist/tex/generic/babel/babel.def	2025-04-15 17:54:06 UTC (rev 74952)
+++ trunk/Master/texmf-dist/tex/generic/babel/babel.def	2025-04-15 19:57:54 UTC (rev 74953)
@@ -39,7 +39,7 @@
     \wlog{File: #1 #4 #3 <#2>}%
     \let\ProvidesFile\@undefined}
 \fi
-\ProvidesFile{babel.def}[2025/03/27 v25.6 Babel common definitions]
+\ProvidesFile{babel.def}[2025/04/14 v25.7 Babel common definitions]
 \ifx\AtBeginDocument\@undefined
   \def\@empty{}
 \def\loadlocalcfg#1{%
@@ -603,8 +603,8 @@
     \toks@\expandafter{\bbl at tempc#3}%
     \expandafter\edef\csname extras\languagename\endcsname{\the\toks@}%
   \fi}
-\def\bbl at version{25.6}
-\def\bbl at date{2025/03/27}
+\def\bbl at version{25.7}
+\def\bbl at date{2025/04/14}
 \ifx\language\@undefined
   \csname newcount\endcsname\language
 \fi

Modified: trunk/Master/texmf-dist/tex/generic/babel/babel.sty
===================================================================
--- trunk/Master/texmf-dist/tex/generic/babel/babel.sty	2025-04-15 17:54:06 UTC (rev 74952)
+++ trunk/Master/texmf-dist/tex/generic/babel/babel.sty	2025-04-15 19:57:54 UTC (rev 74953)
@@ -34,7 +34,7 @@
 %%
 \NeedsTeXFormat{LaTeX2e}
 \ProvidesPackage{babel}%
-  [2025/03/27 v25.6
+  [2025/04/14 v25.7
    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.6}
-\def\bbl at date{2025/03/27}
+\def\bbl at version{25.7}
+\def\bbl at date{2025/04/14}
 \ifx\language\@undefined
   \csname newcount\endcsname\language
 \fi

Modified: trunk/Master/texmf-dist/tex/generic/babel/hyphen.cfg
===================================================================
--- trunk/Master/texmf-dist/tex/generic/babel/hyphen.cfg	2025-04-15 17:54:06 UTC (rev 74952)
+++ trunk/Master/texmf-dist/tex/generic/babel/hyphen.cfg	2025-04-15 19:57:54 UTC (rev 74953)
@@ -37,10 +37,10 @@
     \wlog{File: #1 #4 #3 <#2>}%
     \let\ProvidesFile\@undefined}
 \fi
-\ProvidesFile{hyphen.cfg}[2025/03/27 v25.6 Babel hyphens]
+\ProvidesFile{hyphen.cfg}[2025/04/14 v25.7 Babel hyphens]
 \xdef\bbl at format{\jobname}
-\def\bbl at version{25.6}
-\def\bbl at date{2025/03/27}
+\def\bbl at version{25.7}
+\def\bbl at date{2025/04/14}
 \ifx\AtBeginDocument\@undefined
   \def\@empty{}
 \fi

Modified: trunk/Master/texmf-dist/tex/generic/babel/locale/cy/babel-cy.ini
===================================================================
--- trunk/Master/texmf-dist/tex/generic/babel/locale/cy/babel-cy.ini	2025-04-15 17:54:06 UTC (rev 74952)
+++ trunk/Master/texmf-dist/tex/generic/babel/locale/cy/babel-cy.ini	2025-04-15 19:57:54 UTC (rev 74953)
@@ -9,8 +9,8 @@
 
 [identification]
 charset = utf8
-version = 1.4
-date = 2025-01-25
+version = 1.5
+date = 2025-04-07
 name.local = Cymraeg
 name.english = Welsh
 name.babel = welsh
@@ -38,7 +38,7 @@
 listtable = Rhestr Dablau
 index = Mynegai
 figure = Darlun
-table = Taflen
+table = Tabl
 part = Rhan
 encl = amgaeëdig
 cc = copïau

Added: trunk/Master/texmf-dist/tex/generic/babel/locale/hbo/babel-ancienthebrew.tex
===================================================================
--- trunk/Master/texmf-dist/tex/generic/babel/locale/hbo/babel-ancienthebrew.tex	                        (rev 0)
+++ trunk/Master/texmf-dist/tex/generic/babel/locale/hbo/babel-ancienthebrew.tex	2025-04-15 19:57:54 UTC (rev 74953)
@@ -0,0 +1,13 @@
+% This file is part of babel. For further details see:
+% https://www.ctan.org/pkg/babel
+\ifx\BabelBeforeIni\undefined
+  \PackageError{babel}%
+    {This file is a component of babel and cannot\MessageBreak
+     be loaded directly. I'll stop immediately}%
+    {Just use babel as documented.}%
+  \stop
+\fi
+\BabelBeforeIni{hbo}{%
+}
+
+\endinput
\ No newline at end of file


Property changes on: trunk/Master/texmf-dist/tex/generic/babel/locale/hbo/babel-ancienthebrew.tex
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: trunk/Master/texmf-dist/tex/generic/babel/locale/hbo/babel-hbo.ini
===================================================================
--- trunk/Master/texmf-dist/tex/generic/babel/locale/hbo/babel-hbo.ini	                        (rev 0)
+++ trunk/Master/texmf-dist/tex/generic/babel/locale/hbo/babel-hbo.ini	2025-04-15 19:57:54 UTC (rev 74953)
@@ -0,0 +1,127 @@
+; This file is part of babel. For further details see:
+;   https://www.ctan.org/pkg/babel
+; Data has been collected mainly from the following sources:
+; * babel language styles (license LPPL):
+;   https://www.ctan.org/pkg/babel-contrib
+; * Common Locale Data Repository (license Unicode):
+;   http://cldr.unicode.org/
+;   http://unicode.org/copyright.html
+
+[identification]
+charset = utf8
+version = 0.1
+date = 2025-04-07
+name.local = לְשׁוֹן הַמִּקְרָא
+name.english = Ancient Hebrew
+name.babel = ancienthebrew
+tag.bcp47 = hbo
+language.tag.bcp47 = hbo
+tag.bcp47.likely = hbo-Hebr-IL
+tag.opentype = IWR
+script.name = Hebrew
+script.tag.bcp47 = Hebr
+script.tag.opentype = hebr
+level = 1
+encodings = 
+derivate = no
+warning = This is a bare minimum locale for 'ancienthebrew'.
+require.babel = hebrew
+
+[captions]
+; xetex, luatex
+preface    = 
+ref        = 
+abstract   = 
+bib        = 
+chapter    = 
+appendix   = 
+contents   = 
+listfigure = 
+listtable  = 
+index      = 
+figure     = 
+table      = 
+part       = 
+encl       = 
+cc         = 
+headto     = 
+page       = 
+see        = 
+also       = 
+proof      = 
+glossary   = 
+
+[captions.licr]
+; pdftex
+preface    = 
+ref        = 
+abstract   = 
+bib        = 
+chapter    = 
+appendix   = 
+contents   = 
+listfigure = 
+listtable  = 
+index      = 
+figure     = 
+table      = 
+part       = 
+encl       = 
+cc         = 
+headto     = 
+page       = 
+see        = 
+also       = 
+proof      = 
+glossary   = 
+
+[date.gregorian]
+date.long      = [d][ ][MMMM] [y]
+date.short     = [y]-[MM]-[dd]
+months.wide.1  = 
+months.wide.2  = 
+months.wide.3  = 
+months.wide.4  = 
+months.wide.5  = 
+months.wide.6  = 
+months.wide.7  = 
+months.wide.8  = 
+months.wide.9  = 
+months.wide.10 = 
+months.wide.11 = 
+months.wide.12 = 
+
+[date.gregorian.licr]
+months.wide.1  = 
+months.wide.2  = 
+months.wide.3  = 
+months.wide.4  = 
+months.wide.5  = 
+months.wide.6  = 
+months.wide.7  = 
+months.wide.8  = 
+months.wide.9  = 
+months.wide.10 = 
+months.wide.11 = 
+months.wide.12 = 
+
+[time.gregorian]
+time.medium = [HH]:[mm]:[ss]
+time.short = [HH]:[mm]
+
+[typography]
+frenchspacing    = yes
+hyphenrules      = 
+lefthyphenmin    = 
+righthyphenmin   = 
+hyphenchar       = 
+prehyphenchar    = 
+posthyphenchar   = 
+exhyphenchar     = 
+preexhyphenchar  = 
+postexhyphenchar = 
+hyphenationmin   = 
+
+; 
+ at include = Hebr
+;


Property changes on: trunk/Master/texmf-dist/tex/generic/babel/locale/hbo/babel-hbo.ini
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Modified: trunk/Master/texmf-dist/tex/generic/babel/locale/he/babel-he.ini
===================================================================
--- trunk/Master/texmf-dist/tex/generic/babel/locale/he/babel-he.ini	2025-04-15 17:54:06 UTC (rev 74952)
+++ trunk/Master/texmf-dist/tex/generic/babel/locale/he/babel-he.ini	2025-04-15 19:57:54 UTC (rev 74953)
@@ -10,8 +10,8 @@
 
 [identification]
 charset = utf8
-version = 1.11
-date = 2024-08-11
+version = 1.12
+date = 2025-04-12
 name.local = עברית
 name.english = Hebrew
 name.babel = hebrew
@@ -211,37 +211,6 @@
 plusSign = ‎+
 superscriptingExponent = ×
 
-[counters]
-letters.1    = א ב ג  ד  ה ו  ז  ח ט
-letters.2    = י כ ל מ נ ס ע פ צ
-letters.F.15 = טו
-letters.F.16 = טז
-letters.F.17 = יז
-letters.F.18 = יח
-letters.F.19 = יט
-letters.3    = ק ר ש ת תק תר תש תת תתק
-letters.4    = א׳ ב׳ ג׳ ד׳ ה׳ ו׳ ז׳ ח׳ ט׳
-
-[transforms.prehyphenation]
-transliteration.cj.1.0 = { ([aAE]): }
-transliteration.cj.1.1 =   { string = {1|aAE|ֱֲֳ} }
-transliteration.cj.1.2 =   { remove }
-transliteration.cj.2.0 = { ([/{+}])s }
-transliteration.cj.2.1 =   { string = {1|/{002C}+|ששׂשׁ} }
-transliteration.cj.2.2 =   { remove }
-transliteration.cj.3.0 = { {-}{-} }
-transliteration.cj.3.1 =   { string = ־ }
-transliteration.cj.3.2 =   { remove }
-transliteration.cj.4.0 = { {.}([htsS]) }
-transliteration.cj.4.1 =   { remove }
-transliteration.cj.4.2 =   { string = {1|htsS|חטצץ} }
-transliteration.cj.5.0 = { /a({a}) }
-transliteration.cj.5.1 =   { remove }
-transliteration.cj.5.2 =   { string = {1} }
-transliteration.cj.5.3 =   { string =  ַ}
-transliteration.cj.6.0 = { w([o{*}]) }
-transliteration.cj.6.1 =   { string = {1|o*|וֹוּ} }
-transliteration.cj.7.0 = { ([aAbdeEghikKlmMnNoOpPqrstuUwyz{*}:'’`‘;]) }
-transliteration.cj.7.1 =   { string = {1|aAbdeEghikKlmMnNoOpPqrstuUwyz*:'’`‘;|ַָבדֵֶגהִכךלמםנןֹוֹפףקרסתֻוּויזְּאאעע׃} }
-
-
+; 
+ at include = Hebr
+;
\ No newline at end of file

Modified: trunk/Master/texmf-dist/tex/generic/babel/locale/lad/babel-lad.ini
===================================================================
--- trunk/Master/texmf-dist/tex/generic/babel/locale/lad/babel-lad.ini	2025-04-15 17:54:06 UTC (rev 74952)
+++ trunk/Master/texmf-dist/tex/generic/babel/locale/lad/babel-lad.ini	2025-04-15 19:57:54 UTC (rev 74953)
@@ -7,8 +7,8 @@
 
 [identification]
 charset = utf8
-version = 0.3
-date = 2023-10-06
+version = 0.4
+date = 2025-04-12
 name.local = Ladino
 name.english = Ladino
 name.babel = ladino
@@ -120,35 +120,6 @@
 postexhyphenchar = 
 hyphenationmin   = 
 
-[counters]
-letters.1    = א ב ג  ד  ה ו  ז  ח ט
-letters.2    = י כ ל מ נ ס ע פ צ
-letters.F.15 = טו
-letters.F.16 = טז
-letters.F.17 = יז
-letters.F.18 = יח
-letters.F.19 = יט
-letters.3    = ק ר ש ת תק תר תש תת תתק
-letters.4    = א׳ ב׳ ג׳ ד׳ ה׳ ו׳ ז׳ ח׳ ט׳
-
-[transforms.prehyphenation]
-transliteration.cj.1.0 = { ([aAE]): }
-transliteration.cj.1.1 =   { string = {1|aAE|ֱֲֳ} }
-transliteration.cj.1.2 =   { remove }
-transliteration.cj.2.0 = { ([/{+}])s }
-transliteration.cj.2.1 =   { string = {1|/{002C}+|ששׂשׁ} }
-transliteration.cj.2.2 =   { remove }
-transliteration.cj.3.0 = { {-}{-} }
-transliteration.cj.3.1 =   { string = ־ }
-transliteration.cj.3.2 =   { remove }
-transliteration.cj.4.0 = { {.}([htsS]) }
-transliteration.cj.4.1 =   { remove }
-transliteration.cj.4.2 =   { string = {1|htsS|חטצץ} }
-transliteration.cj.5.0 = { /a({a}) }
-transliteration.cj.5.1 =   { remove }
-transliteration.cj.5.2 =   { string = {1} }
-transliteration.cj.5.3 =   { string =  ַ}
-transliteration.cj.6.0 = { w([o{*}]) }
-transliteration.cj.6.1 =   { string = {1|o*|וֹוּ} }
-transliteration.cj.7.0 = { ([aAbdeEghikKlmMnNoOpPqrstuUwyz{*}:'’`‘;]) }
-transliteration.cj.7.1 =   { string = {1|aAbdeEghikKlmMnNoOpPqrstuUwyz*:'’`‘;|ַָבדֵֶגהִכךלמםנןֹוֹפףקרסתֻוּויזְּאאעע׃} }
+; 
+ at include = Hebr
+;

Modified: trunk/Master/texmf-dist/tex/generic/babel/locale/shared/babel-Arab.ini
===================================================================
--- trunk/Master/texmf-dist/tex/generic/babel/locale/shared/babel-Arab.ini	2025-04-15 17:54:06 UTC (rev 74952)
+++ trunk/Master/texmf-dist/tex/generic/babel/locale/shared/babel-Arab.ini	2025-04-15 19:57:54 UTC (rev 74953)
@@ -46,4 +46,6 @@
 kashida.base.3.0 = { [يئهشسقفغعضصنمكلظطخحجثتب][ًٍَُِّ]()[ًٍَُِّ]()[يئهشسقفغعضصنمكلظطخحجثتباأإآوؤذدزرة] }
 kashida.base.3.1 =   { kashida = 500 }
 kashida.base.4.0 = { ()ل()[ًٍَُِّ]*[اأإآ] }
-kashida.base.4.1 =   { kashida = 0 }
\ No newline at end of file
+kashida.base.4.1 =   { kashida = 0 }
+kashida.base.5.0 = { ل()[ًٍَُِّ]()[اأإآ] }
+kashida.base.5.1 =   { kashida = 0 }
\ No newline at end of file

Added: trunk/Master/texmf-dist/tex/generic/babel/locale/shared/babel-Hebr.ini
===================================================================
--- trunk/Master/texmf-dist/tex/generic/babel/locale/shared/babel-Hebr.ini	                        (rev 0)
+++ trunk/Master/texmf-dist/tex/generic/babel/locale/shared/babel-Hebr.ini	2025-04-15 19:57:54 UTC (rev 74953)
@@ -0,0 +1,36 @@
+; This file is part of babel. For further details see:
+;   https://www.ctan.org/pkg/babel
+
+[counters]
+letters.1    = א ב ג  ד  ה ו  ז  ח ט
+letters.2    = י כ ל מ נ ס ע פ צ
+letters.F.15 = טו
+letters.F.16 = טז
+letters.F.17 = יז
+letters.F.18 = יח
+letters.F.19 = יט
+letters.3    = ק ר ש ת תק תר תש תת תתק
+letters.4    = א׳ ב׳ ג׳ ד׳ ה׳ ו׳ ז׳ ח׳ ט׳
+
+[transforms.prehyphenation]
+transliteration.cj.1.0 = { ([aAE]): }
+transliteration.cj.1.1 =   { string = {1|aAE|ֱֲֳ} }
+transliteration.cj.1.2 =   { remove }
+transliteration.cj.2.0 = { ([/{+}])s }
+transliteration.cj.2.1 =   { string = {1|/{002C}+|ששׂשׁ} }
+transliteration.cj.2.2 =   { remove }
+transliteration.cj.3.0 = { {-}{-} }
+transliteration.cj.3.1 =   { string = ־ }
+transliteration.cj.3.2 =   { remove }
+transliteration.cj.4.0 = { {.}([htsS]) }
+transliteration.cj.4.1 =   { remove }
+transliteration.cj.4.2 =   { string = {1|htsS|חטצץ} }
+transliteration.cj.5.0 = { /a({a}) }
+transliteration.cj.5.1 =   { remove }
+transliteration.cj.5.2 =   { string = {1} }
+transliteration.cj.5.3 =   { string =  ַ}
+transliteration.cj.6.0 = { w([o{*}]) }
+transliteration.cj.6.1 =   { string = {1|o*|וֹוּ} }
+transliteration.cj.7.0 = { ([aAbdeEghikKlmMnNoOpPqrstuUwyz{*}:'’`‘;]) }
+transliteration.cj.7.1 =   { string = {1|aAbdeEghikKlmMnNoOpPqrstuUwyz*:'’`‘;|ַָבדֵֶגהִכךלמםנןֹוֹפףקרסתֻוּויזְּאאעע׃} }
+


Property changes on: trunk/Master/texmf-dist/tex/generic/babel/locale/shared/babel-Hebr.ini
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Modified: trunk/Master/texmf-dist/tex/generic/babel/locale/yi/babel-yi.ini
===================================================================
--- trunk/Master/texmf-dist/tex/generic/babel/locale/yi/babel-yi.ini	2025-04-15 17:54:06 UTC (rev 74952)
+++ trunk/Master/texmf-dist/tex/generic/babel/locale/yi/babel-yi.ini	2025-04-15 19:57:54 UTC (rev 74953)
@@ -9,8 +9,8 @@
 
 [identification]
 charset = utf8
-version = 1.9
-date = 2023-10-06
+version = 1.10
+date = 2025-04-12
 name.local = ייִדיש
 name.english = Yiddish
 name.babel = yiddish
@@ -176,35 +176,6 @@
 plusSign = +
 superscriptingExponent = ×
 
-[counters]
-letters.1    = א ב ג  ד  ה ו  ז  ח ט
-letters.2    = י כ ל מ נ ס ע פ צ
-letters.F.15 = טו
-letters.F.16 = טז
-letters.F.17 = יז
-letters.F.18 = יח
-letters.F.19 = יט
-letters.3    = ק ר ש ת תק תר תש תת תתק
-letters.4    = א׳ ב׳ ג׳ ד׳ ה׳ ו׳ ז׳ ח׳ ט׳
-
-[transforms.prehyphenation]
-transliteration.cj.1.0 = { ([aAE]): }
-transliteration.cj.1.1 =   { string = {1|aAE|ֱֲֳ} }
-transliteration.cj.1.2 =   { remove }
-transliteration.cj.2.0 = { ([/{+}])s }
-transliteration.cj.2.1 =   { string = {1|/{002C}+|ששׂשׁ} }
-transliteration.cj.2.2 =   { remove }
-transliteration.cj.3.0 = { {-}{-} }
-transliteration.cj.3.1 =   { string = ־ }
-transliteration.cj.3.2 =   { remove }
-transliteration.cj.4.0 = { {.}([htsS]) }
-transliteration.cj.4.1 =   { remove }
-transliteration.cj.4.2 =   { string = {1|htsS|חטצץ} }
-transliteration.cj.5.0 = { /a({a}) }
-transliteration.cj.5.1 =   { remove }
-transliteration.cj.5.2 =   { string = {1} }
-transliteration.cj.5.3 =   { string =  ַ}
-transliteration.cj.6.0 = { w([o{*}]) }
-transliteration.cj.6.1 =   { string = {1|o*|וֹוּ} }
-transliteration.cj.7.0 = { ([aAbdeEghikKlmMnNoOpPqrstuUwyz{*}:'’`‘;]) }
-transliteration.cj.7.1 =   { string = {1|aAbdeEghikKlmMnNoOpPqrstuUwyz*:'’`‘;|ַָבדֵֶגהִכךלמםנןֹוֹפףקרסתֻוּויזְּאאעע׃} }
+; 
+ at include = Hebr
+;
\ 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	2025-04-15 17:54:06 UTC (rev 74952)
+++ trunk/Master/texmf-dist/tex/generic/babel/luababel.def	2025-04-15 19:57:54 UTC (rev 74953)
@@ -1054,7 +1054,8 @@
               {0x20000, 0x2A6DF}, {0x2A700, 0x2B73F},
               {0x2B740, 0x2B81F}, {0x2B820, 0x2CEAF},
               {0x2CEB0, 0x2EBEF}, {0x2F800, 0x2FA1F}},
-  ['Hebr'] = {{0x0590, 0x05FF}},
+  ['Hebr'] = {{0x0590, 0x05FF},
+              {0xFB1F, 0xFB4E}}, % <- Includes some <reserved>
   ['Jpan'] = {{0x3000, 0x303F}, {0x3040, 0x309F}, {0x30A0, 0x30FF},
               {0x4E00, 0x9FAF}, {0xFF00, 0xFFEF}},
   ['Khmr'] = {{0x1780, 0x17FF}, {0x19E0, 0x19FF}},
@@ -1399,6 +1400,14 @@
   \directlua{
     Babel.locale_props[\the\csname bbl at id@@#1\endcsname].vars["#2"] = #3
   }}
+\newcommand\ShowBabelTransforms[1]{%
+  \bbl at activateprehyphen
+  \bbl at activateposthyphen
+  \begingroup
+    \directlua{ Babel.show_transforms = true }%
+    \setbox\z@\vbox{#1}%
+    \directlua{ Babel.show_transforms = false }%
+  \endgroup}
 \newcommand\localeprehyphenation[1]{%
   \directlua{ Babel.string_prehyphenation([==[#1]==], \the\localeid) }}
 \def\bbl at activate@preotf{%

Modified: trunk/Master/texmf-dist/tex/generic/babel/nil.ldf
===================================================================
--- trunk/Master/texmf-dist/tex/generic/babel/nil.ldf	2025-04-15 17:54:06 UTC (rev 74952)
+++ trunk/Master/texmf-dist/tex/generic/babel/nil.ldf	2025-04-15 19:57:54 UTC (rev 74953)
@@ -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/03/27 v25.6 Nil language]
+\ProvidesLanguage{nil}[2025/04/14 v25.7 Nil language]
 \LdfInit{nil}{datenil}
 \ifx\l at nil\@undefined
   \newlanguage\l at nil



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