Как настроить новые шрифты

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

1\fontencoding{OT1}\fontfamily{cmdh}\fontseries{m}\fontshape{n}%
2\fontsize{10}{12pt}\selectfont

Чтобы добавить новые шрифты, вам придется обратить процесс вспять. Для каждого нового внешнего шрифта вам необходимо ответить на пять вопросов:

  1. Что такое кодировка шрифта - то есть какие символы на каких позициях стоят?
  2. Какова его фамилия?
  3. Какая у него серия (вес и ширина)?
  4. Какова его форма?
  5. Каков его размер?

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

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

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

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

Ниже приведена классификация 35 «базовых» шрифтов PostScript в соответствии с интерфейсом шрифтов LaTeX. Для каждого шрифта указано полное имя Adobe и соответствующее короткое имя файла (в обсуждаемой классификации). Для OT1, T1 или TS1 нужно будет добавить 7t, 8t или 8c соответственно, чтобы получить полное имя файла. Например, putr8t для Utopia Regular в кодировке T1. Это будет полезно в дальнейшем обсуждении.

Классификация шрифтов PostScript

Соглашение об именах охватывает внутренние имена TeX для шрифтов (т. е. те, которые используются в объявлениях \DeclareFontShape, как описано в следующем разделе), имена для виртуальных шрифтов и их компонентов (например, определенные перекодировки физических шрифтов), а также имена физических шрифтов. шрифты. В случае шрифтов PostScript физические имена шрифтов часто отличаются от тех, которые используются внутри TeX. В последнем случае имена внутренних шрифтов должны быть сопоставлены с соответствующими внешними шрифтами, когда результат выполнения LaTeX просматривается или печатается. Например, драйвер PostScript dvips использует файлы сопоставления (расширение по умолчанию .map), которые содержат такие строки, как

1putr8r Utopia-Regular "TeXBase1Encoding ReEncodeFont " <8r.enc <putr8a.pfb

сообщая ему, что шрифт putr8r можно получить из внешнего шрифта putr8a.pfb, перекодировав его с помощью специального вектора кодирования (8r.enc). Однако вы не найдете никаких упоминаний об этом putr8r в файле t1put.fd, который содержит объявления \DeclareFontShape для семейства Utopia в кодировке T1. Причина в том, что putr8t — это виртуальный шрифт (созданный с помощью утилиты Fontinst), который ссылается на putr8r. Последнюю ссылку можно найти только в исходниках виртуальных шрифтов.

6.2. Как объявить новые семейства шрифтов и группы форм шрифтов

Каждая комбинация семейства/кодировки должна быть представлена ​​в LaTeX с помощью команды \DeclareFontFamily, которая принимает три аргумента. Первые два — это схема кодировки и фамилия. Третий обычно пуст, но может содержать специальные параметры загрузки шрифтов, которые описаны далее в этой статье. Итак, если вы хотите объявить новое семейство — скажем, Computer Modern Dunhill со старой кодировкой TeX — вы должны написать

1\DeclareFontFamily{OT1}{cmdh}{}

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

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

Например, запись таблицы NFSS для Computer Modern Dunhill Medium Upright в старой схеме кодирования TeX может быть введена как

1\DeclareFontShape{OT1}{cmdh}{m}{n}{ <10> cmdunh10 }{}

при условии, что доступен только один внешний шрифт размером 10pt. Если у вас также есть этот шрифт размером 12 пт (масштабируется от 10 пт), объявление будет таким:

1\DeclareFontShape{OT1}{cmdh}{m}{n}{ <10> <12>cmdunh10 }{}

Если внешний файл доступен во всех возможных размерах, объявление становится очень простым. Это касается шрифтов PostScript типа 1 (контурных) или когда программа-драйвер может генерировать шрифты по требованию, вызывая METAFONT.

Например, жирный вертикальный шрифт Times Roman в схеме кодирования LaTeX «T1» может быть представлен следующим образом.

1\DeclareFontShape{T1}{ptm}{b}{n}{ <-> ptm8t }{}

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

1\DeclareFontShape{T1}{emtt}{m}{n}{<-12> emtt10 <12-> emtt12}{}

В этом случае файл emtt10.tfm будет использоваться для размеров меньше 12pt, а emtt12.tfm — для всех размеров больше или равных 12pt.

Приведенные выше примеры демонстрируют, что пятый аргумент команды \DeclareFontShape состоит из спецификаций размера, заключенных в угловые скобки, а также информации о загрузке для отдельных размеров (например, названий шрифтов). Часть внутри угловых скобок называется информацией о размере, а часть, следующая за закрывающей угловой скобкой, называется информацией о шрифте. Информация о шрифте дополнительно структурируется в функцию размера (часто пустую) и ее аргументы. В аргументах \DeclareFontShape пробелы игнорируются, чтобы сделать записи более читабельными. В необычных обстоятельствах, когда необходимо ввести реальный пробел, вы можете использовать команду \space.

Простые размеры и диапазоны размеров

Информацию о размерах можно разделить на простые размеры и диапазоны размеров. Простой размер задается одним (десятичным) числом, например <10> или <17.28>, и может иметь любое положительное значение. Однако вы, вероятно, не найдете значений меньше 4 или больше 120, поскольку это число представляет собой размер шрифта, измеряемый в пунктах. Диапазон размеров задается двумя простыми размерами, разделенными дефисом, чтобы указать диапазон размеров шрифта, которые используют одну и ту же информацию о шрифте. Нижняя граница включается в диапазон, а верхняя граница исключается. Например, <5-10> обозначает размеры больше или равные 5pt и меньше 10pt. Можно опустить число в любом размере дефиса в диапазоне размеров: <-> обозначает все возможные размеры, <-10> обозначает все размеры менее 10 пунктов и <12-> обозначает все размеры, большие или равные 12pt. Несколько простых размеров часто имеют одинаковую информацию о шрифте. В этом случае удобно опустить всю информацию, кроме последней:

1\DeclareFontShape{OT1}{panr}{m}{n}{ <5> <6> <7> <8> <9> <10>
2    <10.95> <12> <14.4> <17.28> <20.74> <24.88> pan10 }{}

Это объявляет, что шрифт Pandora medium Roman доступен в нескольких размерах, причем все они созданы путем масштабирования одного и того же размера дизайна.

Функции размера

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

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

Имя функции размера состоит из нуля или более букв. Некоторые функции размера могут принимать два аргумента: один необязательный и один обязательный. Необязательный параметр должен быть заключен в квадратные скобки. Например, в следующей спецификации для всех возможных размеров будет выбрана функция размера s с необязательным аргументом 0,9 и обязательным аргументом cmfbi10:

1<-> s * [0.9] cmfib8

Спецификации размера в \DeclareFontShape проверяются в том порядке, в котором они указаны. Когда информация о размере соответствует запрошенному размеру, выполняется соответствующая функция размера. Если этот процесс дает правильный шрифт, дальнейшие записи не проверяются. В противном случае поиск продолжается со следующей записи. Функции стандартного размера перечислены ниже.

Функция «пустая» Функция пустая загружает информацию о шрифте точно в запрошенном размере, если это простой размер. Если существует диапазон размеров и размер, запрошенный пользователем, попадает в этот диапазон, шрифт загружается точно в соответствии с размером пользователя. Например, если пользователь запросил «14.4», то спецификация

1<-> panr10

загрузит файл panr10.tfm с размером 14,4 пт. Все значения в файле .tfm масштабированы на 1,44, поскольку этот шрифт был разработан для размера 10 пт.

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

Таким образом,

1<-> [0.95] phvr8t

всегда загружал файл phvr8t.tfm (Helvetica в кодировке T1) размером 95 % от запрошенного размера. Если используется необязательный аргумент, функция пустого размера выдаст предупреждение, уведомляющее пользователя о том, что шрифт не загружается в заданном размере.

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

Функция «gen» Имена внешних шрифтов часто создаются путем добавления размера шрифта к строке, представляющей гарнитуру. Например, cmtt8, cmtt9 и cmtt10 — это внешние имена шрифтов Computer Modern Typewriter размером 8, 9 и 10 пунктов соответственно. Если имена шрифтов организованы по такой схеме, вы можете использовать функцию «gen», чтобы сократить запись. Эта функция объединяет информацию о шрифте и запрошенный размер для создания названий внешних шрифтов. Таким образом, если вы напишете

1<8> <9> <10> gen * cmtt

это будет сокращение от

1<8> cmtt8 <9> cmtt9 <10> cmtt10

что сохраняет восемь символов во внутренних таблицах NFSS. Эта функция буквально объединяет обе части, поэтому вам не следует использовать ее с десятичными размерами, такими как «14,4». Вы также должны убедиться, что цифры во внешнем названии шрифта действительно соответствуют размеру дизайна (например, «cmr17» на самом деле — это компьютерный современный роман с размером 17,28 пт).

Во всем остальном функция gen ведет себя как пустая функция. То есть необязательный аргумент, если он указан, представляет коэффициент масштабирования и, если он используется, генерирует информационное сообщение.

Функция «sgen» Функция «sgen» — это тихая версия функции gen. Любое сообщение он записывает только в файл расшифровки.

Функция «genb» Эта функция размера аналогична функции gen, но предназначена для шрифтов, размер которых закодирован в имени шрифта в сантипинтах, например шрифтов EC. Как следствие, такая строка, как

1<9> <10> <10.95> <12> genb * ecrm

действует как сокращение

1<9> ecrm0900 <10> ecrm1000 <10.95> ecrm1095 <12> ecrm1200

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

Функция «sgenb» Функция «sgenb» — это тихая версия функции «genb». Любое сообщение он записывает только в файл расшифровки.

Функция «sub» Функция «sub» используется для замены другой группы форм шрифта, если для текущей группы форм шрифта не существует внешнего шрифта. В этом случае аргументом является не имя внешнего шрифта, а другое семейство, серия и комбинация форм, разделенная косой чертой. Например, Computer Modern Sans не имеет курсива, а только наклонную форму. Поэтому разумно объявить наклонную форму в качестве замены курсиву:

1\DeclareFontShape{OT1}{cmss}{m}{it}{ <-> sub * cmss/m/sl }{}

Без этого объявления механизм автоматической замены LaTeX заменил бы фигуру по умолчанию, Computer Modern Sans в вертикальном положении.

Есть и другие хорошие варианты использования функции sub. Посмотрите на следующий код:

1\DeclareFontShape{OT1}{cmss}{m}{sl}{ <-8> sub * cmss/m/n
2   <8> cmssi8 <9> cmssi9 <10><10.95> cmssi10 <12><14.4> cmssi12
3   <17.28><20.74><24.88> cmssi17 }{}

В этом объявлении указано, что для размеров меньше 8pt LaTeX должен искать в объявлении формы шрифта OT1/cmss/m/n. Такие замены могут быть цепными. Например, не существует шрифта Computer Modern Sans размером менее 8pt, поэтому группа заменяемых форм шрифта, вероятно, будет содержать другую запись о замене. Однако использование этого метода имеет то преимущество, что при получении дополнительного шрифта вам нужно изменить только одно объявление группы форм шрифта — другие объявления, использующие этот шрифт, автоматически получат выгоду.

Функция “ssub” Функция ssub имеет ту же функциональность, что и вспомогательная функция, но не выводит предупреждений на экране (первая буква “s” означает “тихо”).

Функция “subf” Функция subf загружает шрифты так же, как и пустая функция, но выдает предупреждение о том, что эта операция была выполнена как замена, поскольку запрошенная форма шрифта недоступна. Эту функцию можно использовать для замены некоторых внешних шрифтов без необходимости объявлять для них отдельную группу форм шрифтов, как в случае с функцией sub. Например,

1\DeclareFontShape{OT1}{ptm}{bx}{n}{ <-> subf * ptmb7t }{}

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

Функция “ssubf” Тихая версия subf, эта функция записывает свои сообщения только в файл расшифровки.

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

Функция «sfixed» Тихая версия «fixed». Эта функция используется, например, для загрузки шрифта, содержащего большие математические символы, который часто доступен только в одном размере.

Варианты загрузки шрифтов

Как упоминалось выше, каждое семейство шрифтов необходимо объявить с помощью команды \DeclareFontFamily. Аргумент этой команды, а также шестой аргумент \DeclareFontShape можно использовать для указания специальных операций, которые выполняются при загрузке шрифта. Таким образом, вы можете изменить параметры, связанные со шрифтом в целом.

Помимо информации о каждом символе, TeX поддерживает для каждого внешнего шрифта набор глобальных размеров и других значений, связанных со шрифтом. Например, каждый шрифт имеет свой собственный «символ дефиса», символ, который вставляется, когда TeX ставит перенос слова. Другой пример — нормальная ширина и растягиваемость пустого пространства между словами; значение сохраняется для каждого шрифта и изменяется каждый раз, когда TeX переключается на новый шрифт. Изменяя эти значения в момент загрузки шрифта, можно добиться специальных эффектов.

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

С помощью \hyphenchar\font=<number> TeX указывает символ, используемый для расстановки переносов. <номер> представляет позицию этого символа в схеме кодирования. По умолчанию используется значение \defaulthyphenchar, равное 45, представляющее позицию символа ‘-’ в большинстве схем кодирования. Если вы установите это число равным «-1», расстановка переносов будет подавлена. Поэтому, заявив

1\DeclareFontFamily{0T1}{cmtt}{\hyphenchar\font=-1}

вы можете подавить расстановку переносов для всех шрифтов семейства cmtt, используя схему кодировки OT1. Шрифты с кодировкой «T1» имеют альтернативный символ дефиса в позиции 127, так что вы можете установить, например,

1\DeclareFontFamily{T1}{cmr}{\hyphenchar\font=127}

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

Каждый шрифт TeX имеет связанный набор размеров, которые изменяются присвоениями формы \fontdimen<number>\font=<dimen>, где <number> — это ссылочный номер для размера, а <dimen> — это значение, которое будет присвоено. Значения по умолчанию извлекаются из файла .tfm при загрузке шрифта. Каждый шрифт имеет как минимум семь таких размеров:* \fontdimen1 Определяет наклон символов на точку. Если значение равно нулю, шрифт вертикальный.

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

1\DeclareFontShape{0T1}{cmr}{m}{n}{...}
2   {\fontdimen2\font=.7\fontdimen2\font}

Это объявление уменьшает обычное пространство между словами до 70% от его исходного значения. Аналогичным образом можно изменить растяжимость и усадку.

Для некоторых шрифтов в формулах требуется более семи размеров шрифта. А именно, шрифты символов называются symbols и largesymbols. TeX не сможет набрать формулу, если эти шрифты имеют менее 22 и 13 параметров \fontdimen соответственно. Значения этих параметров используются для расположения символов в математической формуле.

В системе TeX есть одна неудачная оптимизация: TeX загружает каждый файл .tfm только один раз для заданного размера. Поэтому невозможно определить одну группу форм шрифта (с помощью команды \DeclareFontShape) для загрузки какого-либо внешнего шрифта, скажем, \DeclareFontShape, и использовать другую команду \DeclareFontShape для загрузки того же внешнего шрифта, на этот раз. изменение некоторых параметров \fontdimen или какого-либо другого параметра, связанного со шрифтом. Попытка сделать это приводит к изменению значений для обеих групп форм шрифта.

Например, предположим, что вы пытаетесь определить форму шрифта с небольшим интервалом, уменьшив пространство между словами:

1\DeclareFontShape{T1}{ptm}{m}{n}{ <-> ptmr8t }{}
2\DeclareFontShape{T1}{ptm}{c}{n}{ <-> ptmr8t }
3                     {\fontdimen2\font=.7\fontdimen2\font}

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

1\DeclareFontShape{T1}{ptm}{c}{n}{ <-> [0.9999] ptmr8t }
2                 {\fontdimen2\font=.7\fontdimen2\font}

Этот метод делает их разными шрифтами для TeX с отдельными параметрами \fontdimen. Альтернативно, в этом конкретном случае, вы можете контролировать пространство между словами, установив \spaceskip, тем самым переопределив значения шрифта.

6.3. Как изменить семейства шрифтов и группы форм шрифтов

Если для конкретного документа требуется объявление нестандартной формы шрифта, это частное объявление следует поместить в пакет или преамбулу документа. Он перезапишет любое существующее объявление комбинации форм шрифта. Однако важно, чтобы использование \DeclareFontFamily предотвращало последующую загрузку соответствующего файла .fd (обсуждается далее в этой статье). Кроме того, это новое объявление не влияет на уже загруженные шрифты.

6.4. Как объявить новую схему кодировки шрифтов

Изменения шрифтов, связанные с изменением схемы кодирования, требуют определенных мер предосторожности. Например, в кодировке T1 большинство букв с диакритическими знаками имеют свои собственные глифы, тогда как в традиционной кодировке текста TeX (OT1) акцентированные буквы должны генерироваться из букв и диакритических знаков с использованием примитива \accent. Если необходимо смешать два подхода, возможно, потому, что шрифт доступен только в одной из кодировок, определение такой команды, как \", должно вести себя по-разному в зависимости от текущей кодировки шрифта.

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

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

Проект LaTeX3e резервирует использование кодировок, начинающихся со следующих букв:

Буква «О» подчеркивает, что 128-символьные кодировки старые и устарели. В идеале эти кодировки будут заменены стандартами, определенными группой пользователей TeX, так что в будущем изменение кодировки будет необходимо только при переключении с одного языка на другой.

При объявлении собственных кодировок следует выбирать имена, начинающиеся с «L» для «локальных» или с «E» для «экспериментальных». Кодировки, начинающиеся с буквы «U», предназначены для «неизвестных» или «неклассифицированных» кодировок, то есть для шрифтов, которые не соответствуют общему шаблону кодировки. Введенное соглашение об именах гарантирует переносимость файлов, использующих официальные кодировки.

Команда \DeclareFontEncoding сохраняет имя вновь объявленной кодировки в команде \LastDeclaredEncoding. Иногда это полезно, когда вы объявляете другую связанную информацию о кодировке и, например, используется в файлах объявления кодировки для кириллических языков.

Кроме того, как мы упоминали при обсуждении замены шрифтов в предыдущей статье, значения по умолчанию семейства, серии и формы могут быть разными для разных кодировок. Для такого случая NFSS предоставляет команду \DeclareFontSubstitution, которая принимает кодировку в качестве первого аргумента. Следующие три аргумента — это значения по умолчанию (связанные с этой кодировкой) для семейства, серии и формы для использования в процессе автоматической замены. Важно, чтобы эти три аргумента образовывали допустимую форму шрифта. Другими словами, для них существует объявление \DeclareFontShape. В противном случае, когда NFSS проверит свои внутренние таблицы в \begin{document}, будет выдано сообщение об ошибке.

6.5. Внутренняя организация файлов

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

При создании файла формата LaTeX считывает файл с именем fonttext.ltx, который содержит стандартный набор определений семейства шрифтов и некоторые другие объявления, относящиеся к текстовым шрифтам.

Все остальные определения семейств шрифтов должны быть объявлены во внешних файлах, загружаемых по требованию: либо в файлах пакета, либо в файлах определения шрифта (.fd). Если определения семейства шрифтов помещены в файл пакета, вы должны явно загрузить этот пакет после команды \documentclass. Однако есть и третья возможность: всякий раз, когда NFSS получает запрос на семейство шрифтов foo в схеме кодирования BAR и ничего не знает об этой комбинации, он пытается загрузить файл с именем barfoo.fd. Если этот файл существует, он должен содержать определения группы форм шрифтов для семейства foo в схеме кодирования BAR, то есть объявления вида

1\DeclareFontFamily{BAR}{foo}{...}
2\DeclareFontShape{BAR}{foo}{...}{...}{...}{...}
3...
4\endinput

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

Каждый файл .fd должен содержать все определения шрифтов для одного семейства шрифтов в одной схеме кодировки. В файле должно быть одно или несколько объявлений \DeclareFontShape и ровно одно объявление \DeclareFontFamily. В файле не должно быть никаких других определений, за исключением, возможно, объявления \ProvidesFile или некоторых операторов \typeout, информирующих пользователя о загрузке шрифта. Вместо команды \typeout вы можете использовать простую команду TeX \wlog, которая записывает свой аргумент только в файл расшифровки. Подробная информация в файле расшифровки должна генерироваться всеми файлами .fd, которые используются в производстве, поскольку просмотр этой расшифровки поможет обнаружить ошибки, предоставляя информацию о файлах и их версиях, используемых в конкретном задании. Если используются команды \typeout или \wlog, важно помнить, что пробелы и пустые строки в файле .fd игнорируются. Поэтому необходимо использовать команду \space в аргументе \typeout или \wlog, чтобы получить пустое место на экране и в файле стенограммы.

Новые схемы кодирования не могут быть введены через механизм .fd. NFSS отклонит любой запрос на переключение на схему кодирования, которая не была явно объявлена ​​в формате LaTeX (т. е. fonttext.ltx), в файле пакета или в преамбуле документа.

6.6. Как объявить новые шрифты для использования в математике

Как указать размеры шрифта

Для каждого размера текста NFSS поддерживает три размера, которые используются для набора математических формул: размер, в котором печатается большинство символов (выбирается с помощью \textstyle или \displaystyle); размер нижних и верхних индексов первого порядка (\scriptstyle); и размер нижних и верхних индексов более высокого порядка (\scriptscriptstyle). Если вы переключитесь на новый размер текста, для которого соответствующие математические размеры еще не известны, NFSS попытается вычислить их как доли размера текста. Если вы не хотите, чтобы NFSS вычислял эти размеры, вы можете самостоятельно указать правильные значения с помощью \DeclareMathSizes. Это объявление принимает четыре аргумента: внешний размер текста и три математических размера для этого размера текста. Например, следующее объявление определяет математические размеры для размера 14pt (заголовка) как 14pt, 10pt и 7pt соответственно:

1\DeclareMathSizes{14}{14}{10}{7}

Другое объявление ниже (для заголовков более высокого уровня) сообщает NFSS, что для размера текста 36pt не требуются математические размеры. Это может помочь избежать ненужной загрузки многих шрифтов.

1\DeclareMathSizes{36}{}{}{}

Как добавить новые символы

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

Добавление новых шрифтов символов аналогично объявлению нового идентификатора математического алфавита: \DeclareSymbolFont определяет значения по умолчанию для всех математических версий, \SetSymbolFont переопределяет значения по умолчанию для конкретной версии.

Шрифты математических символов доступны по символическому имени. Например, если вы хотите установить шрифт AMS msbm10 (см. таблицу глифов ниже), вам сначала необходимо сделать шрифт известным NFSS, используя объявления, описанные в предыдущих разделах.

таблица символов msbm10

Эти инструкции будут выглядеть так

1\DeclareFontFamily{U}{msb}{}
2\DeclareFontShape{U}{msb}{m}{n}{ <5> <6> <7> <8> <9> gen * msbm
3        <10> <10.95> <12> <14.4> <17.28> <20.74> <24.88> msbm10}{}

и обычно помещаются в файл .fd. Затем вам необходимо объявить этот символьный шрифт для всех математических версий с помощью следующей команды:

1\DeclareSymbolFont{AMSb}{U}{msb}{m}{n}

Это делает группу форм шрифта «U/msb/m/n» доступной в качестве символьного шрифта под именем «AMSb». Если в этом семействе шрифтов была полужирная серия (на самом деле ее нет), вы могли бы впоследствии изменить настройку полужирной математической версии, сказав

1\SetSymbolFont{AMSb}{bold}{U}{msb}{b}{n}

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

1\DeclareMathSymbol{cmd}{type}{symbol-font}{slot}

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

Типы математических объектов

Между прочим, за исключением \mathalpha, эти команды можно использовать в математических формулах как функции с одним аргументом, и в этом случае они размещают свой (возможно комплексный) аргумент так, как если бы он был соответствующего типа.

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

1\DeclareMathSymbol{\lessdot}{\mathbin}{AMSb}{"6c}

Вместо имени команды вы можете использовать в качестве первого аргумента один символ. Например, пакет eulevm имеет несколько объявлений вида

1\DeclareMathSymbol{0}{\mathalpha}{letters}{"30}

чтобы указать, откуда брать цифры.

Команда \DeclareMathSymbol указывает позицию в некотором шрифте символа. Поэтому важно, чтобы все внешние шрифты, связанные с этим символьным шрифтом с помощью команд \DeclareSymbolFont и \SetSymbolFont, имели один и тот же символ в этой позиции. Самый простой способ обеспечить это — использовать только шрифты с одинаковой кодировкой (если только это не кодировка U или неизвестная кодировка, поскольку два шрифта в этой кодировке не обязаны содержать одни и те же символы).

В приведенной выше таблице глифов вы также можете найти буквы, выделенные жирным шрифтом на доске (ABC… начиная с позиции '101). Если вы хотите использовать эти буквы в качестве математического алфавита, вы можете определить их с помощью \DeclareMathAlphabet. Однако, если этот шрифт символов уже загружен, лучше использовать ярлык для доступа к отдельным символам:

1\DeclareSymbolFontAlphabet{\mathbb}{AMSb}

То есть вы указываете имя идентификатора вашего математического алфавита и символическое имя ранее объявленного символьного шрифта. Важная причина не загружать шрифты дважды без необходимости заключается в том, что существует верхний предел в 16 математических шрифтов, которые могут быть активны в любой момент времени в TeX. При расчете этого предела учитывается шрифт каждого символа; Математические алфавиты учитываются только в том случае, если они действительно используются в документе, и они учитываются локально в каждой математической версии. Следовательно, если объявлено восемь символьных шрифтов, вы можете использовать не более восьми (возможно, разных) идентификаторов математического алфавита в каждой версии.

Вкратце: чтобы представить новые шрифты символов, вам необходимо выполнить небольшое количество объявлений \DeclareSymbolFont и \SetSymbolFont и потенциально большое количество объявлений \DeclareMathSymbol. Поэтому добавление таких шрифтов лучше всего производить в файле пакета.

Как представить новые математические версии

Мы уже упоминали, что стандартная настройка автоматически объявляет две математические версии: нормальную и полужирную. Чтобы ввести дополнительные версии, вы можете использовать объявление \DeclareMathVersion, которое принимает один аргумент — имя новой математической версии. Все ранее объявленные шрифты символов и все математические алфавиты автоматически доступны в этой математической версии; им назначаются шрифты по умолчанию, то есть шрифты, которые вы указали с помощью \DeclareMathAlphabet или \DeclareSymbolFont.

Затем вы можете изменить настройки для своей новой версии, введя соответствующие команды \SetMathAlphabet и \SetSymbolFont для жирной математической версии, как показано ранее в этом разделе и в статье о шрифтах в математике. . Опять же, введение новой математической версии обычно осуществляется в файле пакета.

Как изменить настройку шрифта символа

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

Ниже приведены настройки LaTeX по умолчанию:

1\DeclareMathVersion{normal} \DeclareMathVersion{bold}
2\DeclareSymbolFont{operators} {OT1}{cmr}{m} {n}
3\DeclareSymbolFont{letters} {OML}{cmm}{m}{it}
4\DeclareSymbolFont{symbols} {OMS}{cmsy}{m}{n}
5\DeclareSymbolFont{largesymbols} {OMX}{cmex}{m}{n}
6
7% Special bold fonts only for these:
8\SetSymbolFont {operators}{bold}{OT1}{cmr}{bx}{n}
9\SetSymbolFont {letters} {bold}{OML}{cmm}{b}{it}

В стандартной настройке цифры и текст, создаваемые такими операторами, как \log и \max, берутся из символьного шрифта, называемого operators. Чтобы изменить это так, чтобы эти элементы хорошо сочетались с основным шрифтом текста (скажем, Computer Modern Sans, а не Computer Modern Roman), вы можете выполнить следующие команды:

1\SetSymbolFont{operators}{normal}{0T1}{cmss}{m} {n}
2\SetSymbolFont{operators}{bold} {0T1}{cmss}{bx}{n}

Символьные шрифты с именами «symbols» и «largesymbols» играют в TeX уникальную роль. Вот почему они требуют специального количества связанных с ними параметров \fontdimen. Поэтому в качестве этих двух символьных шрифтов можно использовать только специально подготовленные шрифты. В принципе, такие параметры можно добавить к любому шрифту во время загрузки, используя третий параметр \DeclareFontFamily или шестой параметр \DeclareFontShape.

6.7. Как определить свой собственный файл .fd (пример)

Если вы хотите настроить шрифты (PostScript) и создать необходимый файл .fd, вам следует выполнить процедуру, описанную ранее в этой статье. Если для создания необходимых файлов метрик шрифта используется fontinst, соответствующие файлы .fd также генерируются автоматически. Однако файл .fd для одного семейства шрифтов легко написать вручную, если вы знаете, какая кодировка шрифта используется. В качестве примера рассмотрим файл декларации t1bch.fd для Bitstream Charter в кодировке T1:

 1\ProvidesFile{t1bch.fd}[2001/06/04 font definitions for T1/bch.]
 2% Primary declarations
 3\DeclareFontFamily{T1}{bch}{}
 4\DeclareFontShape{T1}{bch}{m}{n}{<-> bchr8t}{}
 5\DeclareFontShape{T1}{bch}{m}{sc}{<-> bchrc8t}{}
 6\DeclareFontShape{T1}{bch}{m}{sl}{<-> bchro8t}{}
 7\DeclareFontShape{T1}{bch}{m}{it}{<-> bchri8t}{}
 8\DeclareFontShape{T1}{bch}{b}{n}{<-> bchb8t}{}
 9\DeclareFontShape{T1}{bch}{b}{sc}{<-> bchbc8t}{}
10\DeclareFontShape{T1}{bch}{b}{sl}{<-> bchbo8t}{}
11\DeclareFontShape{T1}{bch}{b}{it}{<-> bchbi8t}{}
12% Substitutions
13\DeclareFontShape{T1}{bch}{bx}{n}{<->ssub * bch/b/n}{}
14\DeclareFontShape{T1}{bch}{bx}{sc}{<->ssub * bch/b/sc}{}
15\DeclareFontShape{T1}{bch}{bx}{sl}{<->ssub * bch/b/sl}{}
16\DeclareFontShape{T1}{bch}{bx}{it}{<->ssub * bch/b/it}{}
17\endinput

Первая строка — это идентификационная строка. Затем следует объявление семейства шрифтов и кодировки (bch и T1) с помощью \DeclareFontFamily. Аргумент этой команды должен соответствовать имени файла .fd, за исключением того, что имя файла имеет строчную кодировку. Затем каждая комбинация серии и формы сопоставляется с именем файла .tfm. Эти шрифты будут масштабированы до любого желаемого размера (обратите внимание на <->). Вторая часть файла устанавливает некоторые замены для комбинаций, для которых шрифт недоступен (т. е. замена выделенной жирным расширенным рядом жирной серии). Предполагая, что у вас есть дополнительные шрифты Charter (Black и BlackItalic), вы можете затем добавить соответствующие определения в файл .fd. Конечно, сначала вам нужно будет предоставить соответствующие виртуальные шрифты для эмуляции набора символов «T1». К счастью, многие шрифты можно скачать из Интернета.

Другая возможная причина создания собственных файлов .fd может возникнуть из-за необходимости объединить шрифты из разных семейств и представить их в LaTeX как одно новое семейство шрифтов. Например, существует семейство шрифтов Aldus, разработанное как дополнение к шрифту Palatino (который изначально разрабатывался как дисплейный шрифт). Поскольку у Альдуса нет жирной серии, Палатино является естественным выбором в качестве жирной замены. В приведенном ниже примере мы объединяем Aldus в его среднюю серию с жирным шрифтом Palatino, называя составное семейство шрифтов «zasj». Представлен только фрагмент полного файла .fd, которого достаточно, чтобы проиллюстрировать идею.

 1\ProvidesFile{t1zasj.fd}
 2   [2003/10/12 font definitions for T1 Aldus/Palatino mix.]
 3\DeclareFontFamily{T1}{zasj}{}
 4% Medium series
 5\DeclareFontShape{T1}{zasj}{m}{n} {<->pasr9d}{}
 6\DeclareFontShape{T1}{zasj}{m}{sc}{<->pasrc9d}{}
 7\DeclareFontShape{T1}{zasj}{m}{it}{<->pasri9d}{}
 8\DeclareFontShape{T1}{zasj}{m}{sl}{<->ssub * pasj/m/it}{}
 9% Bold series
10\DeclareFontShape{T1}{zasj}{b}{n}{<-> pplb8t}{}
11\DeclareFontShape{T1}{zasj}{b}{sc}{<->pplbc8t}{}
12\DeclareFontShape{T1}{zasj}{b}{sl}{<->pplbo8t}{}
13\DeclareFontShape{T1}{zasj}{b}{it}{<->pplbi8t}{}

Чтобы получить доступ к этому «псевдосемейству», нам нужно выбрать «zasj» в кодировке «T1». Мы также должны убедиться, что \textbf переключается на полужирный, а не на расширенный полужирный шрифт, поскольку наш файл .fd не предоставляет никаких замен. Все это может быть автоматически предоставлено небольшим пакетом вроде этого:

1\ProvidesPackage{fontmix}[2003/10/12 T1 Aldus/Palatino mix.]
2\RequirePackage[T1]{fontenc}
3\renewcommand\rmdefault{zasj} \renewcommand\bfdefault{b}

Итак, загрузив пакет «fontmix», мы получаем Aldus и Palatino Bold для заголовков. Такое сочетание шрифтов не всегда может улучшить ваш текст, поэтому в этом примере не предлагается создавать случайные комбинации.

6.8. Порядок деклараций

NFSS требует от вас предоставить все декларации в определенном порядке, чтобы он мог проверить, указали ли вы всю необходимую информацию. Если вы объявите объекты в неправильном порядке, он будет жаловаться. Вот зависимости, которые вы должны соблюдать:

Subscribe to Aspose Product Updates

Get monthly newsletters & offers directly delivered to your mailbox.