> 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/overleaf-learn-latex-pt/artigos-aprofundados/07-an-introduction-to-luatex-part-1-what-is-it-and-what-makes-it-so-different.md).

# Uma Introdução ao LuaTeX (Parte 1): O que é — e o que o torna tão diferente?

LuaTeX é um *conjunto de ferramentas*—ele contém ferramentas e componentes de software sofisticados com os quais você pode construir (compor) uma ampla gama de documentos. O subtítulo deste artigo também levanta duas perguntas sobre o LuaTeX: O que ele é — e o que o torna tão diferente? A resposta para “O que ele é?” pode parecer óbvia: “É um motor de composição tipográfica TeX!” De facto, é, mas uma visão mais ampla, e aquela com a qual este autor concorda, é que o LuaTeX é um sistema de construção e engenharia de documentos baseado em TeX extremamente versátil *sistema de construção e engenharia de documentos*.

### Explicando o LuaTeX: por onde começar?

O objetivo deste primeiro artigo sobre o LuaTeX é oferecer um contexto para entender o que este motor TeX fornece e por que/como o seu design permite aos utilizadores construir/desenhar/criar uma ampla gama de soluções para problemas complexos de composição tipográfica e design — talvez também oferecendo algum grau de “preparação para o futuro”, à medida que os utilizadores precisam cada vez mais de software baseado em TeX capaz de se adaptar ao ecossistema técnico em constante mudança. Na opinião deste autor, listar e descrever as suas funcionalidades/capacidades não é necessariamente o melhor ponto de partida ao desenvolver uma compreensão das capacidades e do potencial do LuaTeX. Tal abordagem não será particularmente útil para leitores que não estão familiarizados com outros motores TeX e para quem comparações baseadas em funcionalidades dificilmente serão especialmente significativas.

Correndo o risco de esgotar a paciência do leitor (“Só chegue logo ao ponto!”), vou adotar uma abordagem mais “holística”, esperando fornecer um contexto útil, mas ao custo de alguma leitura adicional — e de me aprofundar em alguns tópicos de programação para ajudar na compreensão. Em [Parte 2](/latex/overleaf-learn-latex-pt/artigos-aprofundados/09-an-introduction-to-luatex-part-2-understanding-directlua.md) exploramos o uso de `\directlua` mas, por enquanto, tentamos estabelecer os fundamentos básicos para compreender o LuaTeX.

Este artigo reflete fortemente a “jornada” pessoal do autor no desenvolvimento de uma compreensão e apreciação do LuaTeX: ao conhecer primeiro um pouco da filosofia por trás do desenvolvimento do LuaTeX, e ao vê-lo como um contentor de ferramentas de software, você apreciará melhor os extensos domínios de solução que este software incrível abre.

## LuaTeX: não é só para a academia, ou matemática!

A riqueza de recursos e funcionalidades incorporados no LuaTeX não só fornece uma composição tipográfica de altíssima qualidade via LaTeX tradicional, como também oferece um enorme potencial para desenvolver soluções personalizadas, não baseadas em LaTeX, para problemas complexos de produção e engenharia de documentos. O LuaTeX tem a poderosa linguagem de script Lua incorporada, o que significa, por exemplo, que você pode usar Lua para carregar “plugins” (bibliotecas de software externas) no LuaTeX; isto permite ainda maiores níveis de automação, integração em sistemas ou fluxos de trabalho de software existentes e aproveitamento de software especializado para processamento de dados, texto ou gráficos.

Historicamente, o TeX tem sido associado à autoria/publicação académica, especialmente na matemática, mas o LuaTeX, em particular, tem um potencial significativo para aplicação em muitos outros domínios — incluindo a produção comercial de documentos PDF. Um exemplo desse tipo é [speedata publisher](https://speedata.github.io/publisher/) que usa o LuaTeX puramente como motor de geração de PDF no seu fluxo de trabalho baseado em XML — não usa LaTeX de todo. De facto, o speedata publisher contém praticamente nenhum código TeX — perguntei [Patrick Gundlach](https://twitter.com/patrickgundlach), desenvolvedor do speedata publisher, que confirmou que, no total, ele usa cerca de três linhas de código TeX. As suas poderosas capacidades de composição tipográfica são concebidas e implementadas em código Lua, usando a API Lua do LuaTeX (um tópico que discutimos mais adiante neste artigo).

## Uma breve história pessoal: como descobri o LuaTeX pela primeira vez

Primeiro ouvi falar do LuaTeX no final de 2009/início de 2010, quando ainda estava em fase de lançamento beta intermédia (versão 0.50). Nessa altura eu procurava software baseado em TeX para compor as notas manuscritas resultantes dos meus esforços para aprender um pouco de árabe. Pesquisas no Google revelaram uma coleção de vídeos da conferência TUG 2009 ([agora no YouTube](https://www.youtube.com/playlist?list=PL2D4DD50DC9C0BA0E)) que incluía demonstrações de composição tipográfica árabe de altíssima qualidade (por meio do [pacote ConTeXt](http://wiki.contextgarden.net/Main_Page)). Esses vídeos também incluem uma palestra intitulada [O Projeto LuaTeX: a meio caminho da versão 1](https://youtu.be/AKv4po9PGW0).

O motor TeX usado para produzir aquela requintada composição tipográfica árabe era algo chamado “LuaTeX”. Na época eu trabalhava em publicação científica (física), mas embora estivesse plenamente familiarizado com TeX/LaTeX, nunca tinha ouvido falar do LuaTeX: fiquei intrigado e quis saber mais sobre esse novo motor TeX. Como o LuaTeX ainda estava em fase beta de desenvolvimento e passava por um desenvolvimento rápido, eu queria acompanhar as atualizações mais recentes, então a melhor opção (para mim) foi o caminho do “faça você mesmo”, construindo (compilando) o executável LuaTeX a partir do seu código-fonte. Além do programa executável LuaTeX, você também precisa de uma “instalação TeX” para fornecer o ambiente no qual executar o LuaTeX (por exemplo, texmf.cnf, pacotes macro, fontes etc.). Em vez de baixar e instalar a enorme [TeX Live](https://www.tug.org/texlive/) distribuição [documentado no meu blog pessoal](http://www.readytext.co.uk/?cat=30)). Cada nova versão do LuaTeX é acompanhada do seu Manual de Referência (por exemplo, para[a versão 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)) que documenta os recursos e funcionalidades mais recentes do software. No entanto, trata-se de um *manual de referência* e, necessariamente, bastante leve em explicações adequadas para o iniciante que deseja começar a usar este incrível motor TeX — pressupõe-se um certo grau de familiaridade com conceitos TeX de baixo nível. Dado que eu havia descoberto o LuaTeX numa fase relativamente inicial do seu desenvolvimento, material introdutório de qualidade era, naquela época, relativamente difícil de encontrar, por isso foi preciso explorar um pouco, experimentar (e alguma frustração…) antes que as peças começassem a encaixar. Escusado será dizer que os meus estudos de árabe chegaram a uma interrupção abrupta, enquanto eu me fascinava por este software incrível e, eventualmente, passei a escrever plugins LuaTeX [plugins para composição tipográfica de árabe](http://www.readytext.co.uk/?p=3143) em vez disso!

A minha própria “jornada com o LuaTeX” foi certamente muito não linear, mas, ao longo do caminho, proporcionou uma oportunidade de aprender sobre (Lua)TeX (e instalações TeX) “desde o básico”: o meu blogue abriga uma coleção eclética de [artigos](http://www.readytext.co.uk/?cat=3) baseados em vários tópicos que explorei e desenvolvi durante esse período. Esperemos que este artigo faça uso apropriado desse tempo e dessa experiência, ajudando outros a interessarem-se por começar a explorar as capacidades do LuaTeX. O LuaTeX continua a ser desenvolvido e, no momento em que escrevo, atingiu a versão 1.0.4, lançada com o TeX Live 2017. Os desenvolvedores são muito ativos e quaisquer bugs descobertos geralmente são corrigidos pouco depois de serem relatados — por exemplo, através da [lista de distribuição dev-luatex](https://mailman.ntg.nl/mailman/listinfo/dev-luatex) ou através do [rastreador de bugs online do LuaTeX](http://tracker.luatex.org/my_view_page.php). Muito antes de atingir a versão 1.0, o LuaTeX já era capaz de produção — embora, claro, fosse preciso aceitar que os recursos estavam em constante evolução e, ocasionalmente, mudanças podiam quebrar o seu código TeX existente. Hoje, o LuaTeX é, naturalmente, suportado pelas plataformas Overleaf e ShareLaTeX (como LuaLaTeX).

## TeX em um mundo em mudança: Novas tecnologias e fluxos de trabalho

Está claro que os motores TeX não operam num mundo tecnologicamente estático e, ocasionalmente, surgem inovações que são candidatas imediatas e óbvias a serem incluídas nos motores TeX — uma dessas inovações são as fontes variáveis OpenType, que discutimos brevemente abaixo. Embora haja pouca dúvida de que o software de composição tipográfica baseado em TeX é extraordinariamente versátil, os motores TeX agora operam num ecossistema de software rapidamente mutável e muito diverso — novos fluxos de trabalho acentuam a necessidade de integração e de flexibilidade para implementar uma ampla gama de soluções de documentos/composição tipográfica, das quais o TeX pode ser apenas um componente.

O TeX não precisa apenas permanecer relevante para os seus utilizadores atuais, mas também atrair novos, possibilitando soluções de criação de conteúdo que continuem úteis para as gerações que chegam — pessoas que talvez não queiram necessariamente usar o TeX como uma ferramenta autónoma, mas, talvez, como parte de um fluxo de trabalho global através de plataformas colaborativas online como o Overleaf.

Mesmo uma breve consulta de [tex.stackexchange](https://tex.stackexchange.com/) demonstra a enorme variedade de documentos e soluções que estão a ser produzidos e implementados com software baseado em TeX — frequentemente exibindo uma engenhosidade incrível à medida que as pessoas encontram cada vez mais casos de uso e tipos de conteúdo que desejam gerar. Além disso, a necessidade de fluxos de trabalho que possam processar marcação/conteúdo baseado em TeX para produzir saídas não-PDF (e não-DVI) nunca foi tão grande — como MathML/XML e HTML. Por exemplo, “converter” TeX para o [JATS XML](https://jats.nlm.nih.gov/) formato (há muito usado na publicação de revistas académicas) mas também, mais recentemente, o crescimento do epub usado na publicação de ebooks.

### Tecnologia de Fontes Variáveis — Os Tempos Estão a Mudar

Em 14 de setembro de 2016, a Microsoft, [a Google](https://opensource.googleblog.com/2016/09/introducing-opentype-font-variations.html), [a Adobe](https://blog.typekit.com/2016/09/14/variable-fonts-a-new-kind-of-font-for-flexible-design/) e a Apple anunciaram uma nova tecnologia de fontes: [fontes variáveis OpenType](https://medium.com/@tiro/https-medium-com-tiro-introducing-opentype-variable-fonts-12ba6cd2369). Não vamos explorar esta tecnologia em detalhe, mas basta dizer que especialistas em fontes altamente respeitados, como [Thomas Phinney](https://twitter.com/ThomasPhinney) e [John Hudson](https://twitter.com/TiroTypeworks) observaram ([no Twitter](https://twitter.com/ThomasPhinney/status/917087509342851072)) que a tecnologia de fontes variáveis está a ser adotada muito mais rapidamente do que muitas inovações de fontes anteriores — muito provavelmente impulsionada pelas necessidades dos designers web que exigem designs responsivos que se adaptem à miríade de tamanhos/resoluções de ecrã diferentes presentes em dispositivos móveis.

É evidente que as fontes variáveis OpenType são um desenvolvimento interessante e entusiasmante nas tecnologias de fontes, do qual os utilizadores de TeX sem dúvida poderiam beneficiar — de facto, esta questão tem inevitavelmente sido [levantada no tex.stackexchange](https://tex.stackexchange.com/questions/355104/tex-luatex-xetex-fontspec-support-for-opentype-variable-fonts) com o suporte do LuaTeX discutido na lista de distribuição do LuaTeX [lista de distribuição](https://www.tug.org/pipermail/luatex/2016-September/006204.html).

De passagem, vale a pena notar que a tecnologia de fontes baseada na criação de fontes “paramétricas” não é uma ideia inteiramente nova: o METAFONT de Knuth e as tecnologias Multiple Master da Adobe são, de certa forma, precursores iniciais, mesmo que os detalhes de implementação sejam bastante diferentes.

### Fontes variáveis: quando é que as queremos — agora?

Qualquer novo e útil padrão/especificação tecnológica precisa de tempo para “assentar” no seu ecossistema-alvo de desenvolvedores e implementadores — incluindo tempo para esclarecer quaisquer ambiguidades ou interpretações da própria redação da especificação. Os desenvolvedores têm de ler e compreender a documentação e transformá-la em software realmente funcional — o que, aqui, inclui criar as fontes e tecnologias para as usar: navegadores e motores de composição tipográfica compatíveis. Os desenvolvedores de TeX precisarão claramente de acesso a fontes variáveis de alta qualidade que possam ser usadas como “referências” fiáveis para implementar (programar) suporte para tecnologias de fontes variáveis.

A implementação de qualquer nova tecnologia no TeX, como as fontes variáveis, levanta a *potencial* necessidade de modificar os mecanismos internos dos motores TeX — claro, a necessidade de o fazer depende da natureza dessa tecnologia e, crucialmente, de que aspeto do comportamento do TeX está sujeito a mudança. Nem sempre é necessário modificar os próprios motores TeX, podendo apenas exigir alterações em software de suporte/auxiliar, incluindo quaisquer “componentes” (bibliotecas de código de terceiros) usados nesses programas. Internamente, os motores TeX são *diabolicamente* complexos — desenvolver uma compreensão do código-fonte do TeX suficiente para fazer modificações fiáveis requer considerável, e altamente especializada, perícia (da qual existe uma oferta muito limitada). Também é essencial que quaisquer modificações não afetem adversamente a estabilidade/compatibilidade a longo prazo dos motores TeX — o que é vital para a comunidade TeX e para aqueles que posteriormente processam os ficheiros (La)TeX de um autor: nomeadamente editoras académicas e serviços baseados na cloud como Overleaf e ShareLaTeX.

Muitos utilizadores de TeX provavelmente terão interesse em tirar partido das fontes variáveis; por exemplo, implementando novas possibilidades de design ou encontrando soluções para problemas difíceis de composição tipográfica. Assim, em certo sentido, há um dilema: utilizadores de TeX querendo acesso a uma nova tecnologia, mas a sua implementação depende de um recurso muito limitado: o número de desenvolvedores qualificados e capazes de a concretizar. A modificação do interior do TeX é difícil e, em geral, deve ser evitada sempre que possível, então haverá outra maneira de abordar a adição de (certas classes de) novas funcionalidades/capacidades ao TeX? Sim! e o LuaTeX seguiu esse caminho.

#### Experiências iniciais: fontes variáveis OpenType e LuaTeX

O design do LuaTeX permitiu uma experimentação rápida com a tecnologia de fontes variáveis. Já em abril de 2017, o formato TeX ConTeXt, que usa LuaTeX, tinha uma [versão beta](https://mailman.ntg.nl/pipermail/ntg-context/2017/088343.html) que implementava fontes variáveis OpenType. Isto foi possível porque o suporte de fontes do ConTeXt é construído em código Lua (e o ConTeXt tem o seu próprio fontloader escrito em Lua).

## LuaTeX: contexto e história

O LuaTeX é, em termos de TeX, “o novato na área”, apesar de estar em desenvolvimento ativo há mais de 10 anos. O site do LuaTeX [documenta](http://www.luatex.org/roadmap.html) que o LuaTeX começou a sua vida em 2005, com (creio eu) desenvolvimento ativo e sustentado a começar em 2006. Devido à sua complexidade inerente e à diligência de quem o construiu, o LuaTeX levou realmente 10 anos de desenvolvimento para atingir a versão 1.0, que foi [anunciada pelos seus desenvolvedores](https://mailman.ntg.nl/pipermail/dev-luatex/2016-September/005882.html) (Hans Hagen, Hartmut Henkel, Taco Hoekwater, Luigi Scarso) em 27 de setembro de 2016.

Nesse anúncio de lançamento há uma importante declaração de princípio:

> “O nosso principal objetivo é fornecer uma variante do TeX que permita extensões do utilizador sem necessidade de adaptar o funcionamento interno.”

Esta formulação encapsula perfeitamente a filosofia por trás do desenvolvimento do LuaTeX e aponta para uma via pela qual o software baseado em TeX pode enfrentar os desafios que já mencionámos: adotar novas tecnologias e permanecer relevante para novas gerações de utilizadores.

É agora tempo de abordar a segunda questão contida no subtítulo deste artigo: “o que o torna tão diferente”. Ao explorar o significado de “...permite extensões do utilizador sem necessidade de adaptar o funcionamento interno” podemos compreender melhor a essência do que o LuaTeX “traz para a mesa”.

## LuaTeX: Abrindo a “caixa preta” do TeX

O programa TeX original de Knuth é o ancestral comum de todos os motores TeX modernos em uso hoje e o LuaTeX é, na prática, o passo evolutivo mais recente: derivado do programa pdfTeX, mas com a adição de alguns componentes de software poderosos que trazem uma grande quantidade de funcionalidade extra. Quando Knuth escreveu a versão original do software TeX, ele também forneceu a linguagem TeX como forma de controlar e programar o seu comportamento de composição tipográfica: cerca de 320 comandos de baixo nível (primitivos) foram disponibilizados aos utilizadores e desenvolvedores de pacotes macro TeX. Esses comandos ofereciam diferentes graus de controlo ou influência sobre certos aspetos do comportamento de composição tipográfica do TeX, mas grande parte da funcionalidade interna, algoritmos, processos de tomada de decisão, dados e estruturas de dados do TeX permaneciam ocultos para o utilizador. Em rigor, o programa TeX de Knuth não era uma caixa totalmente “preta”, mas certamente uma tonalidade muito escura de cinzento — admite-se que o código-fonte foi disponibilizado, mas, para a grande maioria das pessoas, isso também é uma caixa preta de incompreensibilidade.

Referimo-nos aos processos internos do TeX como sendo algo de uma “caixa preta”; no entanto, o LuaTeX abre os seus mecanismos internos baseados em TeX, proporcionando aos utilizadores/desenvolvedores um acesso e controlo muito maiores sobre muitos dos processos antes ocultos que ocorrem no fundo do motor TeX. O LuaTeX também acrescenta muitos novos comandos primitivos que fornecem controlo sobre as novas funcionalidades.

### LuaTeX: Derivado do pdfTeX mas não usa o código do pdfTeX

Para ser exato, é importante notar que, embora tenhamos descrito o LuaTeX como derivado do pdfTeX, o LuaTeX não usa diretamente o código de programa original do pdfTeX. Um dos desenvolvedores do LuaTeX (Taco Hoekwater) empreendeu a tarefa verdadeiramente *hercúlea* de reescrever o núcleo do motor TeX do LuaTeX em código C limpo e moderno (CWEB).

#### Nota histórica

Em parte devido à idade do código-fonte original de TeX de Knuth — do qual derivam os seus descendentes modernos — modificá-lo para adaptar ou criar novos motores de composição tipográfica baseados em TeX é um processo complexo e tortuoso. Parte desse processo requer a conversão de código Pascal em código C — o que não está isento de um [certo grau de complexidade](http://www.readytext.co.uk/?p=2529). O código C resultante gerado automaticamente é extraordinariamente prolixo e muito difícil de ler ou entender. Claramente, ter o código do LuaTeX completamente reescrito contorna todo o processo de conversão de Pascal para C.

## Os blocos de construção do LuaTeX

Na introdução referimo-nos ao LuaTeX como um “conjunto de ferramentas” e descrevemo-lo como um “sistema de construção e engenharia de documentos”. Vimos que, no anúncio da versão 1.0 do LuaTeX, os seus desenvolvedores afirmaram:

> “O nosso principal objetivo é fornecer uma variante do TeX que permita extensões do utilizador sem necessidade de adaptar o funcionamento interno.”

É agora tempo de juntar estes fios e centrar as ideias nos detalhes do que tudo isto *na verdade significa* na prática.

### O quebra-cabeças do LuaTeX

Se olhássemos “debaixo do capô”, veríamos que o software LuaTeX, ou seja, o programa executável propriamente dito, é construído a partir de uma coleção de componentes de software que são combinados para fornecer a funcionalidade global do LuaTeX. Claro, isto não é novidade e a maior parte do software é construída assim. No entanto, o que torna o LuaTeX diferente de outros motores TeX é que esses componentes são combinados de forma a dar aos utilizadores muito maior acesso a muitos aspetos da funcionalidade interna do TeX: os algoritmos de composição tipográfica do TeX, os processos de tomada de decisão, os dados e as estruturas de dados. Esta abertura dos mecanismos internos do TeX permite aos utilizadores construir novas soluções de composição tipográfica sem a necessidade de modificar o próprio motor TeX.

### O Lua em LuaTeX: uma chave para a “caixa preta”

Lua é uma linguagem de script muito poderosa, mas fácil de aprender, que [tem origem no Brasil](https://www.lua.org/about.html)—foi criada em 1993 e ainda é ativamente desenvolvida. Um dos pontos fortes do Lua é o seu uso como linguagem de programação com a qual “colar” componentes de software díspares, permitindo utilizá-los através de uma linguagem de script simples mas versátil. O Lua desempenha um papel central na abertura do funcionamento interno do motor TeX LuaTeX, mas, para entender melhor como isso é conseguido, vale a pena fazer um pequeno desvio para discutir muito brevemente dois conceitos de programação:

* Interface de Programação de Aplicações (API);
* ligação de linguagem de programação.

Sinta-se à vontade para saltar esta secção se estiver confortável com esses conceitos. Nenhum dos tópicos será abordado em detalhe — não pretendemos rigor técnico estrito, mas sim fornecer apenas contexto suficiente para estar ciente destes conceitos: o seu significado e relevância para o LuaTeX.

### Interface de Programação de Aplicações (API)

Imagine que é um programador que escreveu algum código que outros utilizadores (outros programadores) podem achar útil, mas o seu código é complexo e você não quer que os utilizadores do seu código tenham de se preocupar com esses detalhes de baixo nível. Note que esses programadores/desenvolvedores estão a trabalhar com a mesma linguagem de programação que você usou para escrever o seu código. Além disso, suponha que tem planos para reescrever algumas partes do seu código — por exemplo, para o tornar mais rápido, exigir menos memória e assim por diante. Os utilizadores existentes do seu código não deveriam ter de se preocupar com isso: quaisquer alterações que planeie fazer não devem quebrar os seus programas. Então, qual é a solução?

A resposta está em algo chamado API: uma *Interface de Programação de Aplicações*. Em vez de exigir que os utilizadores (outros programadores) acedam aos detalhes de baixo nível do seu código — que podem mudar —, você fornece um conjunto específico de *funções* que outros programadores podem usar. Essas funções são uma *interface* para o seu código, através da qual outros desenvolvedores podem construir *aplicações* sem precisar de conhecimento íntimo do funcionamento interno do seu programa. De certa forma, pode pensar nisto como uma camada adicional que envolve o seu código e “isola” os utilizadores dos detalhes confusos e de baixo nível.

Desde que não altere essas funções (a interface), é livre para modificar e atualizar os detalhes de nível inferior do seu software sem afetar (quebrar) o trabalho daqueles que dependem do seu código para construir as suas aplicações: daí o termo Interface de Programação de Aplicações.

#### APIs: uma analogia com um pacote LaTeX

Quando usa comandos fornecidos por um pacote LaTeX, pode pensar nos comandos do pacote como uma forma de API. Como utilizador, não está necessariamente preocupado com a magia do TeX e LaTeX por trás desses comandos (ou seja, no código do pacote): tudo o que quer é tirar partido da funcionalidade que eles fornecem.

### Ligação de linguagem de programação

Vimos que os programadores que escrevem/publicam um conjunto de código útil (chamado uma *biblioteca*) podem fornecer uma chamada Interface de Programação de Aplicações (um conjunto de funções) através da qual outros programadores, usando a *mesma* linguagem de programação, podem utilizar essa biblioteca (coleção de código). Isto é ótimo quando ambos os lados (desenvolvedor da biblioteca e os seus utilizadores) usam a *mesma* linguagem de programação, mas o que acontece se programadores que usam uma *diferente* linguagem de programação também quiserem utilizar essa biblioteca? Por exemplo, pode escrever scripts usando a linguagem Lua, mas querer usar uma biblioteca escrita em, por exemplo, linguagens de programação como C/C++. De alguma forma, as duas linguagens de programação diferentes (Lua e C/C++) precisam da capacidade de “comunicar” uma com a outra. Uma solução para este problema é a chamada [ligação de linguagem](https://en.wikipedia.org/wiki/Language_binding).

Examinar os detalhes técnicos da ligação de linguagem está fora do âmbito deste artigo, por isso daremos um resumo conciso dos princípios gerais. Em essência, ao adicionar uma “camada” adicional de código adequada à biblioteca original, ela pode “comunicar” com outra linguagem de programação (como Lua): essa camada de código é chamada uma *ligação*. Ela permite que as duas linguagens interoperem através de uma API, pela qual programadores na segunda linguagem (como Lua) podem aceder às funcionalidades/serviços fornecidos pela biblioteca.

![Diagrama esquemático para mostrar o conceito de uma ligação de linguagem.](/files/ae69d8aa6f6de119281870863679a418f2f16687)

**Figura 1**: Diagrama esquemático para mostrar o conceito de uma ligação de linguagem: permitindo que um programa escrito em Lua use uma biblioteca externa escrita noutra linguagem de programação. É através do uso de ligações Lua que os componentes internos do LuaTeX, e assim grande parte da funcionalidade interna de composição tipográfica do LuaTeX, ficam disponíveis para os utilizadores desenvolverem soluções para problemas complexos de composição tipográfica.

## LuaTeX: duas opções de programação — TeX e Lua

Essencialmente, o LuaTeX é um motor TeX que suporta duas linguagens de programação: a linguagem tradicional baseada em TeX e a linguagem de script Lua. Naturalmente, pode usar ambas as linguagens no mesmo documento TeX ou, se preferir, continuar a compor através do caminho apenas TeX: por exemplo, através do pacote macro LaTeX (LuaLaTeX). TeX (ou LaTeX) não é uma linguagem de programação fácil de usar ou aprender, e relativamente poucas pessoas dominaram verdadeiramente as muitas idiossincrasias do TeX — os conceitos de [tokens](https://www.overleaf.com/blog/522-what-is-a-tex-token) e expansão são bastante estranhos às expectativas e experiências da maioria das pessoas em relação a uma linguagem de programação.

A adição de Lua abre a possibilidade de usar composição tipográfica baseada em TeX através de uma linguagem de programação muito mais acessível e convencional — como observado no início deste artigo, usando a API Lua você pode realizar [composição tipográfica sofisticada com praticamente nenhum código TeX](http://wiki.luatex.org/index.php/TeX_without_TeX).

### LuaTeX adiciona muitos novos primitivos

Todos os motores TeX fornecem centenas dos chamados comandos primitivos: os blocos de construção fundamentais da linguagem baseada em TeX suportada por cada motor de composição tipográfica individual. A versão original do TeX lançada por Donald Knuth fornecia aproximadamente 320 comandos, mas os motores TeX mais recentes (pdfTeX, XeTeX e LuaTeX) adicionaram cada um muitos novos primitivos para dar aos utilizadores acesso às funcionalidades e recursos adicionais de cada motor. O grande número de novos primitivos do LuaTeX está documentado no seu [Manual de Referência](https://www.tug.org/svn/texlive/tags/texlive-2017.1/Master/texmf-dist/doc/luatex/base/luatex.pdf?revision=44591\&view=co).

Entre os muitos novos primitivos introduzidos pelo LuaTeX está um chamado `\directlua{...}` que é a porta de entrada para o uso de código Lua: acedendo aos mecanismos internos do motor LuaTeX para construir ferramentas e soluções sofisticadas de composição tipográfica.

### \directlua{...}: a porta de entrada para a programação Lua

Como discutido, a linguagem de script Lua pode ser vista como fornecendo uma “camada” através da qual é possível aceder ao motor de composição tipográfica baseado em TeX do LuaTeX e à funcionalidade fornecida por muitos dos componentes a partir dos quais o LuaTeX é construído. A linguagem Lua é também o mecanismo que permite a extensibilidade do LuaTeX — através da capacidade do Lua de carregar bibliotecas de software/código externas especializadas.

Coletivamente, a interface Lua (conjunto de funções baseadas em Lua) fornecida pelo LuaTeX é referida como a sua *API Lua*: é a “ligação de comunicação” entre o motor/componentes internos do LuaTeX e o documento do utilizador.

### Um exemplo simples de \directlua{...}

Os seguintes *extremamente simples* exemplo nem sequer começa a arranhar a superfície da ponta do iceberg das possibilidades. No entanto, serve para demonstrar a ideia básica da interação entre a “forma TeX” e a “forma Lua” de aceder aos parâmetros do TeX.

Note que:

* `\hsize` é um primitivo TeX (comando) que define o valor de um parâmetro interno que determina a largura das linhas compostas — por exemplo, normalmente define-o para um valor adequado dentro de um `\vbox{...}`. `\hsize` é apenas um dos *muitas* parâmetros TeX a que você pode aceder e/ou modificar por código Lua.
* Aceder aos parâmetros TeX é apenas um *pequeno* aspeto da API Lua do LuaTeX: há muito mais!

```latex

\documentclass{article}
\begin{document}
\let\\\relax % redefinir o significado de \\ para evitar problemas de expansão
Aqui está o valor atual de {\ttfamily\string\hsize} (via \LaTeX):
\the\hsize\par
\directlua{
%Obter o valor atual de \hsize usando a API Lua
local hs=tex.hsize
% Use uma função da API Lua para imprimir algum
% código LaTeX e o valor de \hsize
tex.print("Aqui está o valor de {\\ttfamily\\string\\hsize}
relatado pelo código Lua (em pontos escalados): ")
tex.print(hs.."\\par")
% Definir um novo valor para \hsize usando a API Lua
tex.hsize="400pt" % ou use tex.hsize=400*65536 (em pontos escalados)
}%
% Depois de \directlua terminar, peça ao LaTeX
% que nos diga o novo valor de \hsize
Aqui está o valor de {\ttfamily\string\hsize} relatado
pelo \LaTeX{} depois de {\tt\string\directlua} ter terminado:
\the\hsize\par
\end{document}
```

Aqui está uma imagem que mostra o resultado da composição tipográfica do LuaTeX do código LaTeX (acima):

![Resultados da execução do LuaTeX](/files/48f6d630e2c4f496f10e744b84fe3b72d3884577)

Note que a “artimanha” TeX de `\let\\\relax` serve para evitar problemas causados pela “expansão” do código Lua pelo LuaTeX: um tópico que assinalamos brevemente abaixo.

### Usando código Lua

Existem duas opções principais para usar código Lua nos seus documentos TeX/LaTeX:

1. **Em linha**: Escrever código Lua diretamente no seu `.tex` documento (como no exemplo acima);
2. **Externo**: Guardar código Lua em ficheiros `.lua` de código e usar as facilidades do Lua para os carregar e executar.

A opção (1) é mais adequada para fragmentos mais curtos de código Lua. A opção (2) é usada para programas maiores ou bibliotecas de código Lua. Tem a vantagem distinta de permitir evitar questões delicadas envolvendo os chamados `\catcode` valores (que podem ser “bastante frustrantes”). A razão para estas `\catcode` questões é a “expansão” do código Lua antes de ser alimentado ao interpretador Lua incorporado do LuaTeX. Esta expansão pode ser difícil de entender, por isso a exploraremos mais adiante num artigo subsequente.

Naturalmente, existem pacotes LaTeX para ajudar a usar código Lua nos seus ficheiros .tex — por exemplo, pode usar o [pacote luacode](https://ctan.org/pkg/luacode?lang=en).

## Resumo e introdução da Parte 2 deste artigo

Os componentes de software a partir dos quais o LuaTeX é construído, juntamente com a linguagem de scripting Lua incorporada, oferecem uma combinação poderosa para criar soluções capazes de resolver uma ampla gama de problemas complexos de composição tipográfica — e de conceber fluxos de trabalho de produção de documentos que podem beneficiar de uma integração estreita com um motor de composição baseado em TeX. Em [A Parte 2 deste artigo](/latex/overleaf-learn-latex-pt/artigos-aprofundados/09-an-introduction-to-luatex-part-2-understanding-directlua.md) analisamos em profundidade o comando mais poderoso fornecido pelo LuaTeX: `\directlua`.

Até lá, boas LuaTeXadas!

## Agradecimentos

O autor está extremamente grato a [Luigi Scarso](https://twitter.com/luigi_scarso), um dos desenvolvedores do LuaTeX, por ter dedicado tempo a ler um rascunho deste artigo e por ter feito vários comentários e sugestões muito úteis. Quaisquer erros factuais remanescentes, ou omissões, são, naturalmente, da responsabilidade do autor. Além disso, gostaria de agradecer a [Patrick Gundlach](https://twitter.com/patrickgundlach), desenvolvedor de [speedata publisher](https://speedata.github.io/publisher/), pelo seu tempo a responder às minhas perguntas.


---

# 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/overleaf-learn-latex-pt/artigos-aprofundados/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.
