> 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/uk/dokladni-statti/07-an-introduction-to-luatex-part-1-what-is-it-and-what-makes-it-so-different.md).

# An Introduction to LuaTeX (Part 1): What is it—and what makes it so different?

LuaTeX — це *набір інструментів*— він містить складні програмні інструменти та компоненти, за допомогою яких ви можете створювати (верстати) широкий спектр документів. Підзаголовок цієї статті також ставить два запитання про LuaTeX: що це таке — і що робить його таким відмінним? Відповідь на «Що це таке?» може здаватися очевидною: «Це рушій верстки TeX!» Так, це справді так, але ширший погляд, якого дотримується і автор цієї статті, полягає в тому, що LuaTeX — це надзвичайно універсальна система на основі TeX для *побудови та інженерії документів*.

### Пояснення LuaTeX: з чого почати?

Мета цієї першої статті про LuaTeX — надати контекст для розуміння того, що цей рушій TeX пропонує і чому/як його конструкція дає змогу користувачам будувати/проєктувати/створювати широкий спектр рішень для складних проблем верстки та дизайну — можливо, також забезпечуючи певний ступінь «захисту від майбутнього застарівання», оскільки користувачам дедалі частіше потрібне ПЗ на основі TeX, здатне адаптуватися до постійно мінливого технічного середовища. На думку автора, перелік і опис його функцій/можливостей не обов’язково є найкращим місцем для початку формування розуміння можливостей і потенціалу LuaTeX. Такий підхід не буде особливо корисним для читачів, які не знайомі з іншими рушіями TeX і для яких порівняння на основі функцій навряд чи матимуть особливий зміст.

Ризикувати терпінням читача («Просто переходь до суті!») я, мабуть, обиратиму більш «цілісний» підхід, сподіваючись дати корисний контекст, але ціною додаткового читання — і занурення в кілька тем програмування, щоб допомогти з розумінням. У [Частина 2](/latex/uk/dokladni-statti/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 — я запитав [Patrick Gundlach](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 обговорювали в 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 є власний завантажувач шрифтів, написаний на 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/5c336226505e516e30d0b13937fdcad0ce3b82c8)

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

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

По суті, LuaTeX — це рушій TeX, який підтримує дві мови програмування: традиційну мову на основі TeX і мову сценаріїв Lua. Звісно, ви можете використовувати обидві мови в одному й тому самому документі TeX або, якщо бажаєте, продовжувати верстати лише засобами TeX: наприклад, через макропакет LaTeX (LuaLaTeX). TeX (або LaTeX) — не легка для використання чи вивчення мова програмування, і відносно небагато людей справді опанували численні особливості 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}
\u005clet\u005c\u005c\u005crelax % перевизначити значення \\ , щоб уникнути проблем із розгортанням
Ось поточне значення {\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 (у масштабованих пунктах): ")
tex.print(hs.."\\par")
% Встановити нове значення для \hsize за допомогою Lua API
tex.hsize="400pt" % або використати tex.hsize=400*65536 (у масштабованих пунктах)
}%
% Після завершення \directlua попросити LaTeX
% повідомити нам нове значення \hsize
Ось значення {\ttfamily\string\hsize}, повідомлене
LaTeX{} після завершення {\tt\string\directlua}:
\the\hsize\par
\end{document}
```

Ось зображення, яке показує результат верстки коду LaTeX за допомогою LuaTeX (вище):

![Результати запуску LuaTeX](/files/9cc6c7548a6e26094c4456417d7b95f798b59b9d)

Зверніть увагу, що TeX-«хитрість» `\let\\\relax` полягає в тому, щоб уникнути проблем, спричинених «розгортанням» коду Lua в LuaTeX: цю тему ми коротко згадаємо нижче.

### Використання коду Lua

Є два основні варіанти використання коду Lua у ваших документах TeX/LaTeX:

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

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

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

## Підсумок і вступ до частини 2 цієї статті

Програмні компоненти, з яких побудовано LuaTeX, разом із вбудованою мовою сценаріїв Lua, забезпечують потужне поєднання для створення рішень, здатних розв’язувати широкий спектр складних проблем верстки, — а також для розроблення документних виробничих процесів, яким може піти на користь тісна інтеграція з механізмом верстки на основі TeX. У [Частина 2 цієї статті](/latex/uk/dokladni-statti/09-an-introduction-to-luatex-part-2-understanding-directlua.md) ми докладно розглянемо найпотужнішу команду, яку надає LuaTeX: `\directlua`.

А поки що — щасливого LuaTeX-ування!

## Подяки

Автор надзвичайно вдячний [Луїджі Скарсо](https://twitter.com/luigi_scarso)— одному з розробників LuaTeX — за те, що він знайшов час прочитати чернетку цієї статті й зробив низку дуже корисних зауважень і пропозицій. Будь-які інші фактичні помилки чи пропуски, звісно, належать авторові. Крім того, я хотів би подякувати [Patrick Gundlach](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/uk/dokladni-statti/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.
