\textlangle 和 \textrangle,带有 kpfonts-otf,无法通过 lualatex 显示,但可以通过 xelatex 显示

\textlangle 和 \textrangle,带有 kpfonts-otf,无法通过 lualatex 显示,但可以通过 xelatex 显示

如下面的 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 以避免使用此字符。

相关内容