
如下面的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 來避免此字元。