amsmath - bidi - siunitx 可能有错误吗?

amsmath - bidi - siunitx 可能有错误吗?

梅威瑟:

\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}

我觉得我必须参考

http://xkcd.com/1137/

答案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,这是不正确的。

相关内容