LuaLaTeX如何加载fallback字体

发布于 2021-10-28 17:08:50

因为编辑古籍需要加载超大字库,在XeLaTeX中可以很方便地使用

\newCJKfontfamily{\mingti}[Path=fonts/,Extension=.ttf, FallBack={[Path=fonts/]HanaMinB.ttf}]{HanaMinA}

来加载,但是在XeLaTeX中颜色相关命令会影响断行。所以选择LuaLaTeX。
但是,LuaLaTeX中无法使用FallBack参数,请问LuaLaTeX如何加载超大字库?

代码片段如下:

% !TeX program = Lualatex
% !TeX spellcheck = en_US
% !TeX encoding = UTF-8

\documentclass{book}
\usepackage{ctex}
\usepackage{xcolor}
\usepackage{jiazhu}

\setCJKmainfont[Path=fonts/]{HanaMinA.ttf}
\renewcommand{\rm}[1]{\textcolor{red}{#1}}

\begin{document}
\Huge

太祖武皇帝,沛國譙人也,姓\rm{曹},諱\rm{操},字\rm{孟德},
漢相國\rm{參}之後。\jiazhu{〔曹瞞傳曰〕:太祖一名\rm{吉利},小字\rm{阿瞞}。}????、????、????、????
\end{document}

查看更多

关注者
0
被浏览
1.8k
雾月
雾月 2021-10-29
这家伙很懒,什么也没写!

一个可行的方案见:https://tex.stackexchange.com/questions/520034/fallback-for-harfbuzz-fonts

LuaTeX 下使CJK字符的排版是通过 luatexja 宏包实现的,而 XeTeX 下则是通过 xeCJK 实现。
latexja 是使用 lua (harfbuzz) 直接修改底层代码,xeCJK 通过在宏层面来实现(通过 \xeCJK_glyph_if_exist:N.. 判断每一个字符在当前字体下是否有glyph,若没有则依次在给定的FallBack字体下查找)。和上面的链接原理上是一致的。这个对于没有字体相关知识的人来说还是不要瞎折腾了。

但是呢,ctex 在 LuaTeX 下提供了 AlternateFontCharRange 特性,你可以通过它们来设置字符在 Range 中的字体。

\documentclass{article}
\usepackage{ctex}

\setCJKfamilyfont{simsong}{FZFangSong-Z02S}% 方正仿宋简体
\setCJKfamilyfont{bigsong}{FZFangSong-Z02S}
  [
    AlternateFont={
      {big}{KaiTi}, % 楷体
    }
  ]

\ctexset{
  declarecharrange={
    {big} { "9FA0 -> "9FA5 },
  },
}

\begin{document}
\Huge
\def\testchars{\char"9F99\char"9F9A\char"9F9B\char"9FA0\char"9FA1\char"9FA2\char"9FA5}
{
\CJKfamily{simsong}
\testchars
}
{
\CJKfamily{bigsong}
\testchars
}

\end{document}

image.png

不过这个会将字符 Range 都设为相同的字体,与 FallBack 不同。
但是你可以使用 harfbuzz 的 Face:collect_unicodes() 函数来判断是否存在该字形。

如果在 LaTeX 下,还是老老实实用 XeTeX 吧。
当然,你可以用 ConTeXt,它完全支持 FallBack 特性,也没有断行问题。

另外再多说一句,你说的“影响断行算法”,不过是影响 xeCJK 插入的glue而导致使用颜色和不使用颜色断行位置的差异。但是这个差异是完全可以很容易消除的。

例如,使用 \raggedright 强制左对齐:

\documentclass{book}
\usepackage{ctex}
\usepackage{xcolor}

\raggedright
\setlength\parindent{2\ccwd}

\newcommand{\book}[1]{#1}
\newcommand{\testtext}{補\sm{史記}的\zm{褚先生}名\sm{少孫},%
是\zm{漢朝}\zm{元}\zm{成}間的一個博士。}

\begin{document}
\Huge

\newcommand{\sm}[1]{\textcolor{red}{#1}}
\newcommand{\zm}[1]{\textcolor{blue}{#1}}
\testtext

\renewcommand{\sm}[1]{#1}
\renewcommand{\zm}[1]{#1}
\testtext

\end{document}

image.png

或者修改 CJKglue

2 个回答
啸行
啸行 2021-10-29
这家伙很懒,什么也没写!

image.png

撰写答案

请登录后再发布答案,点击登录

发布
问题

分享
好友

手机
浏览

扫码手机浏览