Языки разметки хорошо подходят для создания и редактирования структурированных документов. Они лучше автоматизированы и гибки, чем аналоги с WYSIWYG. Здесь контент отделён от представления, задаётся текст и его структура, далее на основе выбранного шаблона форматируется документ. Подобную систему компьютерной вёрстки TEX (TeX) разработал Дональд Кнут в 1978 году, окончательный релиз оформился в 1979-м. Системы на основе TeX до сих пор являются актуальными в этой области и продолжают развиваться. Вот несколько примеров.
LaTeX
В 1984 году Лесли Лэмпортом (Leslie Lamport) был создан LaTeX — набор макрорасширений (или макропакет) системы компьютерной TeX. Репозиторий LaTeX на Github.
SwiftLaTeX
SwiftLaTeX — браузерный WYSIWYG-редактор LaTeX, тоже с открытым кодом. Первый релиз состоялся 17 февраля 2022. Сайт (загрузка шаблонов в первый раз займёт несколько минут, так что будьте терпеливы), репозиторий на Github.
Вообще, на сегодняшний день у TeX около десятка разновидностей.
Markdown и AsciiDoc
Хотя облегчённые альтернативы TEX, такие как Markdown и AsciiDoc, не подходят для слишком сложных документов, но они широко востребованы и применимы.
Джон Грубер (John Gruber) создал Markdown в 2004 году как облегчённый язык разметки для создания форматированного текста в форме исходного кода с помощью любого текстового редактора. Markdown широко используется в блогах, мгновенных сообщениях, онлайн-форумах, программном обеспечении для совместной работы, страницах документации и файлах readme.
AsciiDoc создан в 2002 году Стюартом Рэкхэмом (Stuart Rackham) с простым для понимания форматом документа. Он семантически эквивалентен DocBook XML, но с использованием соглашения о разметке обычного текста. Документы AsciiDoc можно создавать с помощью любого текстового редактора и читать «как есть», отображать в HTML. Самые известные проекты на AsciiDoc — издательство O’Reilly и проект Git.
XML
Форматы на основе XML «слишком многословны» для редактирования вручную обычным текстовым редактором. «Заставлять людей редактировать XML — это садизм», как говорится в хабровской статье Фетиш LaTeX (или Не пишите в LaTeX! Он только для вёрстки). Это не очень хорошо для эффективной работы пользователей.
❯ Typst: программируемый язык разметки для набора текста
Наконец, Typst — современная альтернатива LaTeX, написанная на Rust, репозиторий. В проекте участвуют два разработчика из Берлина: Мартин Эрнст Хауг (Martin Ernst Haug), выпускник Берлинского технического университета (Technische Universit?t Berlin), предприниматель, инженер-программист, «фанат типографики» и Лоренс Медье (Laurenz M?dje), студент Берлинского технического университета, изучающий компьютерные науки. У Typst есть свой сайт — typst.app, страница с руководством. Typst финансируется Европейским Союзом (Европейский социальный фонд) и федеральной землёй Берлин.
Менторами у них выступает группа «Распределённых и операционных систем» (Distributed and Operating Systems) того же университета. У компилятора Typst открытые исходники, как и всех библиотек для Typst, таких как svg2pdf, biblatex и pdf-writer. Эти библиотеки доступны в репозитории Typst на Github. Кроме репозитория авторов Typst, на Github присутствует репозиторий с сервером Typst LSP. LSP — это Language Server Protocol, протокол между редактором/IDE и языковым сервером, который обеспечивает функции типа автодополнения. Сервер Typst LSP разработал американец Натан Варнер (Nathan Varner). Как известно, в популярных опенсорсных проектах обычно участвуют энтузиасты со всего мира.
Что побудило на создание Typst
Мотивация похожа на ту, что в своё время побудила Дональда Кнута на разработку TeX. Далее со слов авторов: «Typst был порождён нашим разочарованием в LaTeX. Не зная, что нас ждёт, мы решили взять дело в свои руки и начали творить. Через четыре года Typst был почти готов к запуску… В 2019 году, мы были недовольны медленным и громоздким LaTeX. Хотя его качество на выходе превосходило все альтернативы, его было просто неудобно использовать. Мы начали разрабатывать собственный язык ради забавы, думая, что создать что-то лучшее будет слишком трудно. Только потом мы поняли, насколько большой проект мы на себя взвалили. Но мы также видели, как наше детище Typst день за днём растёт и развивается, и нам не терпелось увидеть, что люди будут с ним делать.»
От TeX к Typst
Сегодня есть два превалирующих подхода к форматированию документов. Визуальный подход, WYSIWYG («Что видишь, то и получишь»), и подход, основанный на разметке. В редакторах WYSIWYG пользователи работают непосредственно в презентационной форме документа. Этот подход в редактировании имеет ощутимые преимущества: такие инструменты легко понятны большинству и они дают немедленный визуальный отклик.
Во втором подходе редакторы на языках с разметкой привносят ещё один дополнительный слой — пользователи редактируют текст, который смешивается с командами. И уже компилятор преобразует текст с разметкой в презентационный формат. Несмотря на то, что инструмент разметки вносит в рабочий процесс сложность на первоначальном этапе, это предоставляет широкие возможности для автоматизации.
Самый распространённый вид разметки — описательный, когда автор вводит логическую структуру документа, а не его конкретный вид. А вид уже определяется одной или несколькими таблицами стилей. Ярким примером такого подхода является XML (Extensible Markup Language) [1]. XML широко используется в издательском деле для хранения, обмена, форматирования книг и статей. У XML прекрасная применимость, когда имеется большое количество документов, следующих одной и той же схеме, например, серии книг. Когда содержание отделено от презентации, то можно свободно менять их независимо в любой момент времени с минимальными ручными усилиями. Недостаток XML в том, что он довольно многословен и из-за этого не подходит для написания или редактирования вручную.
Поэтому растёт популярность у языков с облегчённой, простой разметкой, как уже упомянутый Markdown [2], потому что есть насущная потребность в редактировании текста в простых редакторах.
TeX [3] — это система набора и вёрстки текста на основе разметки, разработанная Дональдом Кнутом по причине такой сильной неудовлетворённости существующими в то время компьютерными системами набора текста, что величайший программист решил, что пришло время создать всё с нуля. Набор и вёрстка его многотомного труда «Искусство программирования» (The Art of Computer Programming) велась в TeX. В языке TeX команды форматирования реализованы в виде макросов. В TeX встроен набор макросов для примитивного форматирования и низкоуровневых вычислений, пользователям предоставлена возможность создавать и свои собственные макросы. Эта расширяемость дала толчок к разработке множества пакетов макросов, которые различными способами улучшают или дополняют TeX, самый известный — LaTeX [5], формат, который привнёс в мир TeX идею описательной разметки. TeX и его преемники позволили исследователям и студентам создавать статьи и диссертации высокого типографского качества. Но со временем стали очевидны проблемы:
- Модель программирования TeX основана на макросах, где у примитивов множество загадочных названий. Для большинства пользователей слишком сложно написание чего-либо, кроме самых простых макросов, поэтому им остаётся пользоваться пакетами, доступными в «Полной сети архивов TEX», CTAN (Comprehensive TEX archive network) [6].
- С одной стороны форматы TeX, такие как LaTeX, предоставляют много «из коробки», даже базовая настройка часто возможна только путём переопределения определённых макросов. Найти правильный макрос для модификации и корректный способ его переопределения бывает довольно сложно. Кроме того, такой подход может быстро привести к конфликтам между определениями разных макросов.
- Временами сообщения об ошибках в TeX далеки от ясности, а отладка сложного кода TeX — непростая задача [7]. Хотя это можно было бы частично улучшить с помощью лучшего компилятора, эта ситуация — в какой то мере следствие того, что он основан на макросах.
У двух разработчиков Typst своё видение решения основных проблем систем на основе разметки. Во-первых, они должны быть максимально удобными для пользователя, понятными и последовательными (простота). Во-вторых, системы должны свести к минимуму объём ручного труда, необходимого для создания документов (автоматизация). У Typst гораздо лучший пользовательский интерфейс, чем у TeX, а также обладает широкими возможностями для программирования. По сравнению с существующими решениями авторы Typst декларируют следующие ключевые новшества:
- Бесшовный выразительный синтаксис для разметки и кода, сочетание в себе простого текста, упрощённой разметки и полноценного языка программирования, чтобы в Typst был лишён тех проблем, от которых страдает TEX. Разметка и код легко интегрируются и могут быть встроены друг в друга.
Пример синтаксиса и результат компиляции:
#set text( font: "New Computer Modern", size: 10pt ) #set page( paper: "a6", margin: (x: 1.8cm, y: 1.5cm), ) #set par( justify: true, leading: 0.52em, ) = Introduction In this report, we will explore the various factors that influence fluid dynamics in glaciers and how they contribute to the formation and behavior of these natural structures. ... #align(center + bottom)[ #image("glacier.jpg", width: 70%) *Glaciers form an important part of the earth's climate system.* ]
- Сильная вычислительная основа — Typst включает в себя полную среду программирования, основанную на чистых функциях. Система типов языка упрощает обработку макетируемого контента как компонуемого программно значения. Это также позволяет компилятору выдавать понятные для пользователя сообщения об ошибках с точным расположением и трассировкой вызовов.
Составная стилизация — у Typst реализована гибкая система стилей, основанная на свойствах и преобразованиях. С помощью этой системы пользователи могут стилизовать весь документ или его части:
#show heading.where(
level: 1
): it => block(width: 100%)[
#set align(center)
#set text(12pt, weight: "regular")
#smallcaps(it.body)
]
#show heading.where(
level: 2
): it => text(
size: 11pt,
weight: "regular",
style: "italic",
it.body + [.],
)
Реализованная структурная интроспекция в Typst позволяет коду проверять структуру документа и работать с окончательным расположением элементов на страницах контролируемым образом. Это составляет основу оглавления, нумерации разделов, перекрёстных ссылок и многого другого.
❯ Литература:
[1] T. Bray, J. Paoli, C. M. Sperberg-McQueen, E. Maler, and F. Yergeau, “Extensible Markup Language (XML) 1.0,” W3C, 2008.
[2] J. Gruber, “Markdown,” Daring Fireball.
[3] D. E. Knuth, The TeXbook. Reading, MA, USA: Addison-Wesley, 1986.
[4] Extensible Markup Language (XML) 1.0 (Fifth Edition)
[5] L. Lamport, LATEX: A document preparation system, 2nd ed. Reading, MA, USA: AddisonWesley, 1994.
[6] CTAN, “CTAN: Comprehensive TEX archive network.” ctan.org.
[7] F. Mittelbach, “E-TEX: Guidelines for future TEX extensions,” TUGboat, vol. 11, no. 3, pp. 86–94, May 1993.
Возможно, захочется почитать и это:
- ➤ Есть проблемы гораздо сложнее, чем NP-Complete
- ➤ MacOS Monterey на Linux — быстро и просто?
- ➤ 50 лет Ethernet. Почему технология по-прежнему остаётся сердцем Интернета
- ➤ Telegram API и библиотека TDLib для .NET платформ
- ➤ Blink: супербыстрый эмулятор x86_64 размером 119 КБ