Плейсхолдеры
Синтаксис {{путь}} — это движок Word. Шаблон Typst плейсхолдеров не знает: он читает тот же
data.json и обращается к полям как к переменным. Два движка, два способа подставить данные, и
путать их — самая частая ошибка при первом шаблоне.
{{buyer.name}} значение поля
{{items.0.qty}} первый элемент массива
{{#each items}}…{{/each}} повтор строки таблицы для каждого элемента
{{this}} сам элемент внутри повтора
Путь — имя поля из схемы; точки разделяют вложенность, числа обозначают элемент массива.
В Word
Плейсхолдер можно набрать в любой ячейке таблицы или в абзаце. Word часто разрывает текст на несколько кусков форматирования; заполнение это переживает — куски склеиваются перед подстановкой.
Повтор строки ставится внутри строки таблицы: {{#each items}} в первой ячейке, {{/each}} в
последней. Заполнение повторит всю строку столько раз, сколько элементов в массиве.
Значения экранируются: «Ромашка & Ко» попадёт в документ как есть и не сломает файл. Если поля в данных нет, подставится пусто — а обязательные поля схема не пропустит заранее.
В Typst
Плейсхолдеров нет. Данные приходят файлом data.json рядом с шаблоном, и шаблон читает их как
обычно:
#let d = json("data.json")
#let opt(dict, key) = if key in dict { dict.at(key) } else { "" }
Поставщик: #d.seller.name
Город: #opt(d, "city")
#for item in d.items [• #item.name — #item.qty шт. ]
Необязательное поле читайте через opt: прямое обращение к отсутствующему ключу — ошибка печати,
и это правильно, но неудобно.
Схема
Схема — обычный JSON Schema (draft 2020-12). Обязательные поля перечисляются в required, а
example показывается в форме как подсказка.
{
"type": "object",
"required": ["number", "date", "buyer"],
"properties": {
"number": {"type": "string", "example": "14/2026"},
"date": {"type": "string", "format": "date", "example": "2026-11-14"},
"buyer": {"$ref": "#/$defs/party"}
},
"$defs": {
"party": {"type": "object", "required": ["name", "inn"],
"properties": {"name": {"type": "string"}, "inn": {"type": "string"}}}
}
}
Сгенерировать шаблон без вёрстки
Если шаблона нет, его можно получить из списка полей — командой в кабинете или через ассистента
(инструмент scaffold_template). Результат — готовый пакет: typst даёт аккуратную вёрстку,
docx — документ Word, который компания правит под свой бланк.