梅威瑟:
\documentclass{article}
\usepackage[english]{babel}
\usepackage{fontspec}
\usepackage[detect-all]{siunitx}
\usepackage{amsmath}
\usepackage[math-style=ISO,bold-style=ISO]{unicode-math}
\usepackage{bidi}
\setmainfont{MinionPro-Regular.otf}
\setmathfont{xits-math.otf}
\setsansfont{MyriadPro-Regular.otf}
\setmonofont{Monaco}
\newcommand*{\problematic}{\SI{2.8}{\milli\joule\per\square\milli\metre}}
\begin{document}\noindent
\huge\problematic\par
\end{document}
输出:
如果删除其中一个amsmath
或两个bidi
,输出就正常。
amsmath
评论道:
答案1
编辑:根据 Vafa 的回答更新信息
bidi
如下所述,对命令的修改似乎有些问题\text
(因为即使文档文本是 LTR,它也会以 RTL 排版)。但是,可能siunitx
也应该对 RTL 排版采取一些积极的预防措施(即使\text
没有这种奇怪的行为,在“真正的”RTL 块中仍然会存在问题)。我将在下一个版本中添加适当的代码siunitx
。
这里的问题不是siunitx
(真的)也不是amsmath
(我认为),而是如何bidi
开始修改\text
命令。您可以通过示例看到这个问题
\documentclass{article}
\usepackage{amstext}
\usepackage{amsmath}
\usepackage{bidi}
\begin{document}
\text{Jk}
\end{document}
(在命令siunitx
加载时显示相同的内容。)amstext
\text
似乎正在发生的事情是,如果仅有的 amstext
已加载,bidi
则\text
命令不被修改,因此可以看到标准行为。但是,bidi
会检查amsmath
,如果已加载,则修改\text
为具有定义
\text #1->\@@text {\if@Latin \else \beginR \fi #1\if@Latin \else \endR \fi }
\@@text
原始命令在哪里\text
。如果你跟踪一下,似乎\if@Latin
这里的设置不正确。所以
\documentclass{article}
\usepackage{amstext}
\usepackage{amsmath}
\usepackage{bidi}
\csname @Latintrue\endcsname
\begin{document}
\text{Jk}
\end{document}
似乎事情已经解决了。
答案2
这更像是一种解决方法而不是修复方法,但是:
siunitx 和 bidi 似乎正在争夺\everymath
。
我注释掉了大部分字体的使用,因为我没有字体,而没有它们就会出现问题。
\documentclass{article}
\usepackage[english]{babel}
\usepackage{fontspec}
\usepackage[detect-all]{siunitx}
\usepackage{amsmath}
%\usepackage[math-style=ISO,bold-style=ISO]{unicode-math}
\usepackage{bidi}
%\setmainfont{MinionPro-Regular.otf}
%\setmathfont{xits-math.otf}
%\setsansfont{MyriadPro-Regular.otf}
%\setmonofont{Monaco}
\newcommand*{\problematic}{\SI{2.8}{\milli\joule\per\square\milli\metre}}
\begin{document}\noindent
\huge\problematic\par
\def\nobidi{\let\beginR\relax\let\endR\relax}
\huge{\nobidi\problematic}\par
\end{document}
我觉得我必须参考
答案3
这应该是一条评论而不是答案,但由于它很长,我无法将其作为评论提交。David Carslie 表示
siunitx
似乎bidi
在争夺\everymath
bidi
不适用于\everymath
。
约瑟夫·赖特说道:
这里的问题不在于 amsmath
siunitx
(实际上)也不在于 amsmath(我认为),而在于如何bidi
着手修改\text
命令。
bidi
需要修改\text
命令,以便满足其 RTL 目的。这是siunitx
个问题,不是bidi
-意识到的。
他还表示:
似乎发生的情况是,如果只加载了 amstext,
bidi
则\text
命令不变,因此会看到标准行为。
我承认bidi
应该检查是否amstext
如此amsmath
,但这在这里没有任何区别。
他还表示:
但是,
bidi
会检查amsmath
,如果已加载,则会修改\text
为具有定义\text #1->\@@text {\if@Latin \else \beginR \fi #1\if@Latin \else \endR \fi }
\@@text
原始命令在哪里\text
。如果你追踪一下,似乎\if@Latin
这里的设置不正确。
\if@Latin
只是bidi
包提供的一个条件,因此像 这样的包polyglossia
会将非 RTL 语言的条件设置为 false,将 RTL 语言的条件设置为 true。xepersian
广泛使用这个条件。另一方面,正如我上面所说,\text
需要针对 RTL 目的进行修改,以便它在数学模式下以 RTL 方式排版文本。
他还表示:
\@@text
原始命令在哪里\text
。如果你跟踪一下,似乎\if@Latin
这里的设置不正确。所以\documentclass{article} \usepackage{amstext} \usepackage{amsmath} \usepackage{bidi} \csname @Latintrue\endcsname \begin{document} \text{Jk} \end{document}
您总是使条件\if@LAtin
为真,而这并不是包的目的bidi
。为了更清楚起见,让我们看以下示例:
\documentclass{article}
\usepackage{amsmath}
\usepackage{xepersian}
\begin{document}
\[
1+2=3\qquad\text{این یک فرمول است.}
\]
\end{document}
如您所见,文本按应有的方式从右向左显示。让我们看看\if@Latin
工作原理:
\documentclass{article}
\usepackage{amsmath}
\usepackage{xepersian}
\begin{document}
\[
1+2=3\qquad\text{این یک فرمول است.}
\]
\begin{latin}
\[
1+2=3\qquad\text{This is an equation.}
\]
\end{latin}
\end{document}
那么你的例子现在有什么问题:
\documentclass{article}
\usepackage{amsmath}
\usepackage{xepersian}
\csname @Latintrue\endcsname
\begin{document}
\[
1+2=3\qquad\text{این یک فرمول است.}
\]
\end{document}
文本以 LTR 形式出现,这显然是错误的。因此问题不在于bidi
;问题在于siunitx
哪个不是bidi
-意识到的。
结论: siunitx
需要始终使用 LTR 输出 LTR SI 单位,\text
因为即使它\text
在 RTL 模式下使用 RTL,输出也会是 RTL,这是不正确的。