RTL 构造的脚本无法在 LuaLaTeX 中正确排版?

RTL 构造的脚本无法在 LuaLaTeX 中正确排版?

我为我构建的一种语言编写了语法,它使用自己的从右到左的脚本。在我的此脚本的字体中,我将字形映射到私有使用区域,并依靠使用 RLO 和 PDF 来包装此脚本中的文本,因此森沃斯将表示为RLO E000 E001 E002 E004 E005 E006 PDF。以下示例在 XeLaTeX 中排版正确(现在,请忽略这一点#+进行切换):

\documentclass{article}

\usepackage{fontspec}
\usepackage{expl3}

\ExplSyntaxOn

\cs_new_protected:Npn \cen_convert_one:N #1 {
    \str_case:nn { #1 } {
        % use PUA space because regular space makes XeLaTeX lays out words LTR
        { \__cen_space: } { \symbol{"E023} }
        { c } { \symbol{"E000} }
        { e } { \symbol{"E001} }
        { n } { \symbol{"E002} }
        { ŋ } { \symbol{"E003} }
        { v } { \symbol{"E004} }
        { o } { \symbol{"E005} }
        { s } { \symbol{"E006} }
        { þ } { \symbol{"E007} }
        { š } { \symbol{"E008} }
        { r } { \symbol{"E009} }
        { l } { \symbol{"E00A} }
        { ł } { \symbol{"E00B} }
        { m } { \symbol{"E00C} }
        { a } { \symbol{"E00D} }
        { f } { \symbol{"E00E} }
        { g } { \symbol{"E00F} }
        { p } { \symbol{"E010} }
        { t } { \symbol{"E011} }
        { č } { \symbol{"E012} }
        { î } { \symbol{"E013} }
        { j } { \symbol{"E014} }
        { i } { \symbol{"E015} }
        { d } { \symbol{"E016} }
        { ð } { \symbol{"E017} }
        { h } { \symbol{"E018} }
        { ħ } { \symbol{"E019} }
        { ê } { \symbol{"E01A} }
        { ô } { \symbol{"E01B} }
        { â } { \symbol{"E01C} }
        { u } { \symbol{"E01D} }
        { . } { \symbol{"E01E} }
        { ; } { \symbol{"E01F} }
        { ? } { \symbol{"E020} }
        { ! } { \symbol{"E021} }
        { k } { \symbol{"E022} }
        { + } { \symbol{"E024} }
        { \# } { \symbol{"E025} }
        { \__cen_surname_foreign: } { \symbol{"E026} }
        { \@ } { \symbol{"E027} }
        { * } { \symbol{"E028} }
        { ' } { \symbol{"E029} }
        { 0 } { \symbol{"E030} }
        { 1 } { \symbol{"E031} }
        { 2 } { \symbol{"E032} }
        { 3 } { \symbol{"E033} }
        { 4 } { \symbol{"E034} }
        { 5 } { \symbol{"E035} }
        { 6 } { \symbol{"E036} }
        { 7 } { \symbol{"E037} }
        { 8 } { \symbol{"E038} }
        { 9 } { \symbol{"E039} }
        { A } { \symbol{"E03A} }
        { B } { \symbol{"E03B} }
        { C } { \symbol{"E03C} }
        { D } { \symbol{"E03D} }
        { E } { \symbol{"E03E} }
        { F } { \symbol{"E03F} }
        { \\ } { \\ \symbol{"202E} }
    }
}

\tl_new:N \l__input_t
\str_new:N \l__input

\cs_new_protected:Npn \cen_convert:n #1 {
    % Nasty hack to get around outdated versions of expl3 that don't have
    % str_map_* functions
    \tl_set:Nn \l__input_t { #1 }
    \tl_replace_all:Nnn \l__input_t {~}{\__cen_space:}
    \tl_replace_all:Nnn \l__input_t {+*}{\__cen_surname_foreign:}
    \str_set_eq:NN \l__input \l__input_t
    \symbol{"202E}
    \tl_map_function:NN { \l__input } \cen_convert_one:N
    \symbol{"202C}
}

\cs_new_eq:NN \cenconvert \cen_convert:n

\ExplSyntaxOff

\newcommand{\rlo}{\symbol{"202E}}
\newcommand{\poprtl}{\symbol{"202C}}
\newcommand{\cenc}{\symbol{"E000}}
\newcommand{\cene}{\symbol{"E001}}

\newfontfamily{\vlina}{vlina.otf}
\newcommand{\textvlina}[1]{{\vlina\cenconvert{#1}}}

\title{test}
\author{\textvlina{\#flirora}}
\date{January 2019}

\begin{document}

\maketitle

\section{Introduction}

\begin{flushright}

\textvlina{vanden olonþa genin gašjodos rela; \\
garcen moðona nasenen djorłas searne.}

\textvlina{nava'þ cenčon'ak 16CB}

\textvlina{0123456789ABCDEF}

\textvlina{ca e na ŋa va o sa;}

\textvlina{þa ša ra la ła.}

\textvlina{ma a fa ga pa ta ča;}

\textvlina{în ja i da ða.}

\textvlina{ar ħo ên ôn ân uħo;}

\textvlina{carþ taŋ neŋ es nem.}

\textvlina{elo cenvos.}

\end{flushright}

\end{document}

(vlina.otf 是这里

使用 XeLaTeX 正确排版:字形从右到左显示,并且字距调整正确执行。

然而,在 LuaLaTeX(版本 1.10)下,输出的字形从左到右:

LuaLaTeX 排版不正确:字形从左到右显示。字距调整没有损坏。

我尝试使用\textdir TRT,它可以修复方向,但是会导致字距调整不准确:

LuaLaTeX 排版不正确:字形从右到左显示,但字距调整被破坏。

其他固定文本方向的方法,例如luabidi,可以得到类似的结果。

我认为问题可以归结为以下之一:

  • LuaTeX 的 RLO、字距调整或两者都存在问题
  • 我的字体的字距调整表有缺陷,即使在其他渲染器中给出了正确的结果
  • 我是少数想要这样做的人之一,因此这种用例根本不受支持

答案1

更换

\newfontfamily{\vlina}{vlina.otf}
\newcommand{\textvlina}[1]{{\vlina\cenconvert{#1}}}

\newfontfamily{\vlina}[Renderer=Harfbuzz]{vlina.otf}
\newcommand{\textvlina}[1]{{\textdir TRT\vlina\cenconvert{#1}}}

使用最新版本进行编译lualatex-dev可以得到预期的结果。

相关内容