> 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/36-pandora-s-hbox-using-luatex-to-lift-the-lid-of-tex-boxes.md).

# A \hbox de Pandora: Usar LuaTeX para levantar a tampa das caixas TeX

## Introdução

Caixas e cola são dois conceitos-chave que fornecem a base para o modelo e as capacidades de composição tipográfica do TeX. A partir do material introdutório numa publicação anterior, [Caixas e Cola: Uma Introdução Breve, mas Visual, Usando LuaTeX](/latex/overleaf-learn-latex-pt/artigos-aprofundados/11-boxes-and-glue-a-brief-but-visual-introduction-using-luatex.md), este artigo extensamente ilustrado examina as caixas e a cola com mais detalhe. Também apresentamos um novo [projeto Overleaf](https://www.overleaf.com/latex/examples/exploring-the-structure-of-tex-boxes-with-luatex/pwdrypmtdbgs) baseado em LuaTeX que lhe permite explorar a estrutura interna profunda das caixas TeX — fornecendo perceções que o ajudarão a compreender verdadeiramente o seu comportamento. A criação do projeto Overleaf foi grandemente facilitada pelo trabalho de Patrick Gundlach, pelo que lhe prestamos [o nosso agradecimento](#credits-thanks-patrick).

## Porquê escolher LuaTeX?

Em primeiro lugar, vale a pena reafirmar a diferença entre LuaTeX e LuaLaTeX:

* LuaTeX é o nome de um motor de composição tipográfica baseado em TeX e executável;
* LuaLaTeX refere-se ao uso do pacote de macros LaTeX com o motor LuaTeX.

Esta distinção é extremamente importante porque, neste artigo, estamos a explorar as capacidades incorporadas do próprio motor LuaTeX, e não apenas a tirar partido das funcionalidades/comandos fornecidos pelo pacote de macros LaTeX.

Os leitores que não estejam certos da diferença entre um motor TeX e o pacote de macros LaTeX poderão querer ler um dos nossos artigos publicados anteriormente, [What’s in a Name: A Guide to the Many Flavours of TeX](/latex/overleaf-learn-latex-pt/artigos-aprofundados/55-what-s-in-a-name-a-guide-to-the-many-flavours-of-tex.md), que explica essas diferenças com algum detalhe. Esse mesmo artigo também discute “TeX” como linguagem de programação e o facto de os motores de composição tipográfica baseados em TeX (por exemplo, pdfTeX, XeTeX e LuaTeX) não só variarem nas suas funcionalidades e capacidades, mas também apresentarem variações na “variante” da linguagem TeX que suportam. Isto leva-nos à nossa escolha do LuaTeX. Para além de suportar uma linguagem de programação baseada em TeX, o LuaTeX também tem a linguagem de script Lua incorporada no seu interior — proporcionando acesso a uma linguagem de programação convencional, simples mas muito poderosa. Através do Lua, e da funcionalidade incorporada do LuaTeX, pode explorar e controlar as atividades de composição tipográfica do LuaTeX de formas que nenhum outro motor TeX oferece — e isto inclui a capacidade de inspecionar as estruturas internas das caixas TeX; daí que o LuaTeX seja a escolha ideal (e única) para este artigo e para o projeto Overleaf associado.

### pdfTeX/XeTeX vs LuaTeX: em imagens

Os seguintes *esquemas* destinam-se a destacar uma comparação importante entre o design do pdfTeX/XeTeX e do LuaTeX. Tanto o pdfTeX como o XeTeX permitem, naturalmente, que os utilizadores escrevam código TeX que pode influenciar o comportamento da composição tipográfica; no entanto, as estruturas internas mais profundas contidas nesses motores TeX, e os dados de baixo nível construídos durante o processo de composição, são na sua maioria inacessíveis aos comandos e macros do utilizador. Nesse sentido, são *relativamente* sistemas fechados quando comparados com o LuaTeX.

#### pdfTeX/XeTeX

![{{{alt}}}](/files/cc4179712f23a0d36ddae7d662a0f799c3a2e572)

#### LuaTeX

O LuaTeX introduz um novo comando primitivo chamado `\directlua{...}` através do qual pode escrever código que não só dá acesso total à linguagem Lua, como também lhe permite estender as capacidades do LuaTeX escrevendo plug-ins usando linguagens como C e C++. No Windows, esses plug-ins são chamados *Bibliotecas de Ligação Dinâmica* (.DLL); no Linux são conhecidas como *Bibliotecas de Objetos Partilhados* (.so). No entanto, o verdadeiro poder do LuaTeX deriva de um enorme conjunto de funções Lua incorporadas que fornecem acesso ao interior do LuaTeX — permitindo um controlo e uma programação extremamente sofisticados da composição tipográfica baseada em TeX. Um conjunto dessas funções é conhecido como API (Application Programming Interface, Interface de Programação de Aplicações) e é através da API do LuaTeX que utiliza programas Lua para comunicar com o seu motor de composição tipográfica baseado em TeX e com as suas estruturas de dados.

![{{{alt}}}](/files/04f98616e6cd7a03dd7919c261250c8d66c8147b)

Com o `\directlua{...}` comando do LuaTeX pode, por exemplo, aceder a estruturas de dados internas de baixo nível do TeX, escondidas da vista noutros motores TeX. Além disso, pode usar scripts Lua para realizar todo o tipo de cálculos de programação, manipulação de cadeias de texto, etc., e devolver os resultados ao TeX: as possibilidades são quase infinitas. No entanto, este artigo não pretende ser uma exposição detalhada ou um tutorial sobre LuaTeX — embora seja tentador dar exemplos que transmitam a incrível versatilidade deste motor TeX extraordinariamente poderoso.

## Caixas e cola: Um breve lembrete

Como apresentado no artigo [Caixas e Cola: Uma Introdução Breve, mas Visual, Usando LuaTeX](https://www.overleaf.com/blog/511-boxes-and-glue-a-brief-but-visual-introduction-using-luatex) caixas e cola são dois conceitos-chave que sustentam as capacidades de composição tipográfica do TeX. O diagrama seguinte é apresentado como um breve lembrete do comportamento dos tipos de caixas horizontal e vertical do TeX. Nota: as caixas horizontais podem, naturalmente, conter texto composto em línguas da direita para a esquerda, como o árabe ou o hebraico, o que significa que a direção de crescimento da caixa pode ser oposta à mostrada para a caixa horizontal no diagrama abaixo.

![{{{alt}}}](/files/33b13bc570660be0dcf4182fd51a23890afc99e5)

### Primitivos TeX para construção de caixas

Hoje em dia, a maioria das pessoas prepara os seus documentos TeX usando o pacote de macros LaTeX, que foi concebido para fornecer comandos que isolam os utilizadores de grande parte da linguagem de baixo nível do TeX — os seus chamados *primitivos*—os comandos principais incorporados nos motores TeX (ver o artigo [What’s in a Name: A Guide to the Many Flavours of TeX](/latex/overleaf-learn-latex-pt/artigos-aprofundados/55-what-s-in-a-name-a-guide-to-the-many-flavours-of-tex.md) para uma discussão sobre os primitivos TeX). A coleção de macros LaTeX fornece uma variedade de macros para criação e armazenamento (gravação) de caixas, mas se remover todo o código de macros verá que existem apenas 4 comandos primitivos de baixo nível para construção de caixas:

Para criar listas horizontais:

* \hbox{...}

Para criar e empilhar listas verticais:

* \vbox{...}
* \vtop{...}
* \vcenter{...}

Não vamos explicar como usar todos estes comandos de caixa porque há muitos exemplos e tutoriais noutros locais da web ou em livros de TeX/LaTeX — mas vamos analisar de que forma as caixas são representadas e armazenadas dentro das estruturas de dados do TeX.

### Cola: espaçamento flexível

A cola é, na prática, uma forma de espaçamento usada pelo TeX para espaçar/posicionar itens horizontal ou verticalmente. Como utilizadores do TeX, podemos instruir o TeX a inserir alguma cola de tamanho fixo ou podemos usar cola flexível — com tanta flexibilidade quanto necessitarmos, seja para esticar ou encolher consoante os nossos requisitos. Um dos comandos do TeX para criar cola para espaçamento horizontal chama-se `\hskip` que assume a forma

`**\hskip** <largura natural> **plus** <quantidade para esticar> **minus** <quantidade para encolher>`

`**plus**` e `**minus**` são palavras-chave do TeX, mas não precisa de as usar para toda a cola. Se `**plus**` ou `**minus**` estiverem ausentes então o correspondente `<quantidade para esticar>` ou `<quantidade para encolher>` é assumido como zero. Por exemplo, `\hskip 3pt` insere uma cola de largura fixa sem componente de estiramento ou encolhimento.

Por agora, pense em `<quantidade para esticar>` e `<quantidade para encolher>` como as nossas *recomendações* ao TeX porque a quantidade exata de estiramento ou encolhimento será calculada pelo TeX.

Para ajudar com estas ideias, aqui está um diagrama que representa a cola como uma mola. A `<largura natural>` é o comprimento da mola quando não há tensão (estiramento) nem compressão (encolhimento). As `<quantidade para esticar>` e `<quantidade para encolher>` são mostradas relativamente ao comprimento natural da mola.

![{{{alt}}}](/files/24485f75e871bc648276b5eedf1562f3297c9118)

#### Um exemplo de \hbox

Suponhamos que queremos criar uma `\hbox{...}` que contenha apenas as letras A, B, C e D e precisamos que esta caixa tenha 100pt (100 pontos TeX) de largura. Além disso, é seguro assumir que a largura total desses quatro caracteres é muito inferior a 100pt, indicando que o TeX precisa de alguma forma de preencher o espaço restante dentro da caixa: vamos usar alguma cola para isso. No entanto, como não conhecemos a quantidade exata de cola necessária para preencher a caixa, é aconselhável adicionar algumas colas flexíveis e deixar que o TeX trate do cálculo da quantidade de espaço que essas colas precisam de ocupar. No seguinte excerto de código, note a utilização de “%” para suprimir os espaços entre palavras resultantes dos caracteres de fim de linha.

```
\hbox to100pt{%
A\hskip4pt plus3pt minus 2pt B%
\hskip 0pt plus 2fil C%
\hskip 0pt plus 2fill D%
\hskip 0pt plus 3fill}
```

A caixa resultante tem este aspeto (ampliada para maior clareza):

![{{{alt}}}](/files/2ce3bef407beb9b8983aa6bef653ef0067aca089)

Este `\hbox` é sobreposta com caixas tracejadas (a vermelho) para indicar a largura dos caracteres (tal como o TeX os vê). Para efeitos de composição, os caracteres são considerados pequenas caixas e a quantidade de cola necessária para preencher esta `\hbox`é determinada (calculada) tendo em conta as larguras de cada caractere.

Acontece que o TeX não esticou nem encolheu a cola entre A e B (definida para 4pt) e não há cola entre B e C (definida para 0pt). No entanto, a cola entre C e D e a cola entre D e o fim da caixa esticaram ambas consideravelmente porque essas colas têm o componente de estiramento mais flexível — na prática, essas colas absorveram todo o estiramento necessário para preencher a caixa.

## De volta ao LuateX

Até agora explorámos caixas e cola e vimos que o LuaTeX permite o acesso a estruturas internas do TeX escondidas da vista no pdfTeX e no XeTeX. É altura de um exemplo para tornar isto mais explícito, mas, primeiro, precisamos de nos familiarizar brevemente com a forma como o TeX armazena caixas na sua memória — vamos começar com uma analogia.

### Como o TeX armazena caixas na memória: uma analogia

Suponha que, por alguma razão, precisava de criar um modelo de dados que descreva uma caixa física. Que dados escolheria para fornecer essa descrição? Uma abordagem possível seria dividir a informação em duas partes: dados sobre a própria caixa física e dados que fornecem uma lista do conteúdo da caixa. Assim, o nosso modelo simples poderia ser algo como isto:

1. Dados sobre a caixa física (“metadados”):

* largura
* altura
* profundidade
* peso
* cor
* tipo (madeira, plástico, cartão)

3. Dados sobre o conteúdo da caixa: alguma forma de lista que descreve os itens que ela contém — provavelmente listados sem qualquer ordem em particular.

E há uma analogia muito próxima com a forma como o TeX armazena caixas.

### Como o TeX armazena caixas na memória: hlists e vlists

Internamente, o TeX cria “contentores” chamados *hlists* (listas horizontais) e *vlists* (listas verticais), que representam hboxes e vboxes, respetivamente. Estes objetos hlist/vlist fornecem um conjunto de “metadados” sobre a caixa, além de darem acesso à lista de objetos que a caixa realmente contém — essa lista chama-se uma *lista de nós*. Ao contrário de uma caixa física, onde pode colocar objetos no interior por qualquer ordem, para o TeX a ordem do conteúdo da caixa é extremamente importante — são itens para serem compostos. Se tiver alguma experiência em programação ou ciência da computação, não ficará surpreendido ao saber que os objetos dentro de uma caixa TeX são armazenados, e a sua ordem de criação é preservada, usando uma chamada [lista duplamente ligada](https://en.wikipedia.org/wiki/Doubly_linked_list). Não vamos discutir listas ligadas com mais detalhe porque a web está repleta de tutoriais, exemplos e explicações.

O conceito de nós e listas de nós é um aspeto fundamental de como o TeX funciona, mas para os fins deste artigo daremos apenas uma breve descrição. Os nós são, em essência, uma espécie de “mini contentor” e (a partir do LuaTeX 1.04) existem cerca de 50 tipos diferentes de nó: refletindo os tipos de dados internos e os componentes que o LuaTeX usa para a composição tipográfica. Por exemplo, existem nós para representar: glifos (resultantes de “caracteres”), cola, traços horizontais/verticais, penalidades, “whatsits”, kerns e assim por diante. Todo o material composto acabará, eventualmente, por se tornar parte de uma enorme lista de nós e o LuaTeX dá-lhe acesso direto a essas estruturas de dados internas. O LuaTeX também lhe permite adicionar, editar, alterar ou criar listas de nós, de modo que, por exemplo, pode criar caixas diretamente dentro de código Lua sem ter de usar qualquer código TeX. No entanto, escrever sobre isso fica para outro dia.

### Um exemplo simples de \directlua{...} em ação

O exemplo seguinte cria uma `\hbox` e guarda-a no registo de caixa 0. Em seguida, comunicamos a largura da caixa usando código TeX tradicional e obtemos a mesma informação usando um segundo método através de `\directlua{}`. Aqui, executamos um pequeno script Lua que acede à área de armazenamento interno de caixas do TeX para obter a largura da caixa — naturalmente, os dois valores são idênticos: 2412092sp (sp=scaled point: 65536sp = 1 ponto TeX). Em última análise, neste exemplo extremamente simples, o código TeX e o código Lua examinam ambos as mesmas estruturas de dados internas para obter a largura da caixa, mas é através do acesso direto que o LuaTeX abre a porta a uma riqueza de informação e de controlo que não está disponível noutros motores.

![{{{alt}}}](/files/80b5e4c3253d7cd8285793fa1dd0809c4d5ef954)

```latex
\documentclass{article}
\begin{document}
\setbox0=\hbox{A\hskip 5pt B\hskip 10pt C}
\fontsize{18}{22}\selectfont
\noindent Usando código \TeX{}, a caixa 0 tem largura \number\wd0\relax \space sp\par
\noindent Também podemos usar Lua e chamar uma das funções do Lua\TeX para obter a mesma
informação.\vskip10mm
\noindent A partir do código Lua, a caixa 0 tem largura
\directlua{
local boxwidth = tex.box[0].width
tex.print(boxwidth.." sp")
} que, naturalmente, é idêntica ao valor obtido a partir do código \TeX{}.
\end{document}
```

## Juntando tudo: Um projeto Overleaf

Observámos que, internamente, o TeX representa as caixas como “contentores” chamados hlists/vlists, que guardam “metadados” sobre a caixa e fornecem acesso à lista de componentes a partir da qual a caixa é construída. Usando LuaTeX pode aceder aos “metadados” da caixa e à lista de itens contidos numa caixa TeX: glifos, cola, penalidades, outras caixas, e assim por diante. Usando scripts Lua, é possível examinar uma caixa residente na memória do TeX e desenhar uma representação detalhada do que essa caixa contém. Uma representação adequada de uma caixa TeX e do seu conteúdo é obtida usando *gráficos de nós* e preparámos um [projeto Overleaf](https://www.overleaf.com/latex/examples/exploring-the-structure-of-tex-boxes-with-luatex/pwdrypmtdbgs) que faz isso aproveitando um excelente script Lua escrito por Patrick Gundlach (ver créditos). Não vamos descrever os processos detalhados necessários para examinar caixas e gerar gráficos de nós — exceto para notar que qualquer programa/script que processe caixas TeX tem de ser *recursivo* porque as caixas podem ser aninhadas: isto é, pode ter hboxes dentro de vboxes, dentro de hboxes… combinando todos os tipos de caixa até um nível muito profundo de aninhamento.

![{{{alt}}}](/files/fa988c5e545ac8ad142e6cc511292196248ac190)

### O que é que o projeto fornece?

Implementa apenas 1 comando chamado `\dobox{box command}`, por exemplo:

```latex
\dobox{\hbox to100pt{%
A\hskip4pt plus3pt minus 2pt
B\hskip 0pt plus 2fil
C\hskip 0pt plus 2fill
D\hskip 0pt plus 3fill}}
```

O `\dobox{...}` comando executa várias tarefas:

1. dentro do seu documento, compõe o código TeX literal da sua caixa;
2. gera um gráfico SVG da caixa TeX — pode incorporá-lo numa página web (como fizemos nesta publicação do blogue);
3. gera um gráfico SVG da lista de nós — que também pode incorporar em páginas web (como fizemos nesta publicação do blogue);
4. produz um gráfico PDF da lista de nós que é depois importado para o documento PDF principal produzido pelo projeto.

Os gráficos de nós podem tornar-se extremamente grandes muito rapidamente devido à enorme quantidade de dados que o LuaTeX precisa de armazenar para representar caixas TeX complexas — como a página que está a ser construída atualmente, ou matemática composta. Para listas de nós maiores, o gráfico PDF importado pode ser cortado pela margem da página do seu documento — se quiser ver um gráfico de nós grande, pode descarregar um ficheiro ZIP do projeto e extrair o gráfico PDF de interesse. Ao descarregar o ficheiro ZIP do projeto, certifique-se de escolher “Ficheiros de entrada e saída” a partir da lista suspensa:

![{{{alt}}}](/files/7b65bb6035bc0bf2fc31771cc94d48c0a2930d0e)

### Gráficos do projeto Overleaf: Uma breve descrição

Antes de mostrarmos alguns exemplos, vale a pena fazer algumas observações sobre os gráficos produzidos pelo projeto Overleaf — vamos usar o mesmo `\hbox` exemplo mencionado anteriormente no artigo. Aqui, ele está encapsulado no `\dobox{...}` comando:

```latex
\dobox{\hbox to100pt{%
A\hskip4pt plus3pt minus 2pt
B\hskip 0pt plus 2fil
C\hskip 0pt plus 2fill
D\hskip 0pt plus 3fill}}
```

Aqui está a `\hbox` produzida pelo TeX — para maior clareza, a caixa foi ampliada, mas a moldura está incluída nos gráficos produzidos pelo projeto Overleaf.

![{{{alt}}}](/files/e464006a0b73cf6201bf9c9a5b23fcf33598e05b)

Aqui está um diagrama SVG *anotado* da lista de nós que representa a caixa acima — as anotações foram adicionadas para destacar os “metadados” da caixa e a lista de objetos que contém: essas anotações não estão presentes nos gráficos produzidos pelo projeto Overleaf.

[![{{{alt}}}](/files/53af061b157d9b550b1817ccaa612e6c416fa129)](https://www.filepicker.io/api/file/ZSwIylUR66eFYPMo0suX)

Se olhar para a secção de “metadados” poderá observar alguns parâmetros desconhecidos:

* `glue_set`
* `glue_sign`
* `glue_order`

Estes parâmetros são as definições usadas pelo TeX para calcular quanto a cola tem de esticar ou encolher dentro desta caixa e são apenas um exemplo de dados que pode obter facilmente via LuaTeX, mas não com outros motores TeX. Note que os nós de cola contidos nos componentes da caixa *mantêm* os valores originais de cola que introduzimos para criar a caixa. Isto é essencial porque o TeX fornece os comandos `\unhbox`, `\unvbox`, `\unhcopy`, `\unvcopy` que “desencaixam” o conteúdo da caixa e o devolvem ao fluxo de entrada para voltar a participar em operações de composição tipográfica. Só quando o TeX finalmente produz (envia) a caixa para um ficheiro PDF ou DVI é que `glue_set`, `glue_sign` e `glue_order` são aplicados a qualquer cola contida na caixa — para calcular a quantidade real de estiramento ou encolhimento necessária para posicionar os componentes dentro da caixa e depois gerar os dados PDF ou os opcodes DVI apropriados.

Outro parâmetro listado nos “metadados” é `shift`: este é o valor do deslocamento da caixa resultante da aplicação dos comandos TeX:

* `\raise`, `\lower` (aplicado a um `\hbox`);
* `\moveleft`, `\moveright` (aplicado a uma `\vbox`).

No nosso exemplo, `shift` é 0pt porque não deslocámos a `\hbox` da sua posição natural.

O [projeto Overleaf](https://www.overleaf.com/latex/examples/exploring-the-structure-of-tex-boxes-with-luatex/pwdrypmtdbgs) também produz diagramas de gráficos de nós em formato PDF: aqui está uma ligação para descarregar uma [versão em ficheiro PDF](https://www.filepicker.io/api/file/bezigXESC2FSasvjoh8A) do gráfico de nós acima.

### Como é que o projeto Overleaf cria esses gráficos?

O projeto Overleaf tira partido da capacidade de executar ferramentas de software e utilitários instalados nos servidores do Overleaf — ver [esta publicação do blogue](/latex/overleaf-learn-latex-pt/artigos-aprofundados/52-using-luatex-to-run-tools-and-utilities-installed-on-overleaf-s-servers.md) para mais detalhes e um projeto de exemplo. Para produzir um gráfico SVG representando uma caixa TeX, o código TeX da caixa é escrito num pequeno ficheiro que é depois composto com pdfTeX para gerar um ficheiro DVI — note que o programa pdfTeX é executado pelo LuaTeX através da օգտագործação de algumas linhas de script Lua. Esse ficheiro DVI é convertido, em tempo real, para SVG usando o `dvisvgm` utilitário — que vem com a distribuição TeX Live instalada nos servidores do Overleaf. `dvisvgm` é executado com a opção de linha de comandos `-n` para garantir que qualquer texto composto é convertido em linhas/curvas, de modo que a renderização correta do ficheiro SVG não dependa de tipos de letra TeX instalados.

Para criar os gráficos de nós usamos um script Lua chamado `hiviznodelist.lua` que se baseia no trabalho de Patrick Gundlach. Esse script escreve um chamado `.gv` (Graphviz), que é um ficheiro de texto contendo um gráfico de nós descrito na linguagem `dot` . O `.gv` ficheiro é processado por um programa utilitário chamado `dot` que produz um diagrama de nós nos formatos de ficheiro PDF e SVG.

### Exemplos do projeto

Aqui estão alguns exemplos adicionais com gráficos SVG produzidos usando o projeto Overleaf. Caixas contendo muito texto (por exemplo, numa \vbox), ou matemática complexa, produzirão gráficos de nós enormes — se explorar o projeto Overleaf, é aconselhável não usar caixas desnecessariamente complexas para demonstrar as funcionalidades que lhe interessam.

#### \vbox to 25pt{A}

Este exemplo demonstra o efeito de colocar texto diretamente numa `\vbox`: note que a estrutura de nós é bastante complexa, mesmo para uma caixa tão simples. A razão desta complexidade é que o texto colocado diretamente numa `\vbox` faz com que o TeX realize a quebra de linha. Pode ver que o `\vbox` tem 345pt de largura: o valor de `\hsize` na altura em que esta caixa foi criada. Note também que o caractere “A” está contido numa `hlist` que também tem 345 pontos de largura, e observe a grande penalidade (10000) juntamente com `\parfillskip` e `\rightskip` colas no fim do conteúdo da caixa. Essa penalidade e os dois itens de cola são inseridos pelas atividades de quebra de linha do TeX. Se olhar para o `glue_set` valor da linha do parágrafo (`hlist`) que contém a letra “A” verá que é extremamente grande (322.500000): porquê? Porque a linha do parágrafo tem 345pt de largura, mas contém apenas um `\parindent` e a letra “A”: o espaço restante tem de ser preenchido pela `\parfillskip` cola, que tem de esticar uma distância considerável para preencher o espaço restante na linha.

![{{{alt}}}](/files/7640750fbefe7dd7851d1703d0b26c9a4593ae34)

[![{{{alt}}}](/files/7b49a690b026cc9d995b5a830683b6e1d93f6b41)](https://www.filepicker.io/api/file/pVtHsNGSQ4m09vBZuOpQ)

[Descarregar ficheiro PDF](https://www.filepicker.io/api/file/nBS0uDs2QjqKCKljAm7r)

#### \vbox to 25pt{\hbox{A}}

É muito instrutivo comparar este exemplo com o anterior. Aqui, não só o gráfico de nós é consideravelmente menor, como também a largura da `\vbox` é apenas 7.50002pt: a mesma largura que o caractere “A”. A razão é que o “A” foi envolvido numa `\hbox` o que impede a `\vbox` de desencadear o TeX para realizar a quebra de linha — uma característica importante das caixas criadas com `\vbox`.

![{{{alt}}}](/files/06813afc27281480e0b93b33654f4a6df83ee24c)

[![{{{alt}}}](/files/faa2a42c20b928ea4d05e4565ef99c2c0da1a654)](https://www.filepicker.io/api/file/LHepknjnRGOVEdghW4qH)

[Descarregar ficheiro PDF](https://www.filepicker.io/api/file/Yk3uCCQR5ao8Yd3TJCdE)

#### Matemática simples: \hbox{$$\displaystyle \int f(x) dx$$}, caixa complexa!

Este exemplo demonstra que mesmo matemática composta muito simples cria uma estrutura de caixa detalhada: a composição de matemática produz *extremamente* estruturas de dados complexas dentro do TeX!

![{{{alt}}}](/files/43204d0bf33bfa8ed0488d33418fe761a4394f81)

[![{{{alt}}}](/files/57213f7e9e254d64c61ad01e3ff9af06d0d63582)](https://www.filepicker.io/api/file/oVFNNvCqT0eZP0qS2odk)

[Descarregar ficheiro PDF](https://www.filepicker.io/api/file/D5TepsdaSdeYZvkuSEJt)

## Créditos: obrigado, Patrick!

O nosso agradecimento a [Patrick Gundlach](https://twitter.com/patrickgundlach) que concedeu ao Overleaf permissão para usar e distribuir uma versão modificada do seu script Lua, `viznodelist.lua`, que processa caixas TeX e produz um ficheiro (na linguagem `dot` ) que pode ser processado para desenhar um gráfico de nós. O projeto Overleaf contém um script Lua chamado `hiviznodelist.lua`—uma versão renomeada e modificada do código original de Patrick, que está disponível no [Github](http://gist.github.com/556247). Patrick criou um sistema de composição tipográfica baseado em LuaTeX e de código aberto chamado [speedata Publisher](https://speedata.github.io/publisher/index.html) que pode descarregar e usar gratuitamente — também estão disponíveis opções de suporte comercial.


---

# 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/36-pandora-s-hbox-using-luatex-to-lift-the-lid-of-tex-boxes.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.
