summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/generic/babel/luababel.def
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/tex/generic/babel/luababel.def')
-rw-r--r--Master/texmf-dist/tex/generic/babel/luababel.def207
1 files changed, 124 insertions, 83 deletions
diff --git a/Master/texmf-dist/tex/generic/babel/luababel.def b/Master/texmf-dist/tex/generic/babel/luababel.def
index 41137096197..1405e5710ba 100644
--- a/Master/texmf-dist/tex/generic/babel/luababel.def
+++ b/Master/texmf-dist/tex/generic/babel/luababel.def
@@ -248,6 +248,30 @@
end
lang.patterns(lg, pats)
end
+ function Babel.hlist_has_bidi(head)
+ local has_bidi = false
+ for item in node.traverse(head) do
+ if item.id == node.id'glyph' then
+ local itemchar = item.char
+ local chardata = Babel.characters[itemchar]
+ local dir = chardata and chardata.d or nil
+ if not dir then
+ for nn, et in ipairs(Babel.ranges) do
+ if itemchar < et[1] then
+ break
+ elseif itemchar <= et[2] then
+ dir = et[3]
+ break
+ end
+ end
+ end
+ if dir and (dir == 'al' or dir == 'r') then
+ has_bidi = true
+ end
+ end
+ end
+ return has_bidi
+ end
}
\endgroup
\ifx\newattribute\@undefined\else
@@ -1310,9 +1334,11 @@ end
#2 TRT\relax
\fi
\fi}
+\def\bbl@thedir{0}
\def\bbl@textdir#1{%
\bbl@setluadir{text}\textdir{#1}%
\chardef\bbl@thetextdir#1\relax
+ \edef\bbl@thedir{\the\numexpr\bbl@thepardir*3+#1}%
\setattribute\bbl@attr@dir{\numexpr\bbl@thepardir*3+#1}}
\def\bbl@pardir#1{%
\bbl@setluadir{par}\pardir{#1}%
@@ -1321,6 +1347,7 @@ end
\def\bbl@pagedir{\bbl@setluadir{page}\pagedir}
\def\bbl@dirparastext{\pardir\the\textdir\relax}% %%%%
\ifnum\bbl@bidimode>\z@
+ \def\bbl@insidemath{0}%
\def\bbl@mathboxdir{%
\ifcase\bbl@thetextdir\relax
\everyhbox{\bbl@mathboxdir@aux L}%
@@ -1329,16 +1356,37 @@ end
\fi}
\def\bbl@mathboxdir@aux#1{%
\@ifnextchar\egroup{}{\textdir T#1T\relax}}
+ \def\bbl@everymath{\def\bbl@insidemath{1}}
+ \def\bbl@everydisplay{%
+ \bbl@mathboxdir
+ \def\bbl@everymath{\bbl@mathboxdir}%
+ \def\bbl@insidemath{2}}
\frozen@everymath\expandafter{%
- \expandafter\bbl@mathboxdir\the\frozen@everymath}
+ \expandafter\bbl@everymath\the\frozen@everymath}
\frozen@everydisplay\expandafter{%
- \expandafter\bbl@mathboxdir\the\frozen@everydisplay}
+ \expandafter\bbl@everydisplay\the\frozen@everydisplay}
+ \AtBeginDocument{
+ \directlua{
+ function Babel.math_box_dir(head)
+ if not (token.get_macro('bbl@insidemath') == '0') then
+ if Babel.hlist_has_bidi(head) then
+ local d = node.new(node.id'dir')
+ d.dir = '+TRT'
+ node.insert_before(head, node.has_glyph(head), d)
+ for item in node.traverse(head) do
+ node.set_attribute(item,
+ Babel.attr_dir, token.get_macro('bbl@thedir'))
+ end
+ end
+ end
+ return head
+ end
+ luatexbase.add_to_callback("hpack_filter", Babel.math_box_dir,
+ "Babel.math_box_dir", 0)
+ }}%
\fi
-\def\bbl@truellap{%s
- \ifcase\bbl@attr@dir\expandafter\llap\else\expandafter\rlap\fi}
-\def\bbl@truerlap{%
- \ifcase\bbl@attr@dir\expandafter\rlap\else\expandafter\llap\fi}
\bbl@trace{Redefinitions for bidi layout}
+\def\BabelNoAMSMath{\let\bbl@noamsmath\relax}
\ifnum\bbl@bidimode>\z@
\let\bbl@eqnodir\relax
\AtBeginDocument{%
@@ -1359,71 +1407,81 @@ end
\bbl@xin@{,leqno,}{,\@classoptionslist,}%
\ifin@
\def\@eqnnum{%
- \setbox\z@\hbox{\normalfont\normalcolor(\theequation)}%
- \hbox to0.01pt{\hss\hbox to\displaywidth{\box\z@\hss}}}%
+ \setbox\z@\hbox{\normalfont\normalcolor(\theequation)}%
+ \hbox to0.01pt{\hss\hbox to\displaywidth{\box\z@\hss}}}%
\fi
\else % amstex
- \bbl@sreplace\intertext@{\normalbaselines}%
- {\normalbaselines
- \ifx\bbl@eqnodir\relax\else\bbl@pardir\@ne\bbl@textdir\@ne\fi}
- \def\bbl@ams@tagbox#1#2{#1{\bbl@eqnodir#2}}% #1=\hbox|ams@lap
- \def\bbl@ams@eqtagbox#1{%
- \setbox\z@\hbox{\bbl@eqnodir#1}%
- \hbox to\wd\z@{%
- \ifx\bbl@ams@lap\hbox
- \hss\hbox to\displaywidth{\box\z@\hss}%
- \else
- \hbox to\displaywidth{\hss\box\z@}\hss
- \fi}}
- \def\bbl@ams@preset#1{%
- \ifnum\bbl@thetextdir>\z@
- \edef\bbl@eqnodir{\noexpand\bbl@textdir{\the\bbl@thetextdir}}%
- \chardef\bbl@thetextdir\z@
- \bbl@sreplace\textdef@{\hbox}{\bbl@ams@tagbox\hbox}%
- \bbl@sreplace\maketag@@@{\hbox}{\bbl@ams@tagbox#1}%
- \fi}
- \@ifpackagewith{amsmath}{leqno}%
- {\let\bbl@ams@lap\hbox}% = leqno
- {\let\bbl@ams@lap\llap}% = default
- % Not required?: split, alignat
- \AddToHook{env/cases/begin}{\bbl@ams@preset\bbl@ams@lap}%
- \AddToHook{env/multline/begin}{\bbl@ams@preset\hbox}%
- \AddToHook{env/gather/begin}{\bbl@ams@preset\bbl@ams@lap}%
- \AddToHook{env/gather*/begin}{\bbl@ams@preset\bbl@ams@lap}%
- \AddToHook{env/align/begin}{\bbl@ams@preset\bbl@ams@lap}%
- \AddToHook{env/align*/begin}{\bbl@ams@preset\bbl@ams@lap}%
- % Hackish, for proper alignment-don’t ask me why it works! :-)
- \bbl@exp{%
- \\\AddToHook{env/align*/end}{\<iftag@>\<else>\\\tag*{}\<fi>}}%
- \AddToHook{env/flalign/begin}{\bbl@ams@preset\hbox}%
- \AddToHook{env/split/before}{%
- \def\bbl@tempa{equation}%
- \ifx\@currenvir\bbl@tempa
- \def\bbl@ams@eqtagbox#1{%
- \setbox\z@\hbox{\bbl@eqnodir#1}%
- \hbox to\wd\z@{\box\z@}}%
- \fi}
- \AddToHook{env/equation/begin}{%
- \bbl@add\ignorespacesafterend{\hrule\@height\z@}%
- \ifnum\bbl@thetextdir>\z@
- \ifx\bbl@ams@lap\llap\hrule\@height\z@\fi
- \def\bbl@eqnodir{\bbl@textdir\@ne}%
- \bbl@textdir\z@
- \bbl@sreplace\maketag@@@{\hbox}{\bbl@ams@eqtagbox}%
- \fi}%
- \AddToHook{env/equation*/begin}{%
- \bbl@add\ignorespacesafterend{\hrule\@height\z@}%
- \ifnum\bbl@thetextdir>\z@
- \def\bbl@eqnodir{\bbl@textdir\@ne}%
- \bbl@textdir\z@
- \bbl@sreplace\maketag@@@{\hbox}{\bbl@ams@eqtagbox}%
- \fi}%
+ \ifx\bbl@noamsmath\@undefined
+ \edef\bbl@tempa{%
+ \catcode58=\the\catcode58\relax
+ \catcode95=\the\catcode95\relax}%
+ \catcode58=11
+ \catcode95=11
+ \bbl@sreplace\intertext@{\normalbaselines}%
+ {\normalbaselines
+ \ifx\bbl@eqnodir\relax\else\bbl@pardir\@ne\bbl@eqnodir\fi}%
+ \bbl@tempa
+ \def\bbl@ams@tagbox#1#2{#1{\bbl@eqnodir#2}}% #1=\hbox|ams@lap
+ \def\bbl@ams@eqtagbox#1{%
+ \setbox\z@\hbox{\bbl@eqnodir#1}%
+ \hbox to 0.01pt{%
+ \ifx\bbl@ams@lap\hbox
+ \hbox to\displaywidth{\hss\box\z@}\hss
+ \else
+ \hss\hbox to\displaywidth{\box\z@\hss}%
+ \fi}}
+ \def\bbl@ams@preset#1{%
+ \ifnum\bbl@thetextdir>\z@
+ \edef\bbl@eqnodir{\noexpand\bbl@textdir{\the\bbl@thetextdir}}%
+ \chardef\bbl@thetextdir\z@
+ \bbl@sreplace\textdef@{\hbox}{\bbl@ams@tagbox\hbox}%
+ \bbl@sreplace\maketag@@@{\hbox}{\bbl@ams@tagbox#1}%
+ \fi}
+ \@ifpackagewith{amsmath}{leqno}%
+ {\let\bbl@ams@lap\hbox}% = leqno
+ {\let\bbl@ams@lap\llap}% = default
+ %
+ \AddToHook{env/cases/begin}{\bbl@ams@preset\bbl@ams@lap}%
+ \AddToHook{env/multline/begin}{\bbl@ams@preset\hbox}%
+ \AddToHook{env/gather/begin}{\bbl@ams@preset\bbl@ams@lap}%
+ \AddToHook{env/gather*/begin}{\bbl@ams@preset\bbl@ams@lap}%
+ \AddToHook{env/align/begin}{\bbl@ams@preset\bbl@ams@lap}%
+ \AddToHook{env/align*/begin}{\bbl@ams@preset\bbl@ams@lap}%
+ % Hackish, for proper alignment-don’t ask me why it works! :-)
+ \bbl@exp{%
+ \\\AddToHook{env/align*/end}{\<iftag@>\<else>\\\tag*{}\<fi>}}%
+ \AddToHook{env/flalign/begin}{\bbl@ams@preset\hbox}%
+ \AddToHook{env/split/before}{%
+ \ifnum\bbl@thetextdir>\z@
+ \def\bbl@tempa{equation}%
+ \ifx\@currenvir\bbl@tempa
+ \def\bbl@ams@eqtagbox#1{%
+ \ifx\bbl@ams@lap\hbox
+ \hbox to0.01pt{\hss\bbl@eqnodir#1}% leqno
+ \else
+ \hbox to0.01pt{\bbl@eqnodir#1\hss}% eqno
+ \fi}
+ \fi
+ \fi}
+ \AddToHook{env/equation/begin}{%
+ \ifnum\bbl@thetextdir>\z@
+ \ifx\bbl@ams@lap\llap\hrule\@height\z@\fi
+ \edef\bbl@eqnodir{\noexpand\bbl@textdir{\the\bbl@thetextdir}}%
+ \bbl@sreplace\maketag@@@{\hbox}{\bbl@ams@eqtagbox}%
+ \fi}%
+ \AddToHook{env/equation*/begin}{%
+ \ifnum\bbl@thetextdir>\z@
+ \edef\bbl@eqnodir{\noexpand\bbl@textdir{\the\bbl@thetextdir}}%
+ \bbl@sreplace\maketag@@@{\hbox}{\bbl@ams@eqtagbox}%
+ \fi}%
+ \fi
\fi}
\fi
\ifx\bbl@opt@layout\@nnil\endinput\fi % if no layout
\ifnum\bbl@bidimode>\z@
\def\bbl@nextfake#1{% non-local changes, use always inside a group!
\bbl@exp{%
+ \def\\\bbl@insidemath{0}%
\mathdir\the\bodydir
#1% Once entered in math, set boxes to restore values
\<ifmmode>%
@@ -1486,28 +1544,11 @@ end
\directlua{
Babel.get_picture_dir = true
Babel.picture_has_bidi = 0
+ %
function Babel.picture_dir (head)
if not Babel.get_picture_dir then return head end
- for item in node.traverse(head) do
- if item.id == node.id'glyph' then
- local itemchar = item.char
- % TODO. Copypaste pattern from Babel.bidi (-r)
- local chardata = Babel.characters[itemchar]
- local dir = chardata and chardata.d or nil
- if not dir then
- for nn, et in ipairs(Babel.ranges) do
- if itemchar < et[1] then
- break
- elseif itemchar <= et[2] then
- dir = et[3]
- break
- end
- end
- end
- if dir and (dir == 'al' or dir == 'r') then
- Babel.picture_has_bidi = 1
- end
- end
+ if Babel.hlist_has_bidi(head) then
+ Babel.picture_has_bidi = 1
end
return head
end