我想在 LuaLaTeX 中排版希伯来语 (RTL) 文本(在 LTR 段落内或在其自己的 RTL 段落中)。我使用 XeLaTeX 包成功地完成了这项工作bidi
,但当我使用 LuaLaTeX 的 bidi 支持(§2.3 中的LuaTeX 手册) RTL 文本中的括号是错误的,是颠倒的。
例如,比较这个好的输出:
使用 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}
%! 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.register
,luatexbase.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