![当使用 `babel` 和 `bidi` 时,`\underline` 内的数学方向会发生变化](https://linux22.com/image/466462/%E5%BD%93%E4%BD%BF%E7%94%A8%20%60babel%60%20%E5%92%8C%20%60bidi%60%20%E6%97%B6%EF%BC%8C%60%5Cunderline%60%20%E5%86%85%E7%9A%84%E6%95%B0%E5%AD%A6%E6%96%B9%E5%90%91%E4%BC%9A%E5%8F%91%E7%94%9F%E5%8F%98%E5%8C%96.png)
我正在使用 Latex 用我们的母语希伯来语(一种 rtl 语言)做作业。我尝试迁移到 ,babel
因为我遇到了和lualatex
的烦人错误(另外,我认为 的语法比 更好)。polyglossia
xelatex
babel
polyglossia
我尝试编译一个示例文档,但发现了一个奇怪的问题。我尝试在命令中以内联数学模式输入指数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
,\xpatchcmd
xpatch
包裹:
\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 = tabular
的babel
选项,这很重要。如果布局列表为空,则 babel 不会定义\bbl@nextfake
,因此您需要至少使用一个布局。
我已经开了一个票,可能很快就会修复。
附注:\AddToHook{begindocument/end}{\selectlanguage{hebrew}}
如果您将希伯来语声明为主要语言,那么此行就没有多大意义。