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

  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.*
    ]


  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 + [.],
)


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



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



Комментарии (17)


  1. OldFisher
    20.06.2023 08:22
    +8

    Мне всегда казалось, что негоже спутывать две разные вещи в одну. В случае разметки текста следует всячески отделять семантическую часть, определяющую содержимое и логическую структуру, от оформления и разметки. Не дело в статье о ледниках записывать размер бумаги.


    1. koshi
      20.06.2023 08:22
      +11

      В указанном примере эти настройки явно отделены от основного текста.
      Подозреваю, можно вынести в отдельный файл.

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


      1. OldFisher
        20.06.2023 08:22
        +4

        Основной принцип дизайна ПО: надо, чтобы делать что-то правильно было как можно легче, а неправильно - невозможно или хотя бы как можно труднее. То, что в примере форматирование вынесено в начало, конечно, приятно и всё такое, но ведь можно и в середине, наверное, это написать? Может даже, разбросать по всему тексту? Описывать соответствующие изменения перед разделами? То есть, нам открыта широчайшая дорога для наступания на старые грабли. В Lyx вон хотя бы попробовали удерживать от безобразий.


  1. Arastas
    20.06.2023 08:22
    +11

    Что-то странное.

    У Typst гораздо лучший пользовательский интерфейс, чем у TeX

    У TeX нет пользовательского интерфейса, как нет его у C или Python. Есть редакторы, есть среды разработки.


  1. Jury_78
    20.06.2023 08:22
    +2

    Внешне похоже на CSS (Cascading Style Sheets).


  1. domix32
    20.06.2023 08:22
    +6

    Подозрительно мало информации о продвинутых штуках типа тех же формул или каких-нибудь (авто)оглавлений, колонтитул, сноскок и прочих. В примере очень мило опустили нумерованый список, для которого есть тоже всякие отступы-выступы, буквицы и прочее. Что с таблицами? Про встроенные в текст блоки тоже примерно нисколько деталей. Зато "ух глядите, мы умеем CSS". Так какой профит-то, кроме того что есть LSP?


    1. InikonI
      20.06.2023 08:22
      +3

      В статье действительно не много описано, но в репозитории есть такой скриншот.
      Так же есть и руководство по применению.
      (На сколько оно все юзабельно не знаю, сам об Typst впервые узнал из данной статьи)
      image


  1. vadimr
    20.06.2023 08:22
    +1

    Интерлиньяж в примере просто чудовищен. За такую вёрстку бьют.


  1. km2
    20.06.2023 08:22

    Интересно есть ли TeX для бухгалтеров и гуманитариев? Там где TeX избыточен, а какого-нибудь markdown недостаточно. Для всяких заявлений, отчётов, деловых писем и прочего офисного документооборота.


    1. sim31r
      20.06.2023 08:22

      Без примеров непонятно, по моим впечатлениям они все на WYSIWYG сидят и им хватает.


  1. N-Cube
    20.06.2023 08:22
    +4

    Pandoc умеет комбинировать Markdown и TeX, так что можно писать хоть в веб-редактор гитхаба, а потом все это конвертировать в ePUB и PDF. Ах да, еще и свои шаблоны можно создавать и настраивать. Все это прекрасно работает и поддерживается, и когда понадобится что-то дополнительно - легко нагуглить. Скажем, можно в текст блоки кода вставить, а в них сделать перенос строк, да еще чтобы «висячие» строки не появлялись, и все это корректно в PDF и ePUB преобразовывалось, а готовую книгу можно было сразу на Амазон и прочие магазины загрузить. Pandoc все это решает.


  1. BeLord
    20.06.2023 08:22
    +1

    Надо бы потестить на простом примере, документ:

    Разделы с вложенностью 4 с важностью использовать формат 1.2.3.4 и 1.2.3.4.

    Таблицы, где строки могут быть пронумерованы тоже в формате 1.2.3.4 и при этом, чтобы нумерация разделов и строк в таблицах не пересекалась, разбавим все это списками вида "-", "*" и т.п, добавим формул и посмотрим, как это все взлетит.

    Взлетит, уже интересно, если нет, то продолжаем работать с LaTex.


    1. domix32
      20.06.2023 08:22
      +1

      Нужен пример на латехе, а там зарозеттим


  1. worldmind
    20.06.2023 08:22
    -1

    LaTex это реально набор костылей, сталкивался что и пакеты конфликтуют по именам и прочее, но по хорошему надо использовать DocBook, ибо PDF это всего лишь один из нужных на выходе форматов. И не так страшен XML как его малюют, хотя конечно было бы лучше что-то типа asciidoc, но полнофункциональный, а не подмножество.


  1. persii
    20.06.2023 08:22

    В тексте несколько букв потерялось: в Universität, например, нет "ä" — только "?" вместо неё; таких "?" не один по статье.


  1. vit1252
    20.06.2023 08:22

    Так и не понял если TeX использовали для передачи шаблонов, то каким образом тут эти шаблоны можно реализовать? Какие преимущества? Так же хотелось бы конечно POM (Page Object Model) как сейчас сделана в DOCX, а то при любой попытке программно обработать нужно генерить PDF. Хорошо бы иметь возможность поиграться с узлами документа или же даже иметь API для их генерации.


  1. Tamerlan666
    20.06.2023 08:22

    Ребята замахнулись на замену «неудобного» TeX, а по факту получается «линукс с нескучными обоями». Такое впечатление возникает, глядя на демо-результаты.