luaLaTeX Junicode字体ji和ii的排版

luaLaTeX Junicode字体ji和ii的排版
\documentclass[a4paper]{article}
\usepackage{fontspec}
\setmainfont{Junicode}
\begin{document}
\noindent
ji\\
ii\\
j\mbox{}i\\
i\mbox{}i
\end{document}

由 lualatex 渲染,前两行带有无点 i。有人知道这是从哪里来的吗?是否有可能以某种方式将其关闭?我尝试关闭连字,但没有用,在 Junicode 字体中也找不到 ji 或 ii 连字。对我而言唯一有用的方法是在两个字母之间插入空框并使用宏\ji\ii宏,但这是一种丑陋的黑客行为。如果我尝试从 lualatex 创建的 pdf 中剪切文本,第一个字符是 j(或 i),第二个字符是无点 i。

答案1

这不是一个答案,只是一个临时修复,对于评论来说太长了。您可以通过编写一个很小的功能文件来解决此问题,如下所示:

\documentclass{article}
\usepackage{filecontents,fontspec}
\begin{filecontents*}{juni.fea}
languagesystem DFLT dflt;
languagesystem latn dflt;

# fix problem in https://tex.stackexchange.com/q/220038/7883
feature fixi {
  sub \dotlessi by \i;
} fixi;
\end{filecontents*}
\setmainfont{Junicode}[
  FeatureFile={juni.fea},
  Contextuals=Alternate,
  Numbers=OldStyle,
  RawFeature=+fixi]
\begin{document}
\noindent
ji\\
ii
\end{document}

(如果您的版本fontspec不是最新版本,它会希望选项位于\setmainfont和之间{Junicode},而不是之后。)

更新

在 TeX Live 2016 中,即使使用“ij”,修复似乎也能更可靠地工作:

\documentclass{article}
\usepackage{fontspec}
\directlua{
fonts.handlers.otf.addfeature {
    name = "fixi",
    {
        type = "substitution",
        data = {
            dotlessi = "i",
            dotlessj = "j",
        }
    },
    "fixing i and j"
  }
}
\setmainfont{Junicode}[
  Contextuals=Alternate,
  Numbers=OldStyle,
  RawFeature=+fixi]
\begin{document}
ji ii ij
\end{document}

如果您自 2017 年 2 月以来已更新luaotfload,请通过\directlua以下方式调用:

\directlua
{
  fonts.handlers.otf.addfeature
  {
    name = "fixi",
    type = "substitution",
    data =
        {
          dotlessi = "i",
          dotlessj = "j",
        },
  }
}

如果确实在某处需要无点 i,请使用\addfontfeature{RawFeature=-fixi}

答案2

旧帖,但仍然......

Junicode 包含一个 ccmp 查找,当 i 后面跟着组合变音符号(或前面或后面跟着组合双变音符号)时,它会将 i 分解为 dotlessi。这是因为字体包含大量没有预制形式的组合变音符号。

在我看来,LuaTeX 错误地应用了此功能,即使上下文并不需要它——尽管只有当 aj 跟在后面时才需要它。为什么会发生这种情况,我甚至无法想象。这是 Junicode 中不寻常的功能和 LuaTeX 中的错误(我在其他任何应用程序中都没有看到过这个错误)的奇怪交集。

我并不打算从 Junicode 中删除此功能。不过,如果您有 FontForge 或其他字体编辑器,您可以自己这样做。这是第三次 ccmp 查找。同时,我正在寻找一种不会触发 LuaTeX 错误来实现 Junicode 功能的方法。

相关内容