我为我构建的一种语言编写了语法,它使用自己的从右到左的脚本。在我的此脚本的字体中,我将字形映射到私有使用区域,并依靠使用 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 是这里)
然而,在 LuaLaTeX(版本 1.10)下,输出的字形从左到右:
我尝试使用\textdir TRT
,它可以修复方向,但是会导致字距调整不准确:
其他固定文本方向的方法,例如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
可以得到预期的结果。