Шрифтовой набор (fontset) — это список шрифтов, каждый из которых назначен диапазону кодов символов. Отдельный шрифт не может отобразить весь диапазон символов, который поддерживает Emacs, но шрифтовой набор может. Шрифтовые наборы имеют имена, как и шрифты, и вы можете использовать имя шрифтового набора вместо имени шрифта при указании шрифта для кадра или лица. Ниже приведена информация об определении шрифтового набора программно на Лиспе.
Эта функция определяет новый шрифтовой набор согласно строке спецификации fontset-spec. Строка должна иметь следующий формат:
fontpattern, [charset:font]…
Пробельные символы до и после запятых игнорируются.
Первая часть строки, fontpattern, должна иметь форму стандартного имени шрифта X, за исключением того, что последние два поля должны быть ‘fontset-alias’.
Новый шрифтовой набор имеет два имени: длинное и короткое. Длинное имя — это fontpattern целиком. Короткое имя — ‘fontset-alias’. Вы можете ссылаться на шрифтовой набор по любому из этих имён. Если шрифтовой набор с таким же именем уже существует, сигнализируется ошибка, если только noerror не равен не-nil; в этом случае функция ничего не делает.
Если необязательный аргумент style-variant-p не равен nil, это означает, что нужно также создать жирный, курсивный и жирно-курсивный варианты шрифтового набора. Эти варианты шрифтового набора не имеют короткого имени, только длинное, которое создаётся путём изменения fontpattern для указания статуса жирности и/или курсивности.
Строка спецификации также указывает, какие шрифты использовать в шрифтовом наборе. Подробности см. ниже.
Конструкция ‘charset:font’ указывает, какой шрифт использовать (в этом шрифтовом наборе) для одного конкретного набора символов. Здесь charset — это имя набора символов, а font — шрифт, используемый для этого набора символов. Вы можете использовать эту конструкцию любое количество раз в строке спецификации.
Для остальных наборов символов, которые вы явно не указали, Emacs выбирает шрифт на основе fontpattern: он заменяет ‘fontset-alias’ на значение, которое называет один набор символов. Для набора символов ASCII ‘fontset-alias’ заменяется на ‘ISO8859-1’.
Кроме того, когда несколько последовательных полей являются шаблонами, Emacs сворачивает их в один шаблон. Это делается для предотвращения использования автоматически масштабируемых шрифтов. Шрифты, полученные масштабированием больших шрифтов, непригодны для редактирования, а масштабирование меньшего шрифта бесполезно, поскольку лучше использовать меньший шрифт в его собственном размере, что Emacs и делает.
Таким образом, если fontpattern выглядит так:
-*-fixed-medium-r-normal-*-24-*-*-*-*-*-fontset-24
то спецификация шрифта для символов ASCII будет такой:
-*-fixed-medium-r-normal-*-24-*-ISO8859-1
а спецификация шрифта для китайских символов GB2312 будет такой:
-*-fixed-medium-r-normal-*-24-*-gb2312*-*
Возможно, у вас нет китайского шрифта, соответствующего указанной выше спецификации. В большинстве дистрибутивов X входят только китайские шрифты, имеющие ‘song ti’ или ‘fangsong ti’ в поле family. В таком случае ‘Fontset-n’ может быть задан следующим образом:
Emacs.Fontset-0: -*-fixed-medium-r-normal-*-24-*-*-*-*-*-fontset-24,\
chinese-gb2312:-*-*-medium-r-normal-*-24-*-gb2312*-*
Тогда спецификации шрифтов для всех символов, кроме китайских GB2312, будут иметь ‘fixed’ в поле family, а спецификация шрифта для китайских символов GB2312 будет иметь шаблон ‘*’ в поле family.
Эта функция изменяет существующий fontset, чтобы использовать шрифт, указанный font-spec, для отображения заданных characters.
Если fontset равен nil, эта функция изменяет шрифтовой набор выбранного кадра или кадра frame, если frame не равен nil.
Если fontset равен t, эта функция изменяет шрифтовой набор по умолчанию, короткое имя которого как строки — ‘fontset-default’.
Аргумент characters может быть отдельным символом, который должен отображаться с использованием font-spec. Он также может быть точечной парой (from . to), где from и to — символы. В этом случае используйте font-spec для всех символов в диапазоне от from до to включительно.
characters может быть символом набора символов (см. Наборы символов). В этом случае используйте font-spec для всех символов этого набора.
characters может быть символом скрипта (см. char-script-table). В этом случае используйте font-spec для всех символов, принадлежащих этому скрипту. См. также use-default-font-for-symbols, которое влияет на выбор шрифта, когда characters указывает на скрипт symbol или принадлежит ему (включая символьные и пунктуационные символы).
characters может быть nil, что означает использование font-spec для любого символа в fontset, для которого не задана спецификация шрифта.
font-spec может быть объектом спецификации шрифта, созданным функцией font-spec (см. Низкоуровневое представление шрифтов).
font-spec может быть точечной парой (family . registry), где family — имя семейства шрифтов (возможно, включающее имя производителя в начале), а registry — имя реестра шрифта (возможно, включающее имя кодировки в конце).
font-spec может быть именем шрифта, строкой.
font-spec может быть nil, что явно указывает, что для указанных characters шрифт отсутствует. Это полезно, например, чтобы избежать дорогостоящего общесистемного поиска шрифтов для символов, не имеющих глифов, таких как символы из области частного использования Unicode (PUA).
Необязательный аргумент add, если не равен nil, определяет, как добавить font-spec к ранее установленным спецификациям шрифта для characters. Если он равен prepend, font-spec добавляется в начало существующих спецификаций. Если он равен append, font-spec добавляется в конец. По умолчанию font-spec заменяет ранее установленные спецификации шрифтов.
Например, этот вызов изменяет шрифтовой набор по умолчанию, чтобы использовать шрифт с именем семейства ‘Kochi Gothic’ для всех символов, принадлежащих набору japanese-jisx0208:
(set-fontset-font t 'japanese-jisx0208
(font-spec :family "Kochi Gothic"))
Обратите внимание, что эту функцию обычно следует вызывать из пользовательских файлов инициализации и, в более общем смысле, до того, как какие-либо из characters были отображены в текущем сеансе Emacs. Это связано с тем, что для некоторых скриптов Emacs кеширует способ их отображения, и кешированная информация включает используемый для них шрифт — как только эти символы были отображены хотя бы раз, кешированный шрифт будет продолжать использоваться независимо от изменений в шрифтовых наборах.
Эта функция возвращает не-nil, если Emacs должен быть способен отобразить char. Или, точнее, если шрифтовой набор выбранного кадра имеет шрифт для отображения набора символов, к которому принадлежит char.
Шрифтовые наборы могут указывать шрифт для каждого символа индивидуально; когда шрифтовой набор так делает, значение этой функции может быть неточным.
Эта функция может возвращать не-nil, даже если доступного шрифта нет, поскольку она также проверяет, может ли кодовая система для текстового терминала закодировать этот символ (см. Кодировка ввода-вывода терминала).