
Как показано в следующем MCE, \textlangle
и \textrangle
правильно отображаются с pdflatex
+ kpfonts
, но не с lualatex
+ kpfonts-otf
.
Последний случай не так уж и неожиданный, так как Дэниел Флипо, сопровождающий kpfonts-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
\textlangle и \textrangle LaTeX по умолчанию вставляют кодовые точки 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
Работает в luatex, если вы используете HarfBuzz (например, xetex)
\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 использовать не следует, поскольку он имеет неудачную нормализацию Unicode до полноширинной угловой скобки в блоке CJK, а U+27E8 был добавлен специально, чтобы избежать этого символа.