Языки разметки хорошо подходят для создания и редактирования структурированных документов. Они лучше автоматизированы и гибки, чем аналоги с 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 КБ
Комментарии (17)
Arastas
20.06.2023 08:22+11Что-то странное.
У Typst гораздо лучший пользовательский интерфейс, чем у TeX
У TeX нет пользовательского интерфейса, как нет его у C или Python. Есть редакторы, есть среды разработки.
domix32
20.06.2023 08:22+6Подозрительно мало информации о продвинутых штуках типа тех же формул или каких-нибудь (авто)оглавлений, колонтитул, сноскок и прочих. В примере очень мило опустили нумерованый список, для которого есть тоже всякие отступы-выступы, буквицы и прочее. Что с таблицами? Про встроенные в текст блоки тоже примерно нисколько деталей. Зато "ух глядите, мы умеем CSS". Так какой профит-то, кроме того что есть LSP?
InikonI
20.06.2023 08:22+3В статье действительно не много описано, но в репозитории есть такой скриншот.
Так же есть и руководство по применению.
(На сколько оно все юзабельно не знаю, сам об Typst впервые узнал из данной статьи)
km2
20.06.2023 08:22Интересно есть ли TeX для бухгалтеров и гуманитариев? Там где TeX избыточен, а какого-нибудь markdown недостаточно. Для всяких заявлений, отчётов, деловых писем и прочего офисного документооборота.
sim31r
20.06.2023 08:22Без примеров непонятно, по моим впечатлениям они все на WYSIWYG сидят и им хватает.
N-Cube
20.06.2023 08:22+4Pandoc умеет комбинировать Markdown и TeX, так что можно писать хоть в веб-редактор гитхаба, а потом все это конвертировать в ePUB и PDF. Ах да, еще и свои шаблоны можно создавать и настраивать. Все это прекрасно работает и поддерживается, и когда понадобится что-то дополнительно - легко нагуглить. Скажем, можно в текст блоки кода вставить, а в них сделать перенос строк, да еще чтобы «висячие» строки не появлялись, и все это корректно в PDF и ePUB преобразовывалось, а готовую книгу можно было сразу на Амазон и прочие магазины загрузить. Pandoc все это решает.
BeLord
20.06.2023 08:22+1Надо бы потестить на простом примере, документ:
Разделы с вложенностью 4 с важностью использовать формат 1.2.3.4 и 1.2.3.4.
Таблицы, где строки могут быть пронумерованы тоже в формате 1.2.3.4 и при этом, чтобы нумерация разделов и строк в таблицах не пересекалась, разбавим все это списками вида "-", "*" и т.п, добавим формул и посмотрим, как это все взлетит.
Взлетит, уже интересно, если нет, то продолжаем работать с LaTex.
worldmind
20.06.2023 08:22-1LaTex это реально набор костылей, сталкивался что и пакеты конфликтуют по именам и прочее, но по хорошему надо использовать DocBook, ибо PDF это всего лишь один из нужных на выходе форматов. И не так страшен XML как его малюют, хотя конечно было бы лучше что-то типа asciidoc, но полнофункциональный, а не подмножество.
persii
20.06.2023 08:22В тексте несколько букв потерялось: в Universität, например, нет "ä" — только "?" вместо неё; таких "?" не один по статье.
vit1252
20.06.2023 08:22Так и не понял если TeX использовали для передачи шаблонов, то каким образом тут эти шаблоны можно реализовать? Какие преимущества? Так же хотелось бы конечно POM (Page Object Model) как сейчас сделана в DOCX, а то при любой попытке программно обработать нужно генерить PDF. Хорошо бы иметь возможность поиграться с узлами документа или же даже иметь API для их генерации.
Tamerlan666
20.06.2023 08:22Ребята замахнулись на замену «неудобного» TeX, а по факту получается «линукс с нескучными обоями». Такое впечатление возникает, глядя на демо-результаты.
OldFisher
Мне всегда казалось, что негоже спутывать две разные вещи в одну. В случае разметки текста следует всячески отделять семантическую часть, определяющую содержимое и логическую структуру, от оформления и разметки. Не дело в статье о ледниках записывать размер бумаги.
koshi
В указанном примере эти настройки явно отделены от основного текста.
Подозреваю, можно вынести в отдельный файл.
Мне кажется, основная проблема в том, что необходимость в этом новом инструменте несколько преувеличена.
Простые научные работники пользуются готовыми стилевыми файлами от журналов и практически никогда не страдают от недостатков LaTeX.
Ну а для вёрстки глянцевого журнала нужны другие инструменты.
OldFisher
Основной принцип дизайна ПО: надо, чтобы делать что-то правильно было как можно легче, а неправильно - невозможно или хотя бы как можно труднее. То, что в примере форматирование вынесено в начало, конечно, приятно и всё такое, но ведь можно и в середине, наверное, это написать? Может даже, разбросать по всему тексту? Описывать соответствующие изменения перед разделами? То есть, нам открыта широчайшая дорога для наступания на старые грабли. В Lyx вон хотя бы попробовали удерживать от безобразий.