因为编辑古籍需要加载超大字库,在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}
一个可行的方案见: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 下提供了 AlternateFont
和 CharRange
特性,你可以通过它们来设置字符在 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}
不过这个会将字符 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}
或者修改 CJKglue
。