当使用 `babel` 和 `bidi` 时,`\underline` 内的数学方向会发生变化

当使用 `babel` 和 `bidi` 时,`\underline` 内的数学方向会发生变化

我正在使用 Latex 用我们的母语希伯来语(一种 rtl 语言)做作业。我尝试迁移到 ,babel因为我遇到了和lualatex的烦人错误(另外,我认为 的语法比 更好)。polyglossiaxelatexbabelpolyglossia

我尝试编译一个示例文档,但发现了一个奇怪的问题。我尝试在命令中以内联数学模式输入指数underline,但指数显示在左侧,而不是数学指数应在右侧。它似乎babel使用了文档的默认方向(本例中为 RTL),而不是 中数学的正确方向underline。此问题不会出现在常规文本或\textbf\textit或中\emph。这是一张图片:

如您所见,只会\underline产生错误的结果,而其他所有命令都正常工作。以下是生成此文档的代码:

% !TeX spellcheck = he_HE
\documentclass[a4paper, 12pt]{extarticle}

\usepackage{mathpazo}
\usepackage[bidi=basic, layout=counters tabular]{babel}

\babelprovide[main, import, alph=letters, Alph=letters]{hebrew}
\babelprovide[import]{english}

\babelfont[hebrew]{rm}[ItalicFont=*-Regular, ItalicFeatures={FakeSlant=0.3}]{Assistant}
\babelfont[hebrew]{sf}[ItalicFont=*-Regular, ItalicFeatures={FakeSlant=0.3}]{Assistant}

\AddToHook{begindocument/end}{\selectlanguage{hebrew}}

\usepackage{xparse}
\usepackage{amsmath}
\usepackage[intlimits]{esint}
\usepackage{enumitem}
\usepackage{moreenum}
\usepackage{witharrows}
\usepackage{parskip}
\usepackage{setspace}
\usepackage{physics}
\usepackage{derivative}

\NewDocumentCommand{\C}{}{\mathbb{C}}
\NewDocumentCommand{\Conjugate}{ s m }{
    \IfBooleanTF{#1}{\pqty{#2}}{{#2}}^{\ast}
}

\begin{document}
המכפלה הפנימית הסטנדרטית מעל \(\C^n\):

\textbf{המכפלה הפנימית הסטנדרטית מעל \(\C^n\):}

\textit{המכפלה הפנימית הסטנדרטית מעל \(\C^n\) :}

\emph{המכפלה הפנימית הסטנדרטית מעל \(\C^n\) :}

\underline{המכפלה הפנימית הסטנדרטית מעל \(\C^n\):}
\[ \braket{u}{v} = \sum_{j = 1}^{n} \Conjugate{u}_j v_j \]
\end{document}

有人能解释为什么数学表达式不能以正确的方向呈现\underline以及如何解决这个问题吗?

答案1

请提供更简短的例子来说明问题,这将有助于人们帮助您。

该问题可以简化为以下代码:

\documentclass{article}

\usepackage[bidi=basic,hebrew,provide=*]{babel}

\babelfont[hebrew]{rm}{David CLM}

\begin{document}
    \underline{שלום $C^n$}
\end{document}

在此处输入图片描述

在 手册的第 1.24 节中,babel指出\underline需要对 进行调整luatex,并且您可以将这些调整与layout = extras选项一起使用。

问题是几年前 \underline已经进行了强化,而 babel 并没有考虑到这一点,所以这个选项是无效的。幸运的是,有一个简单的修复方法,只需替换\bbl@sreplace,这是一个内部用来修补命令的命令,但不知道强大的命令babel\xpatchcmdxpatch包裹:

\documentclass{article}

\usepackage[bidi = basic, hebrew, provide=*, layout = tabular]{babel}

\babelfont[hebrew]{rm}{David CLM}

\usepackage{xpatch}
\makeatletter
\xpatchcmd\underline{$\@@underline}{\bgroup\bbl@nextfake$\@@underline}{}{}
\xpatchcmd\underline{$\relax}{$\egroup\relax}{}{}
\makeatother

\begin{document}
    \underline{שלום $C^n$}
\end{document}

或者甚至无需安装,您可以重新定义\underline

\documentclass{article}

\usepackage[bidi = basic, hebrew, provide=*, layout = tabular]{babel}

\babelfont[hebrew]{rm}{David CLM}

\makeatletter
\DeclareRobustCommand\underline[1]{%
    \relax
    \ifmmode\@@underline{#1}%
    \else 
    \bgroup\bbl@nextfake$\@@underline{\hbox{#1}}\m@th$\egroup\relax\fi} 
\makeatother

\begin{document}
    \underline{שלום $C^n$}
\end{document}

在此处输入图片描述

请注意,我添加了layout = tabularbabel选项,这很重要。如果布局列表为空,则 babel 不会定义\bbl@nextfake,因此您需要至少使用一个布局。

我已经开了一个,可能很快就会修复。

附注:\AddToHook{begindocument/end}{\selectlanguage{hebrew}}如果您将希伯来语声明为主要语言,那么此行就没有多大意义。

相关内容