42.12.12 Низкоуровневое представление шрифта

Обычно нет необходимости напрямую управлять шрифтами. Если вам всё же нужно это сделать, данный раздел объясняет, как.

В языке Emacs Lisp шрифты представлены тремя различными типами объектов Lisp: объектами шрифта, спецификациями шрифта и сущностями шрифта.

Функция: fontp объект &optional тип

Возвращает t, если объект является объектом шрифта, спецификацией шрифта или сущностью шрифта. В противном случае возвращает nil.

Необязательный аргумент тип, если он не равен nil, определяет точный тип объекта Lisp, который следует проверять. В этом случае тип должен быть одним из font-object, font-spec или font-entity.

Объект шрифта — это объект Lisp, представляющий шрифт, который Emacs открыл. Объекты шрифта нельзя изменять в Lisp, но их можно исследовать.

Функция: font-at позиция &optional окно строка

Возвращает объект шрифта, используемый для отображения символа в позиции позиция в окне окно. Если окно равно nil, по умолчанию используется выбранное окно. Если строка равна nil, то позиция указывает позицию в текущем буфере; в противном случае строка должна быть строкой, а позиция указывает позицию в этой строке.

Спецификация шрифта — это объект Lisp, содержащий набор параметров, которые можно использовать для поиска шрифта. Более одного шрифта могут соответствовать параметрам в спецификации шрифта.

Функция: font-spec &rest аргументы

Возвращает новую спецификацию шрифта, используя параметры из аргументы, которые должны быть парами свойство-значение. Возможные параметры:

:name

Имя шрифта (строка) в формате XLFD, Fontconfig или GTK+. См. Шрифты в Руководстве по GNU Emacs.

:family
:foundry
:weight
:slant
:width

Эти свойства имеют те же значения, что и одноимённые атрибуты стиля. См. Атрибуты стиля. :family и :foundry являются строками, а остальные три — символами. В качестве примеров значений: :slant может быть italic, :weight может быть bold, а :width может быть normal.

:size

Размер шрифта — либо неотрицательное целое число, задающее размер в пикселях, либо число с плавающей запятой, задающее размер в пунктах.

:adstyle

Дополнительная типографская информация о шрифте, например «sans». Значение должно быть строкой или символом.

:registry

Реестр кодировки и набор символов шрифта, например «iso8859-1». Значение должно быть строкой или символом.

:dpi

Разрешение в точках на дюйм, для которого разработан шрифт. Значение должно быть неотрицательным числом.

:spacing

Интервал шрифта: пропорциональный, двойной, моноширинный или ячеечный. Значение должно быть либо целым числом (0 для пропорционального, 90 для двойного, 100 для моноширинного, 110 для ячеечного), либо однобуквенным символом (одним из P, D, M или C).

:avgwidth

Средняя ширина шрифта в единицах 1/10 пикселя. Значение должно быть неотрицательным числом.

:script

Система письма, которую должен поддерживать шрифт (символ).

:lang

Язык, который должен поддерживать шрифт. Значение должно быть символом, имя которого является двухбуквенным кодом языка ISO-639. На X значение сопоставляется с полем «Additional Style» в имени XLFD шрифта, если оно не пусто. В MS-Windows шрифты, соответствующие спецификации, должны поддерживать кодовые страницы, необходимые для данного языка. В настоящее время с этим свойством поддерживается лишь небольшой набор языков CJK: «ja», «ko» и «zh».

:otf

Шрифт должен быть шрифтом OpenType, поддерживающим эти функции OpenType, при условии, что Emacs скомпилирован с библиотекой, такой как «libotf» в GNU/Linux, которая поддерживает сложную верстку текста для систем письма, нуждающихся в этом. Значение должно быть списком вида

(script-tag langsys-tag gsub gpos)

где script-tag — это символ тега сценария OpenType; langsys-tag — это символ тега языковой системы OpenType или nil для использования языковой системы по умолчанию; gsub — это список символов тегов функций OpenType GSUB или nil, если ни одна не требуется; а gpos — это список символов тегов функций OpenType GPOS или nil, если ни одна не требуется. Если gsub или gpos являются списком, то элемент nil в этом списке означает, что шрифт не должен соответствовать ни одному из оставшихся символов тегов. Элемент gpos может быть опущен. Список тегов сценариев, языков и функций OpenType см. в списке зарегистрированных тегов OTF.

:type

Символ, определяющий бэкенд шрифта, используемый для отрисовки символов. Возможные значения зависят от платформы и того, как Emacs был сконфигурирован при сборке. Типичные значения включают ftcrhb и xfthb на X, harfbuzz в MS-Windows, ns в GNUstep и т. д. Также может быть nil, если не указано, обычно в спецификации шрифта.

Функция: font-put спецификация-шрифта свойство значение

Устанавливает свойство шрифта свойство в спецификации шрифта спецификация-шрифта в значение. свойство может быть любым из описанных выше.

Сущность шрифта — это ссылка на шрифт, который не обязательно должен быть открыт. Её свойства являются промежуточными между объектом шрифта и спецификацией шрифта: подобно объекту шрифта и в отличие от спецификации шрифта, она ссылается на один конкретный шрифт. В отличие от объекта шрифта, создание сущности шрифта не загружает содержимое этого шрифта в память компьютера. Emacs может открывать несколько объектов шрифта разных размеров из одной сущности шрифта, ссылающейся на масштабируемый шрифт.

Функция: find-font спецификация-шрифта &optional фрейм

Эта функция возвращает сущность шрифта, которая наилучшим образом соответствует спецификации шрифта спецификация-шрифта на фрейме фрейм. Если фрейм равен nil, по умолчанию используется выбранный фрейм.

Функция: list-fonts спецификация-шрифта &optional фрейм num предпочитаемый

Эта функция возвращает список всех сущностей шрифта, соответствующих спецификации шрифта спецификация-шрифта.

Необязательный аргумент фрейм, если не равен nil, определяет фрейм, на котором должны отображаться шрифты. Необязательный аргумент num, если не равен nil, должен быть целым числом, определяющим максимальную длину возвращаемого списка. Необязательный аргумент предпочитаемый, если не равен nil, должен быть другой спецификацией шрифта, которая используется для управления порядком возвращаемого списка; возвращаемые сущности шрифта сортируются в порядке убывания близости к этой спецификации шрифта.

Если вы вызываете set-face-attribute и передаёте спецификацию шрифта, сущность шрифта или строку с именем шрифта в качестве значения атрибута :font, Emacs открывает наилучший соответствующий шрифт, доступный для отображения. Затем он сохраняет соответствующий объект шрифта как фактическое значение атрибута :font для этого стиля.

Следующие функции можно использовать для получения информации о шрифте. Для этих функций аргумент шрифт может быть объектом шрифта, сущностью шрифта или спецификацией шрифта.

Функция: font-get шрифт свойство

Эта функция возвращает значение свойства шрифта свойство для шрифт. свойство может быть любым из поддерживаемых font-spec.

Если шрифт является спецификацией шрифта, и спецификация шрифта не задаёт свойство, возвращаемое значение — nil. Если шрифт является объектом шрифта или сущностью шрифта, значение для свойства :script может быть списком систем письма, поддерживаемых шрифтом, а значение свойства :otf является парой вида (gsub . gpos), где gsub и gpos являются списками, представляющими функции OpenType, поддерживаемые шрифтом, вида

((script-tag (langsys-tag feature…) …) …)

где script-tag, langsys-tag и feature являются символами, представляющими теги верстки OpenType.

Если шрифт является объектом шрифта, специальное свойство :combining-capability не равно nil, если бэкенд шрифта шрифт поддерживает отрисовку комбинируемых символов для не-OpenType шрифтов.

Функция: font-face-attributes шрифт &optional фрейм

Эта функция возвращает список атрибутов стиля, соответствующих шрифт. Необязательный аргумент фрейм определяет фрейм, на котором отображается шрифт. Если он равен nil, используется выбранный фрейм. Возвращаемое значение имеет вид

(:family family :height height :weight weight
   :slant slant :width width)

где значения family, height, weight, slant и width являются значениями атрибутов стиля. Некоторые из этих пар ключ-атрибут могут быть опущены в списке, если они не заданы шрифт.

Функция: font-xlfd-name шрифт &optional fold-wildcards long-xlfds

Эта функция возвращает строку XLFD (X Logical Font Descriptor), соответствующую шрифт. См. Шрифты в Руководстве по GNU Emacs для получения информации об XLFD.

Если необязательный аргумент fold-wildcards не равен nil, последовательные шаблоны в XLFD сворачиваются в один.

Если необязательный аргумент long-xlfds опущен или равен nil, функция возвращает nil, если XLFD превышает 255 символов в длину; это сделано для совместимости с протоколом X, который требует ограничения длины XLFD. Если long-xlfds не равен nil, это ограничение снимается, и функция может возвращать XLFD любой длины.

Следующие две функции возвращают важную информацию о шрифте.

Функция: font-info имя &optional фрейм

Эта функция возвращает информацию о шрифте, заданном его имя (строкой), в том виде, в котором он используется на фрейм. Если фрейм опущен или равен nil, по умолчанию используется выбранный фрейм.

Значение, возвращаемое функцией, является вектором вида [opened-name full-name size height baseline-offset relative-compose default-ascent max-width ascent descent space-width average-width filename capability]. Вот описание каждого компонента этого вектора:

opened-name

Имя, использованное для открытия шрифта, строка.

full-name

Полное имя шрифта, строка.

size

Размер шрифта в пикселях.

height

Высота шрифта в пикселях.

baseline-offset

Смещение в пикселях от базовой линии ASCII, положительное вверх.

relative-compose
default-ascent

Числа, управляющие составными символами.

max-width

Максимальная ширина продвижения шрифта.

ascent
descent

Верхний и нижний выступы этого шрифта. Сумма этих двух чисел должна быть равна значению height выше.

space-width

Ширина символа пробела в пикселях.

average-width

Средняя ширина символов шрифта. Emacs использует это для расчёта расположения текста на экране; если значение average-width равно нулю, Emacs использует значение space-width вместо него для этих целей.

filename

Имя файла шрифта в виде строки. Может быть nil, если бэкенд шрифта не предоставляет способа узнать имя файла шрифта.

capability

Список, первый элемент которого является символом, представляющим тип шрифта: x, opentype, truetype, type1, pcf или bdf. Для шрифтов OpenType список включает 2 дополнительных элемента, описывающих функции GSUB и GPOS, поддерживаемые шрифтом. Каждый из этих элементов является списком вида ((script (langsys feature …) …) …), где script — это символ, представляющий тег сценария OpenType, langsys — это символ, представляющий тег языковой системы OpenType (или nil, означающий языковую систему по умолчанию), а каждый feature — это символ, представляющий тег функции OpenType.

Функция: query-font объект-шрифта

Эта функция возвращает информацию об объект-шрифта. (В отличие от font-info, которая принимает имя шрифта (строку) в качестве аргумента.)

Значение, возвращаемое функцией, является вектором вида [name filename pixel-size max-width ascent descent space-width average-width capability]. Вот описание каждого компонента этого вектора:

name

Имя шрифта, строка.

filename

Имя файла шрифта в виде строки. Может быть nil, если бэкенд шрифта не предоставляет способа узнать имя файла шрифта.

pixel-size

Размер шрифта в пикселях, использованный для открытия шрифта.

max-width

Максимальная ширина продвижения шрифта.

ascent
descent

Верхний и нижний выступы этого шрифта. Сумма этих двух чисел даёт высоту шрифта.

space-width

Ширина символа пробела в пикселях.

average-width

Средняя ширина символов шрифта. Если она равна нулю, Emacs использует значение space-width при расчёте расположения текста на экране.

capability

Список, первый элемент которого является символом, представляющим тип шрифта: x, opentype, truetype, type1, pcf или bdf. Для шрифтов OpenType список включает 2 дополнительных элемента, описывающих функции GSUB и GPOS, поддерживаемые шрифтом. Каждый из этих элементов является списком вида ((script (langsys feature …) …) …), где script — это символ, представляющий тег сценария OpenType, langsys — это символ, представляющий тег языковой системы OpenType (или nil, означающий языковую систему по умолчанию), а каждый feature — это символ, представляющий тег функции OpenType.

Следующие четыре функции возвращают информацию о размерах шрифтов, используемых различными стилями, что позволяет учитывать различные аспекты верстки в программах на Lisp. Эти функции учитывают переопределение стилей, возвращая информацию о переопределённом стиле, если данный стиль был переопределён. См. Переопределение стилей.

Функция: default-font-width

Эта функция возвращает среднюю ширину в пикселях шрифта, используемого стилем по умолчанию текущего буфера, для выбранного фрейма.

Функция: default-font-height

Эта функция возвращает высоту в пикселях шрифта, используемого стилем по умолчанию текущего буфера, для выбранного фрейма.

Функция: window-font-width &optional окно стиль

Эта функция возвращает среднюю ширину в пикселях для шрифта, используемого стиль в окно. Указанное окно должно быть активным окном. Если nil или опущено, окно по умолчанию равно выбранному окну, а стиль по умолчанию равен стилю по умолчанию в окно.

Функция: window-font-height &optional окно стиль

Эта функция возвращает высоту в пикселях для шрифта, используемого стиль в окно. Указанное окно должно быть активным окном. Если nil или опущено, окно по умолчанию равно выбранному окну, а стиль по умолчанию равен стилю по умолчанию в окно.