Низкоуровневый интерфейс

В отличие от команд шрифтов высокого уровня, которые предназначены для использования в документе, команды низкого уровня предназначены главным образом для определения новых команд в пакетах или в преамбуле документа. Чтобы наилучшим образом использовать такие команды, полезно понять внутреннюю организацию шрифтов в схеме выбора шрифтов LaTeX (NFSS).

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

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

Значения этих атрибутов определяют используемый в данный момент шрифт. LaTeX также поддерживает большой набор таблиц, используемых для связывания комбинаций атрибутов с внешними шрифтами (т. е. файлы .tfm, которые содержат данные, необходимые LaTeX для выполнения своей работы). Выбор шрифта затем выполняется в два этапа:

  1. Ряд атрибутов шрифта можно изменить с помощью низкоуровневых команд \fontencoding, \fontfamily, \fontseries, \fontshape и \fontsize.

  2. Шрифт, соответствующий этим новым настройкам атрибута, выбирается путем вызова команды \selectfont.

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

5.1. Настройка отдельных атрибутов шрифта

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

Если вы хотите выбрать конкретный шрифт с помощью этого интерфейса — например, Computer Modern Dunhill, полужирный, сокращенный курсив 14pt — знания одних только соглашений об интерфейсе недостаточно, поскольку для каждой комбинации значений атрибутов не существует внешнего шрифта. Вы можете попробовать указать что-то вроде следующего:

1\fontencoding{OT1}\fontfamily{cmdh}\fontseries{bc}\fontshape{it}%
2\fontsize{14}{16pt}\selectfont

Этот код будет правильным в соответствии с соглашениями об именах, как мы увидим ниже. Однако из-за того, что эта комбинация атрибутов не соответствует реальному шрифту, LaTeX придется заменить другой шрифт. Механизм подмены может выбрать шрифт, который сильно отличается от желаемого, поэтому вам следует обратиться к таблицам шрифтов, чтобы проверить, доступна ли нужная комбинация. Вот более подробная информация о процессе замены шрифта.

Выбор семейства шрифтов

Семейство шрифтов выбирается командой \fontfamily. В качестве аргумента он принимает строку символов, которая ссылается на семейство шрифтов, объявленное во внутренних таблицах. Строка символов была определена при настройке этих таблиц и обычно представляет собой короткую последовательность букв — например, cmr для семейства Computer Modern Roman. Фамилии не должны быть длиннее пяти букв, поскольку они могут быть объединены еще с тремя буквами для формирования имени файла, которое в некоторых системах может состоять не более чем из восьми букв.

Выбор серии шрифта

Команда \fontseries изменяет атрибут серии. Серия объединяет в своем аргументе толщину и ширину, что означает, что невозможно изменить ширину текущего шрифта независимо от его толщины. Это приемлемо, поскольку вряд ли когда-либо потребуется индивидуально менять вес или ширину. Напротив, изменение веса часто сопровождается изменением ширины в спецификации дизайнера. Это неудивительно, поскольку изменение веса меняет внешний вид букв по горизонтали и, таким образом, требует корректировки расширения (ширины) для создания хорошо сбалансированного вида.

Имена веса и ширины сокращены в названиях серий, поэтому каждая комбинация уникальна. Эти соглашения об именах показаны в таблице ниже. Любой экземпляр m (обозначающий средний по весу или ширине) опускается, за исключением случаев, когда и вес, и ширина являются средними, и в этом случае используется один m. Например, выделенный полужирным шрифтом будет bx, тогда как средний расширенный шрифт будет x, а полужирный средний — b.

Соглашение об именах серий шрифтов

Выбор формы шрифта

Команда \fontshape изменяет атрибут формы. Для стандартных форм используются одно- и двухбуквенные сокращения. Эти формы перечислены в таблице ниже:

Соглашения об именах фигур шрифтов

Выбор размера шрифта

Команда \fontsize{<size>}{<skip>} изменяет размер шрифта. Он принимает два аргумента: <size> для переключения и базовую линию <skip> (расстояние между базовыми линиями для этого размера). Размеры шрифта обычно измеряются в пунктах, поэтому по соглашению единица измерения опускается. То же самое справедливо и для второго аргумента. Однако если пропуск базовой линии должен иметь резиновую длину, необходимо указать единицу измерения. Таким образом, допустимое изменение размера может быть запрошено

1\fontsize{14.4}{17}\selectfont

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

Если вы используете шрифты произвольных размеров, вы, конечно, можете выбрать любой размер:

1\fontsize{1in}{1.2in}\selectfont A text in an arbitrary font size

Выбор кодировки

Команда \fontencoding используется для изменения кодировки. Аргументом является внутреннее имя желаемой кодировки. Это имя должно быть известно LaTeX либо как одна из предопределенных кодировок (загружаемая ядром), либо как объявленное с помощью команды \DeclareFontEncoding. Вот дополнительная информация о объявлении кодировок шрифтов. Имена стандартных кодировок шрифтов перечислены в таблице ниже:

Имена стандартных кодировок шрифтов NFSS основан на предположении, что большинство (или, лучше, все) шрифтов для текста доступны в одной и той же кодировке, если они используются для набора на одном и том же языке. Другими словами, изменения кодировки должны быть необходимы только в том случае, если вы переключаетесь с одного языка на другой. В этом случае пакеты языковой поддержки (например, из системы Babel) обычно должны незаметно заботиться о кодировании.

В следующем примере мы изменяем кодировку вручную, определив среду Cyr для набора текста на кириллице. В этой среде локально изменяются как кодировка шрифта, так и входная кодировка. Конечно, для правильной языковой поддержки потребуются дополнительные работы, например, изменение правил расстановки переносов. Кодировки объявляются в LaTeX путем их загрузки с помощью пакета Fontenc. T2A указывает одну из стандартных кодировок кириллицы. T1 становится кодировкой по умолчанию, поскольку она загружается последней.

Пример исходного кода Encondings

Пример вывода кодов

К сожалению, T1 не может быть полностью реализован для большинства шрифтов PostScript. Пять символов в следующем примере, скорее всего, будут отображаться в виде чернильных пятен, что указывает на отсутствие глифов в шрифте. Обратите внимание, что символы «за тысячу» и «за десять тысяч» на самом деле образуются путем соединения знака процента и одного или двух дополнительных маленьких нулей; отсутствует только последний глиф.

1\usepackage[T1]{fontenc}
2-----------------------------------------
3\fontfamily{cmr}\selectfont
4\j{} \ng{} \NG{} \textperthousand{}\textpertenthousand \par
5\fontfamily{ptm}\selectfont
6\j{} \ng{} \NG{} \textperthousand{}\textpertenthousand{}

T1 для шрифтов PostScript

5.2. Установка нескольких атрибутов шрифта

При разработке стилей страниц или команд, ориентированных на макет, часто требуется выбрать определенный шрифт, то есть вам необходимо указать значения для всех атрибутов. Для этого LaTeX предоставляет команду \usefont, которая принимает четыре аргумента: кодировку, семейство, серию и форму. Команда обновляет эти атрибуты, а затем вызывает \selectfont. Если вы также хотите указать размер и пропуск базовой линии, поместите команду \fontsize перед \usefont. Например,

1\fontsize{14}{16pt}\usefont{OT1}{cmdh}{bc}{it}

даст тот же результат, что и следующие команды:

1\fontencoding{OT1}\fontfamily{cmdh}\fontseries{bc}\fontshape{it}%
2\fontsize{14}{16pt}\selectfont

LaTeX также предоставляет объявление \DeclareFixedFont, которое можно использовать для определения новых команд, которые переключаются на полностью фиксированный шрифт. Такие команды выполняются очень быстро, поскольку им не нужно искать внутренние таблицы. Поэтому они очень полезны в определениях команд, которые должны переключаться между шрифтами. Например, если мы хотим объявить команду для набора определенного текста в размере скрипта, мы можем сделать это следующим образом:

1\DeclareFixedFont\ScriptSizeFont{\encodingdefault}{\familydefault}
2    {\seriesdefault}{\shapedefault}{7pt}
3\newcommand\theScript[1]{{\ScriptSizeFont #1}}

Вы можете видеть, что \DeclareFixedFont имеет шесть аргументов. За именем определяемой команды следуют пять атрибутов шрифта в классификациях NFSS. Вместо передачи фиксированных значений (кроме размера) используются встроенные хуки, описывающие основной шрифт документа. Следовательно, в приведенном выше примере \ScriptSizeFont по-прежнему зависит от общего макета документа. Однако после выполнения определения его значение замораживается, поэтому последующие изменения значений по умолчанию не изменят шрифт \ScriptSizeFont.

5.3. Автоматическая замена шрифтов

Если запрос на изменение шрифта не может быть выполнен, поскольку комбинация неизвестна LaTeX, он пытается восстановить его, используя шрифт с аналогичными атрибутами. Вот что происходит подробно: если комбинация схемы кодирования, семейства, серии и формы не объявлена, LaTeX пытается найти известную комбинацию, сначала изменяя атрибут формы на значение по умолчанию. Если результирующая комбинация все еще неизвестна, он пытается изменить серию на значение по умолчанию. В крайнем случае, он меняет семейство на значение по умолчанию. Наконец, он просматривает запись внутренней таблицы, чтобы найти запрошенный размер. Например, если вы запросите \ttfamily\bfseries\itshape — шрифт пишущей машинки, выделенный жирным шрифтом и курсивом (которого обычно не существует) — тогда вы получите шрифт пишущей машинки средней серии и вертикальной формы, потому что сначала LaTeX сбрасывает форму перед сбросом серии. В таком случае, если вы предпочитаете шрифт пишущей машинки с курсивом, вам необходимо сообщить LaTeX о своих предпочтениях с помощью функции sub, которая описана в статье Как настроить новые шрифты.

Процесс замены никогда не меняет схему кодирования, поскольку любое изменение может привести к появлению неверных символов в выходных данных. Как вы, наверное, помните, схема кодирования определяет, как интерпретировать входные символы, а другие атрибуты определяют, как должен выглядеть вывод. Поэтому было бы неуместно, если бы, например, знак фунта был заменен знаком доллара в контракте только потому, что программное обеспечение попыталось схитрить.

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

5.4. Как использовать команды низкого уровня в документе

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

Если вы можете использовать команды высокого уровня, такие как \textsf, вам следует по возможности избегать использования команд низкого уровня непосредственно в документе. Причина в том, что команды низкого уровня представляют собой очень точные инструкции по переключению на определенный шрифт, тогда как команды высокого уровня можно настроить с помощью пакетов или объявлений в преамбуле. Предположим, вы выбрали Computer Modern Sans в своем документе, используя \fontfamily{cmss}\selectfont. Если позже вы решите набрать весь документ с использованием шрифтов из пакета PSNFSS — скажем, Times — применение пакета изменит только те части документа, которые не содержат явных команд \fontfamily.

Subscribe to Aspose Product Updates

Get monthly newsletters & offers directly delivered to your mailbox.