如下面的 MCE 所示,\textlangle
和\textrangle
可以正确显示pdflatex
+ kpfonts
,但不能显示lualatex
+则不能kpfonts-otf
。
后一种情况并不意外,因为 的维护者 Daniel Flipokpfonts-otf
告诉我这些字符目前缺失(他正在努力解决)。但奇怪的是这些字符可以正确显示xelatex
+可以正确显示kpfonts-otf
。
你知道为什么xelatex
它们会成功显示吗?
\documentclass{article}
\usepackage{iftex}
\ifpdftex
\usepackage[T1]{fontenc}
\usepackage{kpfonts}
\else
\usepackage{kpfonts-otf}
\fi
\begin{document}
\verb|$\langle\rangle$| $=\langle\rangle$
\verb|\textlangle\textrangle| $=$ \textlangle\textrangle
\end{document}
- 和
pdflatex
- 和
xelatex
- 和
lualatex
答案1
LaTeX 的 \textlangle 和 \textrangle 默认插入 Unicode 代码点 U+2329 和 U+232A。在您的字体中,这些字形不存在,但 Unicode 代码点 U+3008 和 U+3009 可用。根据 Unicode 数据表,它们与 U+2329 和 U+232A 是规范等效的(意味着它们“应该”始终完全相同),因此 HarfBuzz(由 XeTeX 使用,当 LuaTex 明确请求时)会替换它们。(这有点问题,因为 U+3008 和 U+3009 是 CJK 字符,因此在许多字体中可能更宽,但这不是 kpfonts 的问题。)
为了在 LuaTeX 中也能获得正确的字形,您可以启用 HarfBuzz 或更改 LaTeX 使用的代码点:
\documentclass{article}
\usepackage{iftex}
\ifpdftex
\usepackage[T1]{fontenc}
\usepackage{kpfonts}
\else
\usepackage{kpfonts-otf}
\DeclareTextSymbol{\textlangle}\UnicodeEncodingName{"3008}
\DeclareTextSymbol{\textrangle}\UnicodeEncodingName{"3009}
\fi
\begin{document}
\verb|$\langle\rangle$| $=\langle\rangle$
\verb|\textlangle\textrangle| $=$ \textlangle\textrangle
\end{document}
答案2
luatex 日志显示
Missing character: There is no 〈 (U+2329) in font [KpRoman-Regular.otf]:mode=n
如果你使用 HarfBuzz(如 xetex),它可以在 luatex 中工作
\documentclass{article}
\usepackage{iftex}
\ifpdftex
\usepackage[T1]{fontenc}
\usepackage{kpfonts}
\else
\usepackage{fontspec}
\ifluatex
\defaultfontfeatures{Renderer=HarfBuzz}
\fi
\usepackage{kpfonts-otf}
\fi
\begin{document}
\verb|$\langle\rangle$| $=\langle\rangle$
\verb|\textlangle\textrangle| $=$ \textlangle\textrangle
\end{document}
理论上(但显然不是在实践中)不应使用 U+2329,因为它在 CJK 块中对全角尖括号有一个不幸的 Unicode 规范化,并且专门添加了 U+27E8 以避免使用此字符。