witharrows 包如何反转 RTL 语言中的文本?

witharrows 包如何反转 RTL 语言中的文本?

我使用 Latex 写作业,最近我了解到一个witharrows包,它允许我在线条之间画箭头来解释我在那里做了什么。我发现这对我的家庭作业非常有帮助。但是,当我尝试使用该包时,出现了一个奇怪的问题。我用我们的母语希伯来语(一种 RTL 语言)写作业。我使用和包polyglossiafontspec配置文档的语言设置和字体。

当我尝试使用该witharrows包和这个简单的例子时:

דוגמה לחישוב:
\begin{DispWithArrows*}
A &= (a + b)^2 \Arrow{נפתח את הסוגריים בביטוי} \\
&= a^2 + 2ab + b^2
\end{DispWithArrows*}

我得到了这个输出:

如您所见,箭头旁边的文本是反转的。看起来它出于某种原因试图将其写入 LTR 设置中。阅读后这个问题,我尝试使用font=\selectlanguage{hebrew}如下选项:

\tikzset{
    WithArrows/arrow/.append style = {
        font = \selectlanguage{hebrew},
    }
}

但是,它不起作用。我得到了相同的输出。请注意,我这样做是为了tikzset使其适用于所有箭头,但在箭头本身内部这样做 \Arrow[tikz={font={\selectlanguage{hebrew}}}]{נפתח את הסוגריים בביטוי}也不起作用。

我做了更多的实验,发现了一些非常奇怪的事情:如果我向字体添加另一个设置,例如更改颜色:

\tikzset{
    WithArrows/arrow/.append style = {
        color=blue,
        font = \selectlanguage{hebrew},
    }
}

它突然工作并从右到左正确渲染,这非常奇怪。我发现另一个可行的解决方案是使用\texthebrew

דוגמה לחישוב:
\begin{DispWithArrows*}
A &= (a + b)^2 \Arrow{\texthebrew{נפתח את הסוגריים בביטוי}} \\
&= a^2 + 2ab + b^2
\end{DispWithArrows*}

也可以正确渲染。第一个解决方案很奇怪,我想知道为什么添加选项color会突然修复它(当然我可以使用,color=black这样颜色就不会改变,但这感觉像是一种肮脏的黑客行为,而不是真正的解决方案),虽然第二个解决方案有意义,但我不想总是用命令包围箭头中的文本,\texthebrew而且我找不到全局应用它的方法。

有人知道我该如何解决这些问题并让希伯来语文本在箭头中正确呈现吗?

完整示例代码(注意我使用字体助手):

% !TeX spellcheck = he_HE
\documentclass{article}

\usepackage{witharrows}

% Font and language settings
\usepackage[no-math]{fontspec}
\usepackage{polyglossia}

\newfontfamily\hebrewfont[
    Script=Hebrew,
    ItalicFont=*-Regular,
    ItalicFeatures={FakeSlant=0.3},
]{Assistant}

\setmainlanguage{hebrew}
\setotherlanguage{english}
\setsansfont{Assistant}
\setmonofont{Assistant}

\WithArrowsOptions{displaystyle}
\tikzset{
    WithArrows/arrow/.append style = {
        font = \selectlanguage{hebrew},
    }
}

\begin{document}
דוגמה לחישוב:
\begin{DispWithArrows*}
A &= (a + b)^2 \Arrow{נפתח את הסוגריים בביטוי} \\
&= a^2 + 2ab + b^2
\end{DispWithArrows*}
\end{document}

答案1

该问题并非 所特有。这是 PGF/Tikz 节点(与和witharrows结合)的问题。polyglossiaxelatex

我认为最好的解决方案是在文档的前言中放置一个命令\tikzset{text=.} (“。”将是创建 Tikz 节点时的当前颜色)。

\documentclass{article}

\usepackage{witharrows}

% Font and language settings
\usepackage[no-math]{fontspec}
\usepackage{polyglossia}

\newfontfamily\hebrewfont[
    Script=Hebrew,
    ItalicFont=*-Regular,
    ItalicFeatures={FakeSlant=0.3},
]{Assistant}

\setmainlanguage{hebrew}
\setotherlanguage{english}
\setsansfont{Assistant}
\setmonofont{Assistant}


\tikzset{text=.}  % "." is the current color

\WithArrowsOptions{displaystyle,tikz={font=}}

\begin{document}


דוגמה לחישוב:
\begin{DispWithArrows*}
A &= (a + b)^2 \Arrow{נפתח את הסוגריים בביטוי} \\
&= a^2 + 2ab + b^2
\end{DispWithArrows*}
\end{document}

上述代码的输出

我认为问题的根源在于 PGF 使用 来\hbox构造包含其节点内容的框(至少在text width未使用 时)。该命令\hbox是 TeX 的原语,不是“颜色安全的”(而 LaTeX 框构造命令,例如\mbox都是“颜色安全的”)。对于非“颜色安全”的框,从堆栈中弹出颜色的命令实际上位于框之后(用 插入\aftergroup),并且可能会产生不良后果。

通过放入\tikzset{text=.}前导码,在每个 PGF 节点插入放置颜色的指令,并且添加的保护(以避免颜色链接)可能具有防止 RTL 模式出现问题的作用(我假设该命令\hbox不是“RTL 安全的”)。

相关内容