> For the complete documentation index, see [llms.txt](https://overleaf-pro.ayaka.space/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://overleaf-pro.ayaka.space/latex/ru/podrobnye-stati/07-an-introduction-to-luatex-part-1-what-is-it-and-what-makes-it-so-different.md).

# Введение в LuaTeX (часть 1): Что это такое — и что делает его таким особенным?

LuaTeX — это *набор инструментов*— он содержит сложные программные инструменты и компоненты, с помощью которых можно создавать (верстать) широкий спектр документов. Подзаголовок этой статьи также ставит два вопроса о LuaTeX: что это такое — и чем он так отличается? Ответ на «Что это такое?» может показаться очевидным: «Это движок для верстки TeX!» И действительно, это так, но более широкий взгляд, которого придерживается автор, состоит в том, что LuaTeX — это чрезвычайно универсальная основанная на TeX *система построения и инженерии документов*.

### Разъяснение LuaTeX: с чего начать?

Цель этой первой статьи о LuaTeX — дать контекст для понимания того, что предоставляет этот движок TeX и почему/как его дизайн позволяет пользователям строить/проектировать/создавать широкий спектр решений для сложных задач верстки и дизайна — возможно, также в некоторой степени обеспечивая «защиту на будущее», поскольку пользователям все чаще требуется программное обеспечение на базе TeX, способное адаптироваться к постоянно меняющейся технической экосистеме. По мнению автора, перечисление и описание его функций/возможностей — не обязательно лучшее место для начала знакомства с возможностями и потенциалом LuaTeX. Такой подход не особенно поможет читателям, незнакомым с другими движками TeX и для которых сравнения по набору функций вряд ли будут особенно значимыми.

Рискуя исчерпать терпение читателя («Просто переходите к сути!»), я буду придерживаться более «целостного» подхода, надеясь предоставить полезный контекст, но ценой дополнительного чтения — и углубления в некоторые темы программирования, чтобы помочь с пониманием. В [Часть 2](/latex/ru/podrobnye-stati/09-an-introduction-to-luatex-part-2-understanding-directlua.md) мы рассмотрим использование `\directlua` но пока мы пытаемся заложить базовые основы для понимания LuaTeX.

Эта статья в значительной степени отражает личный «путь» автора в развитии понимания и оценки LuaTeX: если сначала узнать что-то о философии, лежащей в основе разработки LuaTeX, и рассматривать его как контейнер программных инструментов, вы лучше оцените обширные области решений, открываемые этим удивительным программным обеспечением.

## LuaTeX: не только для академической среды или математики!

Богатство функций и возможностей, встроенных в LuaTeX, не только обеспечивает исключительно высококачественную верстку с помощью традиционного LaTeX, но и открывает огромные возможности для разработки индивидуальных, не основанных на LaTeX решений для сложных задач производства и инженерии документов. В LuaTeX встроен мощный язык сценариев Lua, что означает, например, что вы можете использовать Lua для загрузки «плагинов» (внешних программных библиотек) в LuaTeX; это дополнительно обеспечивает высокий уровень автоматизации, интеграцию в существующие программные системы или рабочие процессы и использование специализированного ПО для обработки данных, текста или графики.

Исторически TeX ассоциировался с научными публикациями, особенно в математике, но LuaTeX, в частности, имеет значительный потенциал для применения во многих других областях — включая коммерческое создание PDF-документов. Один из таких примеров — [speedata publisher](https://speedata.github.io/publisher/) который использует LuaTeX исключительно как движок генерации PDF в своем XML-ориентированном рабочем процессе — он вообще не использует LaTeX. Действительно, speedata publisher содержит практически никакого кода TeX — я спросил [Патрику Гундлаху](https://twitter.com/patrickgundlach), разработчика speedata publisher, который подтвердил, что в общей сложности он использует около трех строк кода TeX. Его мощные возможности верстки разработаны и реализованы на Lua, с использованием Lua API LuaTeX (тему, которую мы обсуждаем позже в этой статье).

## Краткая личная история: как я впервые открыл для себя LuaTeX

Я впервые узнал о LuaTeX в конце 2009/начале 2010 года, когда он все еще находился на стадии промежуточной бета-версии (версия 0.50). В то время я искал программное обеспечение на базе TeX для верстки рукописных заметок, получившихся в результате моих попыток изучать арабский язык. Поиск в Google вывел коллекцию видео с конференции TUG 2009 ([теперь на YouTube](https://www.youtube.com/playlist?list=PL2D4DD50DC9C0BA0E)), в которой были демонстрации очень качественной арабской верстки (через пакет Ханса Хагена [ConTeXt](http://wiki.contextgarden.net/Main_Page)). В этих видео также есть доклад под названием [Проект LuaTeX: на полпути к версии 1](https://youtu.be/AKv4po9PGW0).

Движок TeX, использованный для создания той изысканной арабской верстки, назывался «LuaTeX». В то время я работал в научных (физических) публикациях, но, хотя и хорошо знал TeX/LaTeX, о LuaTeX я не слышал: меня это заинтриговало, и я захотел узнать больше об этом новом движке TeX. Поскольку LuaTeX все еще находился на стадии бета-разработки и быстро развивался, я хотел быть в курсе самых последних обновлений, поэтому лучшим вариантом (для меня) был путь «сделай сам» — собрать (скомпилировать) исполняемый файл LuaTeX из исходного кода. В дополнение к исполняемой программе LuaTeX вам также нужна «установка TeX», чтобы обеспечить среду, в которой будет запускаться LuaTeX (например, texmf.cnf, макропакеты, шрифты и т. д.). Вместо загрузки и установки огромного [TeX Live](https://www.tug.org/texlive/) дистрибутива я решил создать абсолютно минимальную пользовательскую установку TeX, с помощью которой можно было бы исследовать LuaTeX (интересное упражнение, которое я [документировал в своем личном блоге](http://www.readytext.co.uk/?cat=30)). Каждый новый выпуск LuaTeX сопровождается его Руководством-справочником (например, для[версии 1.0.4](https://www.tug.org/svn/texlive/tags/texlive-2017.1/Master/texmf-dist/doc/luatex/base/luatex.pdf?revision=44591\&view=co)), в котором документированы последние функции и возможности программы. Однако это *справочное* руководство, и (по необходимости) оно довольно кратко в части объяснений, подходящих для новичка, желающего начать работать с этим невероятным движком TeX — предполагается некоторый уровень знакомства с низкоуровневыми концепциями TeX. Поскольку я обнаружил LuaTeX на относительно раннем этапе его развития, хорошие вводные материалы в то время было относительно трудно найти, поэтому потребовалось немного исследований, экспериментов (и некоторого разочарования…), прежде чем кусочки начали складываться в общую картину. Само собой разумеется, мои занятия арабским внезапно прекратились, поскольку я увлекся этим удивительным программным обеспечением и в конце концов перешел к написанию плагинов LuaTeX [для верстки арабского текста](http://www.readytext.co.uk/?p=3143) вместо этого!

Мой собственный «путь в LuaTeX» определенно был очень нелинейным, но по ходу дела он дал возможность узнать о (Lua)TeX (и установках TeX) «с нуля»: мой блог содержит эклектичную коллекцию [статьям](http://www.readytext.co.uk/?cat=3) основанную на различных темах, которые я исследовал и над которыми работал в то время. Надеюсь, эта статья надлежащим образом использует это время и опыт, помогая другим заинтересоваться началом изучения возможностей LuaTeX. LuaTeX продолжает развиваться, и на момент написания он достиг версии 1.0.4, выпущенной вместе с TeX Live 2017. Разработчики очень активны, и любые обнаруженные ошибки обычно исправляются вскоре после сообщения о них — например, через [список рассылки dev-luatex](https://mailman.ntg.nl/mailman/listinfo/dev-luatex) или через [онлайн-трекер ошибок LuaTeX](http://tracker.luatex.org/my_view_page.php). Задолго до достижения версии 1.0 LuaTeX был пригоден для производства — хотя, конечно, приходилось принимать то, что функции постоянно развиваются, и время от времени изменения могли ломать ваш существующий TeX-код. Сегодня LuaTeX, конечно, поддерживается платформами Overleaf и ShareLaTeX (как LuaLaTeX).

## TeX в меняющемся мире: новые технологии и рабочие процессы

Очевидно, движки TeX не работают в технологически статичном мире, и иногда появляются инновации, которые сразу и явно подходят для включения в движки TeX — одной из таких инноваций являются переменные шрифты OpenType, о которых мы кратко говорим ниже. Хотя вряд ли можно сомневаться в том, что программное обеспечение для верстки на базе TeX чрезвычайно универсально, движки TeX теперь работают в быстро меняющейся и очень разнообразной программной экосистеме — новые рабочие процессы подчеркивают необходимость интеграции и гибкости для реализации широкого спектра решений для документов/верстки, где TeX может быть лишь одним из компонентов.

TeX должен не только оставаться актуальным для своих нынешних пользователей, но и привлекать новых, предоставляя решения для создания контента, которые будут полезны и для приходящих поколений — людей, которые, возможно, не захотят использовать TeX как самостоятельный инструмент, а, возможно, как часть общего рабочего процесса через онлайн-платформы совместной работы, такие как Overleaf.

Даже беглый просмотр [tex.stackexchange](https://tex.stackexchange.com/) показывает огромное разнообразие документов и решений, создаваемых и реализуемых с помощью программного обеспечения на базе TeX — часто демонстрируя невероятную изобретательность, поскольку люди находят все новые варианты использования и типы контента, которые хотят генерировать. Кроме того, потребность в рабочих процессах, которые могут обрабатывать разметку/контент на базе TeX для получения выходных данных, не являющихся PDF (и не DVI), никогда не была столь велика — например, MathML/XML и HTML. Например, «преобразование» TeX в [JATS XML](https://jats.nlm.nih.gov/) формат (долгое время используемый в академическом журнальном издательстве), а в последнее время — рост epub, используемого в публикации электронных книг.

### Технология переменных шрифтов — времена меняются

14 сентября 2016 года Microsoft, [Google](https://opensource.googleblog.com/2016/09/introducing-opentype-font-variations.html), [Adobe](https://blog.typekit.com/2016/09/14/variable-fonts-a-new-kind-of-font-for-flexible-design/) и Apple объявили о новой технологии шрифтов: [переменные шрифты OpenType](https://medium.com/@tiro/https-medium-com-tiro-introducing-opentype-variable-fonts-12ba6cd2369). Мы не будем подробно рассматривать эту технологию, но достаточно сказать, что такие уважаемые эксперты по шрифтам, как [Thomas Phinney](https://twitter.com/ThomasPhinney) и [John Hudson](https://twitter.com/TiroTypeworks) отметили ([в Twitter](https://twitter.com/ThomasPhinney/status/917087509342851072)), что технология переменных шрифтов внедряется гораздо быстрее, чем многие более ранние новшества в области шрифтов — вполне вероятно, это обусловлено потребностями веб-дизайнеров, которым нужны адаптивные дизайны, подстраивающиеся под огромное разнообразие размеров и разрешений экранов мобильных устройств.

Очевидно, переменные шрифты OpenType — это интересное и захватывающее развитие в технологиях шрифтов, от которого пользователи TeX, несомненно, могли бы выиграть — действительно, этот вопрос неизбежно был [поднят на tex.stackexchange](https://tex.stackexchange.com/questions/355104/tex-luatex-xetex-fontspec-support-for-opentype-variable-fonts) с обсуждением поддержки LuaTeX в [списке рассылки](https://www.tug.org/pipermail/luatex/2016-September/006204.html).

Кстати, стоит отметить, что технология шрифтов, основанная на «параметрическом» создании шрифтов, — не совсем новая идея: METAFONT Кнута и технологии Adobe Multiple Master в некотором смысле являются ее ранними предшественниками, даже если детали реализации заметно отличаются.

### Переменные шрифты: когда они нам нужны — сейчас?

Любому новому и полезному технологическому стандарту/спецификации нужно время, чтобы «прижиться» в целевой экосистеме разработчиков и внедренцев — включая время на устранение любых неоднозначностей или трактовок формулировок самой спецификации. Разработчики должны прочитать и понять документацию и превратить ее в реально работающее программное обеспечение — что здесь включает создание шрифтов и технологий для их использования: совместимых браузеров и движков верстки. Разработчикам TeX, очевидно, потребуется доступ к высококачественным переменным шрифтам, которые можно использовать как надежные «эталоны» для реализации (программирования) поддержки технологий переменных шрифтов.

Внедрение любой новой технологии в TeX, такой как переменные шрифты, поднимает *возможную* необходимость модификации внутренностей движков TeX — конечно, необходимость делать это зависит от природы этой технологии и, что крайне важно, от того, какой именно аспект поведения TeX подвергается изменению. Не всегда требуется модифицировать сами движки TeX: возможно, нужны лишь изменения в поддерживающем/вспомогательном программном обеспечении, включая любые «компоненты» (сторонние библиотеки кода), используемые в этих программах. Внутри движки TeX *чрезвычайно* сложны — для разработки понимания исходного кода TeX, достаточного для внесения надежных изменений, требуется значительная и узкоспециализированная экспертиза (а ее предложение очень ограничено). Также крайне важно, чтобы любые изменения не ухудшали долгосрочную стабильность/совместимость движков TeX — что жизненно важно для сообщества TeX и для тех, кто впоследствии обрабатывает файл(ы) автора в (La)TeX: прежде всего для академических издателей и облачных сервисов, таких как Overleaf и ShareLaTeX.

Многие пользователи TeX, вероятно, будут заинтересованы в использовании переменных шрифтов; например, для реализации новых дизайнерских возможностей или поиска решений сложных задач верстки. Так что в некотором смысле тут есть дилемма: пользователи TeX хотят получить доступ к новой технологии, но ее реализация зависит от очень ограниченного ресурса: числа разработчиков, квалифицированных и способных это осуществить. Модификация внутренностей TeX трудна и, как правило, ее лучше избегать, где это возможно, так есть ли другой способ добавить (некоторые классы) новых функций/возможностей в TeX? Да! И LuaTeX пошел именно этим путем.

#### Ранние эксперименты: переменные шрифты OpenType и LuaTeX

Дизайн LuaTeX позволил быстро экспериментировать с технологией переменных шрифтов. Уже к апрелю 2017 года формат TeX ConTeXt, использующий LuaTeX, имел [бета-версию](https://mailman.ntg.nl/pipermail/ntg-context/2017/088343.html) в которой были реализованы переменные шрифты OpenType. Это стало возможным, потому что поддержка шрифтов ConTeXt встроена в код Lua (и у ConTeXt есть собственный fontloader, написанный на Lua).

## LuaTeX: фон и история

LuaTeX, в терминах TeX, — «новичок на районе», несмотря на то что находится в активной разработке уже более 10 лет. Веб-сайт LuaTeX [документирует](http://www.luatex.org/roadmap.html) что LuaTeX начал свое существование в 2005 году, а, как я полагаю, активная и устойчиво продолжающаяся разработка началась в 2006 году. Из-за присущей ему сложности и усердия тех, кто его создавал, LuaTeX действительно потребовалось 10 лет разработки, чтобы достичь версии 1.0, которая была [объявлена его разработчиками](https://mailman.ntg.nl/pipermail/dev-luatex/2016-September/005882.html) (Hans Hagen, Hartmut Henkel, Taco Hoekwater, Luigi Scarso) 27 сентября 2016 года.

В этом объявлении о выпуске содержится важное принципиальное заявление:

> «Наша главная цель — предоставить вариант TeX, который допускает пользовательские расширения без необходимости адаптировать внутреннее устройство.»

Эта формулировка прекрасно выражает философию, лежащую в основе разработки LuaTeX, и указывает на путь, по которому программное обеспечение на базе TeX может решать уже упомянутые нами задачи: внедрять новые технологии и оставаться актуальным для новых поколений пользователей.

Теперь пришло время ответить на второй вопрос, содержащийся в подзаголовке этой статьи: «чем он так отличается». Исследуя смысл фразы «...допускает пользовательские расширения без необходимости адаптировать внутреннее устройство», мы лучше поймем суть того, что LuaTeX «приносит на стол».

## LuaTeX: открывая «черный ящик» TeX

Исходная программа TeX Кнута — это общий предок всех современных движков TeX, используемых сегодня, а LuaTeX, по сути, является последним эволюционным шагом: он произошел от программы pdfTeX, но с добавлением некоторых мощных программных компонентов, которые дают значительно расширенную функциональность. Когда Кнут писал оригинальную версию программного обеспечения TeX, он также предоставил язык TeX как способ управления и программирования его поведения при верстке: пользователям и разработчикам макропакетов TeX было доступно около 320 низкоуровневых команд (примитивов). Эти команды давали разную степень контроля или влияния на определенные аспекты версточного поведения TeX, но большая часть внутренней функциональности TeX, алгоритмов, процессов принятия решений, данных и структур данных была скрыта от пользователя. Можно утверждать, что программа TeX Кнута не была полностью «черным ящиком», но, безусловно, была очень темно-серой — конечно, исходный код был доступен, но для подавляющего большинства людей он тоже представляет собой черный ящик непостижимости.

Мы называем внутренние процессы в TeX в некотором смысле «черным ящиком»; однако LuaTeX открывает свои внутренности на основе TeX, предоставляя пользователям/разработчикам гораздо более широкий доступ к многим некогда скрытым процессам, происходящим глубоко внутри движка TeX, и контроль над ними. LuaTeX также добавляет множество новых примитивных команд, обеспечивающих управление новыми функциями.

### LuaTeX: происходит от pdfTeX, но не использует код pdfTeX

Для точности важно отметить, что хотя мы описывали LuaTeX как производный от pdfTeX, LuaTeX напрямую не использует исходный программный код pdfTeX. Один из разработчиков LuaTeX (Taco Hoekwater) предпринял поистине *геркулесову* задачу переписать ядро движка TeX в LuaTeX в чистом современном C-коде (CWEB).

#### Историческая заметка

Отчасти из-за возраста исходного кода TeX Кнута, от которого происходят его современные потомки, его модификация для адаптации или создания новых движков верстки на базе TeX — сложный и запутанный процесс. Часть этого процесса требует преобразования кода Pascal в код C — а это не лишено [определенной степени сложности](http://www.readytext.co.uk/?p=2529). В результате машинно сгенерированный код C чрезвычайно многословен и очень труден для чтения или понимания. Очевидно, что полная переписка кода LuaTeX позволяет обойти весь процесс преобразования из Pascal в C.

## Строительные блоки LuaTeX

Во введении мы упоминали LuaTeX как «набор инструментов» и описывали его как «систему построения и инженерии документов». Мы увидели, что в объявлении версии 1.0 разработчики заявили:

> «Наша главная цель — предоставить вариант TeX, который допускает пользовательские расширения без необходимости адаптировать внутреннее устройство.»

Теперь пришло время собрать эти нити воедино и сосредоточиться на деталях того, что все это *на самом деле означает* на практике.

### Пазл LuaTeX

Если посмотреть «под капот», вы увидите, что программное обеспечение LuaTeX, то есть собственно исполняемая программа, построено из набора программных компонентов, которые объединены вместе, чтобы обеспечить общую функциональность LuaTeX. Разумеется, в этом нет ничего нового, и большинство программ создается именно так. Однако LuaTeX отличается от других движков TeX тем, что эти компоненты объединены таким образом, что пользователям предоставляется гораздо более широкий доступ ко многим аспектам внутренней функциональности TeX: алгоритмам верстки TeX, процессам принятия решений, данным и структурам данных. Такое раскрытие внутреннего устройства TeX позволяет пользователям создавать новые решения для верстки без необходимости модифицировать сам движок TeX.

### Lua в LuaTeX: ключ к «черному ящику»

Lua — очень мощный, но при этом легко изучаемый язык сценариев, который [происходит из Бразилии](https://www.lua.org/about.html)— он был создан в 1993 году и до сих пор активно развивается. Одна из сильных сторон Lua — его использование как языка программирования, с помощью которого можно «склеивать» разрозненные программные компоненты, позволяя использовать их через простой, но универсальный язык сценариев. Lua играет центральную роль в раскрытии внутреннего устройства движка TeX LuaTeX, но чтобы лучше понять, как это достигается, стоит немного отвлечься и очень кратко обсудить две концепции программирования:

* интерфейс программирования приложений (API);
* связывание языков программирования.

Не стесняйтесь пропустить этот раздел, если вам комфортны эти понятия. Ни одна из тем не будет рассматриваться подробно — мы не стремимся к строгой технической точности, а хотим лишь дать достаточно фона, чтобы знать об этих понятиях: их значении и отношении к LuaTeX.

### Интерфейс программирования приложений (API)

Представьте, что вы программист, написавший некоторый код, который может оказаться полезным пользователям (другим программистам), но ваш код сложен, и вы не хотите, чтобы пользователям вашего кода приходилось разбираться в этих низкоуровневых деталях. Заметьте, что эти программисты/разработчики работают на том же языке программирования, который вы использовали для написания своего кода. Кроме того, предположим, у вас есть планы переписать некоторые части своего кода — например, чтобы сделать его быстрее, снизить потребление памяти и так далее. Существующим пользователям вашего кода не нужно об этом беспокоиться: любые изменения, которые вы планируете внести, не должны ломать их программы. Так в чем же решение?

Ответ кроется в том, что называется API:  *интерфейсом программирования приложений*. Вместо того чтобы требовать от пользователей (других программистов) доступа к низкоуровневым деталям вашего кода, которые могут измениться, вы предоставляете определенный набор *функций* , которые другие программисты могут использовать. Эти функции — это *интерфейс* к вашему коду, через который другие разработчики могут создавать *приложения* без необходимости досконально знать внутреннее устройство вашей программы. В некотором смысле это можно представить как дополнительный слой, который окружает ваш код и «изолирует» пользователей от запутанных низкоуровневых деталей.

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

#### API: аналогия с пакетом LaTeX

Когда вы используете команды, предоставляемые пакетом LaTeX, вы можете воспринимать команды пакета как форму API. Как пользователь, вы не обязательно интересуетесь магией TeX и LaTeX, стоящей за этими командами (то есть в коде пакета): все, что вам нужно, — это воспользоваться предоставляемой ими функциональностью.

### Связывание языков программирования

Мы видели, что программисты, пишущие/публикующие набор полезного кода (называемый *библиотекой*), могут предоставлять так называемый интерфейс программирования приложений (набор функций), через который другие программисты, использующие *тот же* язык программирования, могут использовать эту библиотеку (набор кода). Это хорошо, когда обе стороны (разработчик библиотеки и ее пользователи) используют *тот же* язык программирования, но что, если программисты, использующие *другой* язык программирования, тоже хотят использовать эту библиотеку? Например, вы можете писать сценарии на языке Lua, но хотеть использовать библиотеку, написанную, например, на таких языках программирования, как C/C++. Как-то два разных языка программирования (Lua и C/C++) должны уметь «общаться» друг с другом. Одно из решений этой проблемы — так называемое [связывание языков](https://en.wikipedia.org/wiki/Language_binding).

Рассмотрение технических деталей связывания языков выходит за рамки этой статьи, поэтому мы дадим краткое изложение общих принципов. По сути, добавив подходящий дополнительный «слой» кода к исходной библиотеке, можно заставить ее «общаться» с другим языком программирования (например, Lua): такой слой кода называется *связыванием*. Он позволяет двум языкам взаимодействовать через API, с помощью которого программисты на втором языке (например, Lua) могут получать доступ к возможностям/службам, предоставляемым библиотекой.

![Схематическая диаграмма, показывающая концепцию языкового связывания.](/files/6c239ffe8ac89d89548c3d947e7109d96e4caf96)

**Рисунок 1**: Схематическая диаграмма, показывающая концепцию языкового связывания: она позволяет программе, написанной на Lua, использовать внешнюю библиотеку, написанную на другом языке программирования. Именно благодаря Lua-связываниям внутренние компоненты LuaTeX, а следовательно и значительная часть внутренней верстальной функциональности LuaTeX, становятся доступными для пользователей, разрабатывающих решения сложных задач верстки.

## LuaTeX: два варианта программирования — TeX и Lua

По сути, LuaTeX — это движок TeX, поддерживающий два языка программирования: традиционный язык на основе TeX и язык сценариев Lua. Разумеется, вы можете использовать оба языка в одном и том же документе TeX или, если предпочитаете, продолжать верстку только средствами TeX: например, через макропакет LaTeX (LuaLaTeX). TeX (или LaTeX) — не простой язык программирования для использования или изучения, и относительно немногие люди действительно освоили многие особенности TeX — концепции TeX [токены](https://www.overleaf.com/blog/522-what-is-a-tex-token) и развертывания довольно чужды большинству ожиданий и опыта людей в отношении языка программирования.

Добавление Lua открывает возможность использовать TeX-верстку через гораздо более доступный и привычный язык программирования — как отмечалось в начале статьи, используя Lua API, вы можете выполнять [сложную верстку практически без кода TeX](http://wiki.luatex.org/index.php/TeX_without_TeX).

### LuaTeX добавляет множество новых примитивов

Каждый движок TeX предоставляет сотни так называемых примитивных команд: фундаментальных строительных блоков языка на основе TeX, поддерживаемого каждым отдельным движком верстки. Оригинальная версия TeX, выпущенная Дональдом Кнутом, предоставляла примерно 320 команд, но более новые движки TeX (pdfTeX, XeTeX и LuaTeX) добавили множество новых примитивов, чтобы предоставить пользователям доступ к дополнительным функциям и возможностям каждого движка. Значительное число новых примитивов LuaTeX задокументировано в его [Руководстве-справочнике](https://www.tug.org/svn/texlive/tags/texlive-2017.1/Master/texmf-dist/doc/luatex/base/luatex.pdf?revision=44591\&view=co).

Среди множества новых примитивов, введенных LuaTeX, есть один под названием `\directlua{...}` который является шлюзом к использованию кода Lua: к доступу к внутренностям движка LuaTeX для создания сложных инструментов и решений для верстки.

### \directlua{...}: шлюз к программированию на Lua

Как уже обсуждалось, язык сценариев Lua можно рассматривать как предоставляющий «слой», через который можно получить доступ к TeX-ориентированному движку верстки LuaTeX и к функциональности, обеспечиваемой многими компонентами, из которых построен LuaTeX. Язык Lua также является механизмом, который обеспечивает расширяемость LuaTeX — благодаря способности Lua загружать специализированные внешние библиотеки программного обеспечения/кода.

Совокупно Lua-интерфейс (набор функций на Lua), предоставляемый LuaTeX, называется его *Lua API*: это «линия связи» между внутренним движком/компонентами LuaTeX и документом пользователя.

### Простой пример \directlua{...}

Следующие *чрезвычайно простой* пример и близко не исчерпывает бездну возможностей. Однако он демонстрирует базовую идею взаимодействия между «TeX-способом» и «Lua-способом» доступа к параметрам TeX.

Заметьте, что:

* `\hsize` — это примитив TeX (команда), который задает значение внутреннего параметра, определяющего ширину набранных строк — например, обычно вы устанавливаете его в подходящее значение внутри `\vbox{...}`. `\hsize` является лишь одним из *множеством* параметров TeX, к которым вы можете обращаться и/или которые можете изменять с помощью кода Lua.
* Доступ к параметрам TeX — это лишь один *крошечный* аспект Lua API LuaTeX: там есть гораздо больше!

```latex

\documentclass{article}
\begin{document}
\let\\\relax %переопределяем значение \\, чтобы избежать проблем с развертыванием
Вот текущее значение {\ttfamily\string\hsize} (через \LaTeX):
\the\hsize\par
\directlua{
%Получить текущее значение \hsize с помощью Lua API
local hs=tex.hsize
% Использовать функцию Lua API для вывода некоторого
% кода LaTeX и значения \hsize
tex.print("Вот значение {\\ttfamily\\string\\hsize}
сообщенное кодом Lua (в scaled points): ")
tex.print(hs.."\\par")
% Установить новое значение для \hsize с помощью Lua API
tex.hsize="400pt" % или используйте tex.hsize=400*65536 (в scaled points)
}%
% После завершения \directlua попросить LaTeX
% сообщить нам новое значение \hsize
Вот значение {\ttfamily\string\hsize}, сообщенное
LaTeX{} после завершения {\tt\string\directlua}:
\the\hsize\par
\end{document}
```

Вот изображение, показывающее результат верстки LaTeX-кода (выше) с помощью LuaTeX:

![Результаты запуска LuaTeX](/files/e73a39308c910caac5dbc99992e47277e646ace3)

Заметьте, что TeX-«хитрость» `\let\\\relax` нужна, чтобы избежать проблем, вызванных «развертыванием» LuaTeX кода Lua: эту тему мы кратко упоминаем ниже.

### Использование кода Lua

Есть два основных варианта использования кода Lua в ваших документах TeX/LaTeX:

1. **Встроенный**: запись кода Lua непосредственно внутри вашего `.tex` документа (как в примере выше);
2. **Внешний**: хранение кода Lua во внешних `.lua` файлах кода и использование средств Lua для их загрузки и запуска.

Вариант (1) лучше всего подходит для более коротких фрагментов кода Lua. Вариант (2) используется для более крупных программ или библиотек кода Lua. У него есть заметное преимущество: вы можете избежать сложных проблем, связанных с так называемыми `\catcode` значениями (что может быть «довольно раздражающим»). Причина этих `\catcode` проблем — «развертывание» кода Lua перед передачей его встроенному интерпретатору LuaTeX. Это развертывание может быть непросто понять, поэтому мы рассмотрим его подробнее в последующей статье.

Разумеется, существуют пакеты LaTeX, которые помогают использовать код Lua в ваших .tex файлах — например, вы можете использовать [пакет luacode](https://ctan.org/pkg/luacode?lang=en).

## Итоги и введение во 2-ю часть этой статьи

Программные компоненты, из которых построен LuaTeX, вместе со встроенным языком сценариев Lua образуют мощную комбинацию для создания решений, способных решать широкий спектр сложных задач верстки — и проектирования рабочих процессов подготовки документов, которые могут выиграть от тесной интеграции с движком верстки на основе TeX. В [Часть 2 этой статьи](/latex/ru/podrobnye-stati/09-an-introduction-to-luatex-part-2-understanding-directlua.md) мы подробно рассмотрим самую мощную команду, предоставляемую LuaTeX: `\directlua`.

До тех пор — счастливого LuaTeXing!

## Благодарности

Автор чрезвычайно благодарен [Луиджи Скарсо](https://twitter.com/luigi_scarso), одному из разработчиков LuaTeX, за то, что он нашёл время прочитать черновик этой статьи и сделал ряд очень полезных комментариев и предложений. Все оставшиеся фактические ошибки или упущения, разумеется, на совести автора. Кроме того, я хотел бы поблагодарить [Патрику Гундлаху](https://twitter.com/patrickgundlach), разработчика [speedata publisher](https://speedata.github.io/publisher/), за то, что он нашёл время ответить на мои вопросы.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://overleaf-pro.ayaka.space/latex/ru/podrobnye-stati/07-an-introduction-to-luatex-part-1-what-is-it-and-what-makes-it-so-different.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
