\textlangle 和 \textrangle,使用 kpfonts-otf,不使用 lualatex 顯示,但使用 xelatex 顯示

\textlangle 和 \textrangle,使用 kpfonts-otf,不使用 lualatex 顯示,但使用 xelatex 顯示

如下面的MCE所示,\textlangle和與+\textrangle一起正確顯示,但與+一起顯示不正確。pdflatexkpfontslualatexkpfonts-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 來避免此字元。

相關內容