Typst — современная альтернатива LaTeX

zvmyse-x2cytlpossz85ixrfony.jpeg

Языки разметки хорошо подходят для создания и редактирования структурированных документов. Они лучше автоматизированы и гибки, чем аналоги с 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


cj3rtn_ul8wawbtvnjcuh9rz6b8.jpeg

Мотивация похожа на ту, что в своё время побудила Дональда Кнута на разработку TeX. Далее со слов авторов: «Typst был порождён нашим разочарованием в LaTeX. Не зная, что нас ждёт, мы решили взять дело в свои руки и начали творить. Через четыре года Typst был почти готов к запуску… В 2019 году, мы были недовольны медленным и громоздким LaTeX. Хотя его качество на выходе превосходило все альтернативы, его было просто неудобно использовать. Мы начали разрабатывать собственный язык ради забавы, думая, что создать что-то лучшее будет слишком трудно. Только потом мы поняли, насколько большой проект мы на себя взвалили. Но мы также видели, как наше детище Typst день за днём растёт и развивается, и нам не терпелось увидеть, что люди будут с ним делать.»

От TeX к Typst


qnamzlff66axgfxmy3d4yj1mxpk.jpeg

Сегодня есть два превалирующих подхода к форматированию документов. Визуальный подход, 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 и его преемники позволили исследователям и студентам создавать статьи и диссертации высокого типографского качества. Но со временем стали очевидны проблемы:

  1. Модель программирования TeX основана на макросах, где у примитивов множество загадочных названий. Для большинства пользователей слишком сложно написание чего-либо, кроме самых простых макросов, поэтому им остаётся пользоваться пакетами, доступными в «Полной сети архивов TEX», CTAN (Comprehensive TEX archive network) [6].
  2. С одной стороны форматы TeX, такие как LaTeX, предоставляют много «из коробки», даже базовая настройка часто возможна только путём переопределения определённых макросов. Найти правильный макрос для модификации и корректный способ его переопределения бывает довольно сложно. Кроме того, такой подход может быстро привести к конфликтам между определениями разных макросов.
  3. Временами сообщения об ошибках в TeX далеки от ясности, а отладка сложного кода TeX — непростая задача [7]. Хотя это можно было бы частично улучшить с помощью лучшего компилятора, эта ситуация — в какой то мере следствие того, что он основан на макросах.


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

  1. Бесшовный выразительный синтаксис для разметки и кода, сочетание в себе простого текста, упрощённой разметки и полноценного языка программирования, чтобы в 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.*
    ]

    dhphcmk97jj7jufhjq9zn9o5prm.png
  2. Сильная вычислительная основа — 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 + [.],
)


u26h_y-crp_iit6j_flggpegklc.png
Реализованная структурная интроспекция в 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.

Возможно, захочется почитать и это:


mxuanbovcusqgmqdgugvpnql8vq.jpeg

© Habrahabr.ru