Як налаштувати нові шрифти

Щоб налаштувати нові шрифти для використання з 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 upright у старій схемі кодування TeX можна ввести як

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

припускаючи, що доступний лише один зовнішній шрифт для розміру 10pt. Якщо у вас також є цей шрифт із розміром 12 пт (з масштабом 10 пт), оголошення буде таким

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

Якщо зовнішній файл доступний у всіх можливих розмірах, оголошення стає дуже простим. Це стосується шрифтів PostScript Type 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 пробіли ігноруються, щоб зробити записи легшими для читання. За незвичайних обставин, коли потрібно ввести реальний пробіл, ви можете скористатися командою \пробіл.

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

Інформацію про розмір можна розділити на прості розміри та діапазони розмірів. Простий розмір задається одним (десятковим) числом, наприклад <10> або <17.28>, і може мати будь-яке додатне значення. Однак ви, ймовірно, не знайдете значень, менших за 4 або більших за 120, оскільки число представляє розмір шрифту, виміряний у пунктах. Діапазон розмірів задається двома простими розмірами, розділеними дефісом, щоб вказати діапазон розмірів шрифту, який має однакову інформацію про шрифт. Нижня межа включена в діапазон, тоді як верхня межа виключена. Наприклад, «<5-10>» означає розміри, більші або дорівнюють 5 пт і менше 10 пт. Можна опустити номер будь-якого розміру дефіса в діапазоні розмірів: <-> позначає всі можливі розміри, <-10> позначає всі розміри менше 10 pt, а <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,4pt. Усі значення у файлі .tfm масштабуються за 1,44, оскільки цей шрифт розроблено для 10pt.

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

Таким чином,

1<-> [0.95] phvr8t

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

Функція “s” Функція s виконує те саме, що й пуста функція, за винятком того, що на терміналі не буде створено повідомлення. Повідомлення все одно будуть записані у файл стенограми, щоб ви могли дізнатися, які шрифти використовувалися, якщо щось піде не так.

Функція “gen” Зовнішні назви шрифтів часто будуються шляхом додавання розміру шрифту до рядка, який представляє гарнітуру. Наприклад, cmtt8, cmtt9 і cmtt10 є зовнішніми назвами для шрифтів Computer Modern Typewriter із розміром 8, 9 і 10pt відповідно. Якщо назви шрифтів організовані за такою схемою, ви можете використовувати функцію gen, щоб скоротити запис. Ця функція поєднує інформацію про шрифт і запитуваний розмір для створення назв зовнішніх шрифтів. Таким чином, якщо ви пишете

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

це буде скорочення для

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

який зберігає вісім символів у внутрішніх таблицях NFSS. Ця функція буквально поєднує обидві частини, тому ви не повинні використовувати її з десятковими розмірами, такими як 14.4. Ви також маєте переконатися, що цифри у назві зовнішнього шрифту справді відповідають розміру дизайну (наприклад, cmr17 насправді є комп’ютерним сучасним романом із розміром 17,28 pt).

У всіх інших аспектах функція 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 upright.

Є й інші варіанти використання функції 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 розміром менше 8 пунктів, тому замінена група форм шрифту, ймовірно, міститиме інший запис заміни. Однак використання цього методу має перевагу в тому, що коли ви отримуєте додатковий шрифт, вам потрібно змінити лише одне оголошення групи форм шрифту - інші оголошення, які використовують цей шрифт, автоматично отримають переваги.

Функція “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<номер>\font=<dimen>, де <номер> є номером посилання на розмір, а <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), щоб завантажити якийсь зовнішній шрифт - скажімо, cmtt10 - і використати іншу команду \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 залишає за собою використання кодувань, що починаються з наступних літер:

Буква O підкреслює, що кодування з 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, що математичні розміри не потрібні для розміру тексту 36 pt. Це може допомогти уникнути непотрібного завантаження багатьох шрифтів.

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}

Замість назви команди ви можете використовувати один символ як перший аргумент. Наприклад, пакунок eulervm має кілька декларацій форми

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 (чорний і чорний курсив), ви можете додати відповідні визначення до файлу .fd. Звичайно, вам спочатку потрібно буде надати відповідні віртуальні шрифти, щоб емулювати набір символів T1. На щастя, для багатьох шрифтів їх можна завантажити з Інтернету.

Інша можлива причина для створення власних файлів .fd може виникати через потребу об’єднати шрифти з різних сімейств і представити їх у LaTeX як єдине нове сімейство шрифтів. Наприклад, існує сімейство шрифтів Aldus, розроблене як доповнення до шрифту Palatino (який спочатку був розроблений як шрифт для дисплея). Оскільки 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.