Введение

Система компьютерной наборки
помогает отображать математические формулы в Википедии

TeX (произносится /tɛx/, см. ниже), стилизованная в системе как , – это система компьютерной наборки, разработанная и написанная учёным-компьютерщиком и профессором Стэнфордского университета Дональдом Кнутом и впервые выпущенная в 1978 году. TeX является популярным средством для набора сложных математических формул и признана одной из самых совершенных цифровых типографских систем. TeX широко используется в академической среде, особенно в математике, информатике, экономике, политологии, инженерии, лингвистике, физике, статистике и количественной психологии. Он давно заменил Unix troff, ранее предпочтительную систему форматирования, в большинстве установок Unix. Он также применяется для многих других задач компьютерной наборки, особенно в виде LaTeX, ConTeXt и других макропакетов. TeX был разработан с двумя основными целями: позволить любому создавать книги высокого качества с минимальными усилиями и обеспечить систему, которая давала бы абсолютно одинаковые результаты на всех компьютерах в любое время (вместе с языком Metafont для описания шрифтов и семейством шрифтов Computer Modern). TeX – это свободное программное обеспечение, что сделало его доступным для широкого круга пользователей.

История

Когда в 1968 году был опубликован первый бумажный том "Искусства компьютерного программирования" Кнута, он был набран с использованием горячего металлического набора на монотипной машине. Этот метод, восходящий к XIX веку, позволил создать "классический стиль", который ценил Кнут. Когда второе издание было опубликовано в 1976 году, всю книгу пришлось набирать заново, поскольку технология монотипа в значительной степени уступила место фотонабору, а оригинальные шрифты стали недоступны. 30 марта 1977 года Кнут получил корректурные оттиски новой книги и счёл их некачественными. Разочарованный, Кнут приступил к разработке собственной системы набора. Кнут впервые увидел результат работы высококачественной цифровой системы набора и заинтересовался цифровой типографикой. 13 мая 1977 года он написал себе служебную записку с описанием основных характеристик TeX. Он планировал завершить работу над ней во время академического отпуска в 1978 году, но, как выяснилось, язык был "зафиксирован" (готов к использованию) только в 1989 году, более чем через десять лет. Гай Стил оказался в Стэнфорде летом 1978 года, когда Кнут разрабатывал свою первую версию TeX. Вернувшись осенью в Массачусетский технологический институт, Стил переписал подсистему ввода-вывода TeX для работы под операционной системой Incompatible Timesharing System (ITS). Первая версия TeX, получившая название TeX78, была написана на языке программирования SAIL для работы на PDP 10 под операционной системой WAITS Стэнфорда.

WEB и грамотное программирование

Для более поздних версий TeX Кнут разработал концепцию литературного программирования — способ создания компилируемого исходного кода и взаимосвязанной документации, набранной в TeX, из одного и того же исходного файла. Язык, используемый для этого, называется WEB и позволяет создавать программы на DEC PDP-10 Pascal.

TeX82

TeX82, новая версия TeX, переписанная с нуля, была опубликована в 1982 году. Среди прочих изменений, оригинальный алгоритм переноса слов был заменен новым алгоритмом, разработанным Фрэнком Лянгом. TeX82 также использует арифметику с фиксированной точкой вместо арифметики с плавающей точкой, чтобы обеспечить воспроизводимость результатов на различном компьютерном оборудовании, и включает в себя полноценный, полный по Тьюрингу язык программирования, после настойчивых просьб Гая Стила. В 1989 году Дональд Кнут выпустил новые версии TeX и Metafont. Несмотря на стремление сохранить программу стабильной, Кнут осознал, что 128 различных символов для ввода текста недостаточно для поддержки иностранных языков; основным изменением в версии 3.0 TeX, таким образом, стала возможность работы с 8-битными входными данными, позволяющая использовать 256 различных символов при вводе текста. TeX3.0 был выпущен 15 марта 1990 года. Начиная с версии 3, TeX использует своеобразную систему нумерации версий, при которой обновления обозначаются добавлением очередной цифры в конце десятичной дроби, так что номер версии асимптотически приближается к… Это отражает тот факт, что TeX теперь очень стабилен, и ожидаются лишь незначительные обновления. Текущая версия TeX – 3.141592653; она была последний раз обновлена в 2021 году. Дизайн был заморожен после версии 3.0, и новые функции или фундаментальные изменения добавляться не будут, поэтому все последующие версии будут содержать только исправления ошибок. Хотя сам Дональд Кнут предложил несколько направлений, в которых TeX можно было бы улучшить, он подчеркнул, что считает наличие неизменной системы, которая будет выдавать один и тот же результат сейчас и в будущем, более важным, чем внедрение новых функций. По этой причине он заявил, что "абсолютно последнее изменение (которое будет сделано после моей смерти)" будет заключаться в изменении номера версии на…, после чего все оставшиеся ошибки станут особенностями. Аналогично, версии Metafont после 2.0 асимптотически приближаются к числу Эйлера (математической константе) (в настоящее время 2.7182818), и подобное изменение будет применено после смерти Кнута. Кнут создал "неофициальные" модифицированные версии, такие как TeX XeT, позволяющие пользователю смешивать тексты, написанные системами письма слева направо и справа налево, в одном документе. Большинство пользователей расширяли TeX только с помощью макросов, и он остался системой, ассоциирующейся с техническим набором.

Система настройки типов

Команды TeX обычно начинаются с обратной косой черты и группируются фигурными скобками. Практически все синтаксические свойства TeX можно изменять на лету, что затрудняет разбор входных данных TeX чем-либо, кроме самого TeX. TeX — это язык, основанный на макросах и токенах: многие команды, включая большинство определенных пользователем, расширяются на лету, пока не останутся только нерасширяемые токены, которые затем выполняются. Само расширение практически лишено побочных эффектов. Хвостовая рекурсия макросов не требует памяти, и доступны конструкции «если-то-иначе». Это делает TeX языком Тьюринга даже на уровне расширения. Систему можно разделить на четыре уровня: на первом символы считываются из входного файла и им присваивается код категории (иногда называемый «код ката» для краткости). Комбинации обратной косой черты (фактически, любого символа категории ноль), за которыми следуют буквы (символы категории 11) или один другой символ, заменяются токеном управляющей последовательности. В этом смысле этот этап похож на лексический анализ, хотя он и не формирует числа из цифр. На следующем этапе расширяемые управляющие последовательности (например, условные операторы или определенные макросы) заменяются их текстом замены. Входные данные для третьего этапа — это поток символов (включая символы со специальным значением) и нерасширяемые управляющие последовательности (обычно присваивания и визуальные команды). Здесь символы собираются в абзац, а алгоритм переноса абзацев TeX работает, оптимизируя точки переноса по всему абзацу. На четвертом этапе вертикальный список строк и другого материала разбивается на страницы. Система TeX точно знает размеры всех символов, и, используя эту информацию, вычисляет оптимальное расположение букв в строке и строк на странице. Затем она создает DVI-файл («DeVice Independent»), содержащий окончательные координаты всех символов. Этот DVI-файл можно распечатать напрямую при наличии соответствующего драйвера принтера или преобразовать в другие форматы. В настоящее время часто используется pdfTeX, который обходит генерацию DVI. Базовая система TeX понимает около 300 команд, называемых примитивами. Эти команды низкого уровня редко используются непосредственно пользователями, и большая часть функциональности предоставляется файлами формата (предварительно загруженные образы памяти TeX после загрузки больших коллекций макросов). Оригинальный формат Knuth по умолчанию, который добавляет около 600 команд, — Plain TeX. Наиболее широко используемым форматом является LaTeX, первоначально разработанный Лесли Лампортом, который включает стили документов для книг, писем, слайдов и т. д. и добавляет поддержку ссылок и автоматической нумерации разделов и уравнений. Другой широко используемый формат, AMS TeX, разработан Американским математическим обществом и предоставляет гораздо больше удобных команд, которые журналы могут изменять в соответствии со своим фирменным стилем. Большинство функций AMS TeX можно использовать в LaTeX с помощью «пакетов AMS» (например, amsmath, amssymb) и «классов документов AMS» (например, amsart, amsbook). Это называется AMS LaTeX. Другие форматы включают ConTeXt, который используется в основном для верстки и написан в основном Хансом Хагеном из Pragma.

Аспекты

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

Математическое расстояние

Поскольку основной целью языка TeX является высококачественная верстка для издателей книг, Кнут уделил большое внимание правилам расстановки пробелов в математических формулах. Он взял за основу три работы, которые считал эталонами математической типографии: книги, изданные Addison Wesley Publishing house (издательством "Искусства компьютерного программирования") под руководством Ганса Вольфа; выпуски математического журнала Acta Mathematica, датируемые примерно 1910 годом; и экземпляр Indagationes Mathematicae, голландского математического журнала. Кнут внимательно изучил эти напечатанные издания, чтобы выявить и сформулировать набор правил для расстановки пробелов. Хотя TeX предоставляет некоторые базовые правила и инструменты для задания правильных интервалов, точные параметры зависят от шрифта, используемого для верстки формулы. Например, интервалы для шрифтов Computer Modern, разработанных Кнутом, были тщательно настроены на протяжении многих лет и теперь фиксированы; но когда Кнут впервые начал использовать другие шрифты, такие как AMS Euler, потребовалось определить новые параметры интервалов. Верстка математических выражений в TeX не лишена критики, особенно в отношении технических деталей метрик шрифта, которые были разработаны в эпоху, когда большое внимание уделялось требованиям к объему памяти. Это привело к некоторым "трюкам", перегружающим отдельные поля, что, в свою очередь, потребовало других "трюков". С эстетической точки зрения, также критиковалось отображение радикалов. Спецификация математических шрифтов OpenType во многом основана на TeX, но содержит некоторые новые функции и улучшения.

Строка и обоснование

По сравнению с ручной наборкой, проблему выравнивания легко решить с помощью цифровой системы, такой как TeX, которая, при условии, что определены хорошие точки для переноса строки, может автоматически распределять пробелы между словами, чтобы заполнить строку. Таким образом, задача состоит в том, чтобы найти набор точек переноса, которые дадут наиболее визуально приятный результат. Многие алгоритмы переноса строки используют подход первого подходящего, где точки переноса для каждой строки определяются последовательно, и после выбора точка переноса не изменяется. Такая система не может определить точку переноса в зависимости от того, какое влияние она окажет на последующие строки. В отличие от этого, алгоритм выравнивания по всему блоку, используемый в TeX и разработанный Дональдом Кнутом и Майклом Плассом, рассматривает все возможные точки переноса в абзаце и находит комбинацию переносов строк, которая обеспечит наиболее гармоничное расположение в целом. Формально алгоритм определяет значение, называемое «неудобством», связанное с каждым возможным переносом строки; неудобство увеличивается, если пробелы на строке приходится слишком сильно растягивать или сжимать, чтобы добиться нужной ширины строки. Добавляются штрафы, если точка переноса особенно нежелательна: например, если слово необходимо разделить на части, если две строки подряд разделены на части, или если очень широкую строку сразу же следует очень узкая строка. Затем алгоритм находит точки переноса, которые минимизируют сумму квадратов неудобства (включая штрафы) полученных строк. Если в абзаце содержится возможных точек переноса, количество ситуаций, которые необходимо оценить наивно, равно . Однако, используя метод динамического программирования, сложность алгоритма можно снизить до (см. нотацию «Большое О»). Дальнейшие упрощения (например, исключение из рассмотрения крайне маловероятных точек переноса, таких как перенос в первом слове абзаца, или слишком широких строк) приводят к эффективному алгоритму, время работы которого равно , где — ширина строки. Аналогичный алгоритм используется для определения наилучшего способа разбить абзацы на две страницы, чтобы избежать «вдов» и «сирот» (строк, которые остаются одинокими на странице, в то время как остальная часть абзаца находится на следующей или предыдущей странице). Однако, в целом, работа Майкла Пласса показывает, что задача переноса страниц может быть NP-полной из-за дополнительной сложности размещения рисунков. Алгоритм переноса строк TeX был принят несколькими другими программами, такими как Adobe InDesign (приложение для верстки) и утилита командной строки GNU fmt Unix. Если для строки не удается найти подходящий перенос, система попытается разделить слово дефисом. В оригинальной версии TeX использовался алгоритм переноса, основанный на наборе правил для удаления префиксов и суффиксов слов и для определения, следует ли вставлять дефис между двумя согласными в схеме вида гласная–согласная–согласная–гласная (что возможно в большинстве случаев). TeX82 представил новый алгоритм переноса, разработанный Фрэнком Лянгом в 1983 году, для присвоения приоритетов точкам переноса в группах букв. Список шаблонов переноса сначала генерируется автоматически из корпуса слов с переносами (список из 50 000 слов). Если TeX должен найти допустимые позиции переноса в слове «энциклопедия», например, он рассмотрит все подслова расширенного слова «энциклопедия», где — специальный маркер для обозначения начала или конца слова. Список подслов включает все подслова длиной 1 (., e, n, c, y и т. д.), длиной 2 (e, en, nc и т. д.) и т. д., вплоть до подслова длиной 14, которым является само слово, включая маркеры. Затем TeX обратится к своему списку шаблонов переноса и найдет подслова, для которых он рассчитал желательность переноса в каждой позиции. В случае нашего слова можно сопоставить 11 таких шаблонов, а именно 1c4l4, 1cy, 1d4i3a, 4edi, e3dia, 2i1a, ope5d, 2p2ed, 3pedi, pedia4, y1c. Для каждой позиции в слове TeX вычислит максимальное значение, полученное среди всех совпадающих шаблонов, получив en1cy1c4l4o3p4e5d4i3a4. Наконец, допустимые позиции — это те, которые обозначены нечетным числом, что дает допустимые переносы en cy clo pe di a. Эта система, основанная на подсловах, позволяет определять очень общие шаблоны (например, 2i1a) с низкими индикативными числами (нечетными или четными), которые затем могут быть заменены более конкретными шаблонами (например, 1d4i3a), если это необходимо. Эти шаблоны находят около 90% дефисов в исходном словаре; что более важно, они не вставляют никаких ложных дефисов. Кроме того, в формат Plain TeX включен список исключений (слов, для которых шаблоны не предсказывают правильный перенос); пользователь может указать дополнительные исключения.

Метафонт

Metafont, не являющийся строго частью TeX, — это система описания шрифтов, позволяющая дизайнеру алгоритмически описывать символы. Она использует кривые Безье достаточно стандартным образом для генерации отображаемых символов, но Кнут уделяет значительное внимание проблеме растрирования на растровых дисплеях. Другая диссертация Джона Хобби более подробно исследует эту проблему оцифровки "траекторий кисти". Этот термин происходит от того, что Metafont описывает символы как нарисованные абстрактными кистями (и ластиками). Распространено мнение, что TeX основан на растровых шрифтах, но на самом деле эти программы ничего не знают о шрифтах, которые они используют, кроме их размеров. Обработка шрифтов других типов, включая PostScript Type 1 и TrueType, является ответственностью драйвера устройства. Computer Modern (обычно известный как "шрифт TeX") свободно доступен в формате Type 1, как и математические шрифты AMS. Пользователи TeX-систем, выводящих напрямую в PDF, таких как pdfTeX, XeTeX или LuaTeX, как правило, вообще не используют вывод Metafont.

Макроязык

Документы TeX создаются и программируются с использованием необычного макроязыка. В общем, работа этого макроязыка состоит из этапов расширения и выполнения, которые не взаимодействуют напрямую. Расширение включает в себя как непосредственное раскрытие макроопределений, так и условное ветвление, а выполнение включает в себя такие задачи, как установка переменных/регистров и собственно процесс набора, добавляющий глифы в контейнеры. Определение макроса включает в себя не только список команд, но и синтаксис вызова. В отличие от большинства широко используемых лексических препроцессоров, таких как M4, тело макроса токенизируется в момент определения. Макроязык TeX использовался для создания более крупных систем подготовки документов, наиболее известными из которых являются LaTeX и ConTeXt.

Разработка

Оригинальный исходный код текущего программного обеспечения TeX написан на WEB — это смесь документации, написанной на TeX, и подмножества Pascal, что обеспечивает читаемость и переносимость. Например, TeX выполняет всё динамическое выделение памяти самостоятельно, используя массивы фиксированного размера, и для внутренних вычислений использует только арифметику с фиксированной точкой. В результате TeX был портирован практически на все операционные системы, как правило, с помощью программы web2c, которая преобразует исходный код в C вместо прямой компиляции кода Pascal. Кнут ведёт очень подробный журнал всех исправленных ошибок и внесённых изменений в программу с 1982 года; по состоянию на 2021 год список содержит 440 записей, не считая модификации версии, которая должна быть выполнена после его смерти как последнее изменение в TeX. Кнут предлагает денежные вознаграждения тем, кто обнаруживает и сообщает об ошибках в TeX. Вознаграждение за ошибку начиналось с 2,56 доллара США (один "шестнадцатеричный доллар") и удваивалось каждый год, пока не было заморожено на текущем уровне в 327,68 доллара. Кнут потерял относительно немного денег, поскольку было обнаружено очень мало ошибок. Более того, известно, что получатели вознаграждений вставляют свои чеки в рамки в качестве доказательства обнаружения ошибки в TeX, вместо того чтобы обналичивать их. Из-за мошенников, которые находят сканированные копии его чеков в интернете и используют их для попыток опустошить его банковский счёт, Кнут больше не отправляет настоящие чеки, но те, кто сообщает об ошибках, могут получить кредит в Банке Сан-Серифе.

Распространение и расширение

TeX обычно поставляется в виде легко устанавливаемого пакета, включающего сам TeX, Metafont, а также все необходимые шрифты, форматы документов и утилиты для работы с системой типографского набора. На UNIX-совместимых системах, таких как Linux и Apple macOS, TeX распространяется в составе более крупного дистрибутива TeX Live. (До появления TeX Live, дистрибутив teTeX являлся фактическим стандартом на UNIX-совместимых системах.) Для Microsoft Windows доступны дистрибутивы MiKTeX (улучшенный proTeXt) и версия TeX Live для Microsoft Windows. Ряд систем обработки документов основаны на TeX, в частности jadeTeX, использующий TeX в качестве бэкенда для печати из DSSSL Engine Джеймса Кларка, издательской системы Arbortext и Texinfo – системы обработки документации GNU. TeX является официальным пакетом для типографского набора операционной системы GNU с 1984 года. Существует множество расширений и дополнительных программ для TeX, среди которых BibTeX для создания библиографий (распространяется вместе с LaTeX); pdfTeX – TeX-совместимый движок, способный напрямую генерировать PDF-вывод (а также продолжающий поддерживать исходный вывод DVI); XeTeX – TeX-совместимый движок, поддерживающий Unicode и OpenType; и LuaTeX – расширение TeX с поддержкой Unicode, включающее среду выполнения Lua с широкими возможностями интеграции в базовые процедуры и алгоритмы TeX. Большинство расширений TeX доступны бесплатно в CTAN (Comprehensive TeX Archive Network).

Лицензия

Дональд Кнут несколько раз указывал, что исходный код TeX был помещен в "общественное достояние", и он настоятельно рекомендует модификации или эксперименты с этим исходным кодом. Однако, поскольку Кнут высоко ценит воспроизводимость вывода всех версий TeX, любая измененная версия не должна называться TeX или чем-либо сбивающим с толку похожим. Чтобы обеспечить соблюдение этого правила, любая реализация системы должна пройти набор тестов, называемый TRIP, прежде чем ей будет разрешено называться TeX. Вопрос лицензии несколько запутан заявлениями, включенными в начало исходного кода TeX, которые указывают, что "все права защищены. Копирование этого файла разрешено только при условии, что вы не вносите абсолютно никаких изменений в вашу копию". Это ограничение следует понимать как запрет на изменение исходного кода, пока файл называется tex.web. Запись об авторских правах в начале tex.web (и mf.web) была изменена в 2021 году, чтобы явно это указать. Эта интерпретация подтверждается позже в исходном коде, когда упоминается тест TRIP ("Если эта программа изменена, полученная система не должна называться 'TeX'"). Американское математическое общество пыталось в начале 1980-х годов зарегистрировать товарный знак для TeX, но в этом было отказано, поскольку в то время "TEX" (полностью заглавными буквами) был зарегистрирован компанией Honeywell для системы обработки текста "Text EXecutive".

Публикация XML

TeX можно использовать для автоматического создания сложного оформления для XML-данных. Различия в синтаксисе между этими двумя языками описания можно преодолеть с помощью TeXML. Таким образом, в контексте публикации XML, TeX можно рассматривать как альтернативу XSL FO. TeX позволил сократить научные статьи по математическим дисциплинам до относительно небольших файлов, которые можно было отображать на стороне клиента, что обеспечивало возможность обмена полностью оформленными научными статьями через ранний Интернет и зарождающуюся Всемирную паутину, даже когда передача больших файлов была затруднена. Это подготовило почву для создания репозиториев научных статей, таких как arXiv, посредством которых статьи могли быть «опубликованы» без участия издателя-посредника.

Произношение и правописание

Название TeX было задумано его разработчиком для произношения /t//ɛ//x/, с финальным согласным, как в шотландском слове "loch". Буквы названия должны представлять собой заглавные греческие буквы тау, эпсилон и хи, поскольку TeX — это сокращение от τέχνη (ΤΕΧΝΗ), греческого слова, означающего как "искусство", так и "ремесло", которое также является корнем слова "технический". Англоязычные пользователи часто произносят его /tɛk/, как первый слог слова "technical". Кнут предписывает набирать его с буквой "E" ниже основной линии и уменьшенным межбуквенным интервалом. Это делается, как упоминает Кнут в своей книге TeXbook, чтобы отличать TeX от других системных названий, таких как TEX, текстовый исполнительный процессор (разработанный Honeywell Information Systems). Энтузиасты любят создавать новые слова на основе "TeX", такие как TeXnician (пользователь программного обеспечения TeX), TeXhacker (программист TeX), TeXmaster (опытный программист TeX), TeXhax и TeXnique.

Сообщество

К заметным организациям в сообществе TeX относятся TeX Users Group (TUG), которая в настоящее время издает TUGboat и ранее публиковала The PracTeX Journal, освещающий широкий спектр тем в области цифровой типографии, связанных с TeX. Deutschsprachige Anwendervereinigung TeX (DANTE) – крупная группа пользователей в Германии. TeX Users Group была основана в 1980 году в образовательных и научных целях, предоставляя платформу для тех, кто интересуется типографией и дизайном шрифтов, а также является пользователями системы компьютерной наборки TeX, изобретенной Кнутом. TeX Users Group представляет интересы пользователей TeX во всем мире. TeX Users Group публикует журнал TUGboat три раза в год, а DANTE – журнал de четыре раза в год. Другие группы пользователей включают DK TUG в Дании, fr во Франции, GuIT в Италии, NTG в Нидерландах и UK TUG в Соединенном Королевстве; эти группы пользователей совместно поддерживают актуальный список.