LuaLaTeX 中 RTL 文本中的倒括号

LuaLaTeX 中 RTL 文本中的倒括号

我想在 LuaLaTeX 中排版希伯来语 (RTL) 文本(在 LTR 段落内或在其自己的 RTL 段落中)。我使用 XeLaTeX 包成功地完成了这项工作bidi,但当我使用 LuaLaTeX 的 bidi 支持(§2.3 中的LuaTeX 手册) RTL 文本中的括号是错误的,是颠倒的。

例如,比较这个好的输出:
XeLaTeX 的(良好)输出 使用 XeLaTeX 编译的此文件:

%! TEX program = xelatex
\documentclass{standalone}

\usepackage{fontspec, bidi}
\setmainfont{Alef}
\newcommand{\Heb}[1]{\RL{\fontspec[Script=Hebrew, Language=Hebrew]{Alef}#1}}

\begin{document}
Alpha (Beta) Gamma;
\Heb{אלף (בית) גימל};
A (B) C
\end{document}

…输出结果如下:
LuaLaTeX 的(糟糕)输出 使用 LuaLaTeX 编译的此文件:

%! TEX program = lualatex
\documentclass{standalone}

\usepackage{fontspec}
\setmainfont{Alef}
\newcommand{\Heb}[1]{\bgroup\textdir TRT\fontspec[Script=Hebrew, Language=Hebrew]{Alef}#1\egroup}

\begin{document}
Alpha (Beta) Gamma;
\Heb{אלף (בית) גימל};
A (B) C
\end{document}

看来该bidi包知道在 RTL 文本中反转括号。如何使用 LuaLaTeX 实现同样的效果?

非常感谢! :-)


更新:David Purton 的答案似乎解决了这个问题。有没有不涉及使用的解决方案babel

答案1

您可以使用babel。从 3.19 版开始,您甚至不必为简单的事情做标记。请参阅手册的 §1.27 babel

%! TEX program = lualatex
\documentclass{standalone}
\usepackage[nil,bidi=basic]{babel}
\babelprovide[import=en-AU,main,mapfont=direction]{australian}
\babelprovide[import=he,mapfont=direction]{hebrew}
\babelfont{rm}[Ligatures=TeX]{Linux Libertine O}
\begin{document}
Alpha (Beta) Gamma;
אלף (בית) גימל;
A (B) C
\end{document}

在此处输入图片描述

答案2

为了回答您的更新,为了使您在评论中链接的代码能够与乳胶一起使用,您需要用 替换callback.registerluatexbase.add_to_callback因为乳胶不支持callback.register

另一个变化是替换行if n.id == node.id("whatsit") and n.subtype == 7 then,因为 dir 节点不再是 whatsit 节点。

char-def.lua在链接的代码中找不到该文件,但我找到了它这里。以下是示例文件:

\documentclass{article}
\directlua{
require("char-def.lua")

local function mirror(hlist)
    local rtl = false
    if tex.textdir == "TRT" then
        rtl = true
    elseif tex.textdir == "TLT" then
        rtl = false
    end
    for n in node.traverse(hlist) do
        if n.id == node.id('hlist') then
            mirror(n.list)
        end
        if n.id == node.id("dir") then
            if n.dir == "+TRT" or n.dir == "-TLT" then
                rtl = true
            elseif n.dir == "-TRT" or n.dir == "+TLT" then
                rtl = false
            end
        end
        if n.id == node.id('glyph') then
            if rtl then
                local char = n.char
                local mirror = characters.data[char].mirror
                if mirror then
                    n.char = mirror
                end
            end
        end
    end
end

luatexbase.add_to_callback('pre_linebreak_filter',
    function(h)
        mirror(h)
        return true
    end,
'mirror')
}
\usepackage{fontspec}
\setmainfont{Alef}
\newcommand{\Heb}[1]{\bgroup\textdir TRT\fontspec[Script=Hebrew, Language=Hebrew]{Alef}#1\egroup}
\begin{document}
    Alpha (Beta) Gamma;
    \Heb{אלף (בית) גימל};
    A (B) C
\end{document}

另一个选择是使用 babel 的数据文件,而不使用包本身。代码基本相同,只需进行一些调整:

\documentclass{article}
\directlua{
require("babel-data-bidi.lua")

local function mirror(hlist)
    local rtl = false
    if tex.textdir == "TRT" then
        rtl = true
    elseif tex.textdir == "TLT" then
        rtl = false
    end
    for n in node.traverse(hlist) do
        if n.id == node.id('hlist') then
            mirror(n.list)
        end
        if n.id == node.id("dir") then
            if n.dir == "+TRT" or n.dir == "-TLT" then
                rtl = true
            elseif n.dir == "-TRT" or n.dir == "+TLT" then
                rtl = false
            end
        end
        if n.id == node.id('glyph') then
            if rtl then
                local char = n.char
                local mirror = Babel.characters[char]
                if mirror then
                    n.char = mirror.m
                end
            end
        end
    end
end

luatexbase.add_to_callback('pre_linebreak_filter',
    function(h)
        mirror(h)
        return true
    end,
'mirror')
}
\usepackage{fontspec}
\setmainfont{Alef}
\newcommand{\Heb}[1]{\bgroup\textdir TRT\fontspec[Script=Hebrew, Language=Hebrew]{Alef}#1\egroup}
\begin{document}
    Alpha (Beta) Gamma;
    \Heb{אלף (בית) גימל};
    A (B) C
\end{document}

两者都产生以下结果:

在此处输入图片描述

附注:最好不要standalone对 MWE 使用 class

相关内容