> 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/24-how-tex-calculates-glue-settings-in-an-hbox.md).

# Como o TeX calcula as definições de cola num \hbox

Este é o terceiro e conclusivo artigo de uma série que analisa $$\mathrm \TeX$$ caixas e cola. O primeiro post [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) apresentou os conceitos de caixas e cola e foi seguido por [A \hbox de Pandora: Usando LuaTeX para levantar a tampa das caixas TeX](/latex/overleaf-learn-latex-pt/artigos-aprofundados/36-pandora-s-hbox-using-luatex-to-lift-the-lid-of-tex-boxes.md) que apresentou um projeto do Overleaf baseado em [$$\text{Lua}\mathrm\TeX$$baseado em um projeto do Overleaf](https://www.overleaf.com/latex/examples/exploring-the-structure-of-tex-boxes-with-luatex/pwdrypmtdbgs) para explorar as estruturas mais profundas de $$\mathrm \TeX$$ caixas por meio do uso de grafos de nós. Nesta parte final, fazemos uma “imersão profunda” na mecânica de como $$\mathrm \TeX$$ calcula os valores da cola em uma `\hbox`: um processo chamado *ajuste da cola*. Fazemos uso extensivo de grafos de nós (apresentados no [A \hbox de Pandora: Usando LuaTeX para levantar a tampa das caixas TeX](/latex/overleaf-learn-latex-pt/artigos-aprofundados/36-pandora-s-hbox-using-luatex-to-lift-the-lid-of-tex-boxes.md) nesta série) e mostramos como usar e interpretar alguns dos dados que eles fornecem: `glue_set`, `glue_sign` e `glue_order`.

Apresentamos um exemplo totalmente resolvido de cálculos de cola para uma `\hbox` e cobrimos muitos detalhes; no entanto, pode haver circunstâncias e considerações adicionais que não temos espaço para abordar aqui, e o leitor interessado é remetido à página 77 de $$\text{The } \mathrm \TeX \text{book}$$.

## O desafio

Suponhamos que temos uma `\hbox` como esta:

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

Aqui está como esta caixa se parece — para clareza, mostrada ampliada e com uma borda:

![caixa](/files/3a320d2e3419713f9f00cd07510cc04595e6f000)

A questão é: qual é o valor final, em $$\mathrm \TeX$$ pontos, do espaço (cola) entre os seguintes itens:

* A e B
* B e C
* C e D
* D e o fim da caixa

isto é, queremos calcular os valores de $$\mathrm{g}*{1}, \mathrm{g}*{2}, \mathrm{g}*{3} \text{ and } \mathrm{g}*{4}:$$

![cola](/files/294d4cad88b0f2125c1540b49bb61e403cd99dbc)

Aqui está um grafo de nós que representa a caixa acima. De particular interesse são três valores contidos na seção “metadados”:

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

![grafo de nós](/files/b32c2c458562ab6dbd98fefb1752ec52dcc8a733)

É importante observar que um determinado conjunto de valores para `glue_set`, `glue_sign` e `glue_order` afeta apenas as colas dentro da caixa de nível superior: não afeta as colas dentro de *aninhadas* caixas: cada caixa aninhada (objeto hlist ou vlist) tem seus próprios valores para esses três parâmetros. Aqui está um exemplo de uma `\hbox` aninhada dentro de uma externa `\hbox`. Neste exemplo, você pode ver claramente os diferentes valores de `glue_set`—é claro, a caixa aninhada também pode ter valores diferentes para `glue_sign` e `glue_order`.

```latex
\hbox to 75pt{\hfill ABC\hbox to15pt{\hfill D}}
```

![grafo de nós](/files/d768bc0f840ee6ae21fcbee330b558a5efc4cbce)

## Tipos de cola, infinitos e ordens: um resumo

$$\mathrm \TeX$$ fornece vários comandos primitivos relacionados à cola, incluindo:

* cola horizontal: `\hskip`, `\hfil`, `\hfill`, `\hfilneg`, `\hss`;
* cola vertical:`\vskip`, `\vfil`, `\vfill`, `\vfilneg`, `\vss`;

juntamente com `\mskip` para inserir cola em expressões matemáticas.

Um item de cola é definido por um conjunto de três valores:

* **largura natural**: quanto espaço ocupa se você não o esticar nem encolher;
* **componente de estiramento**: em quanto a cola pode se esticar;
* **componente de encolhimento**: em quanto a cola pode encolher.

O que vamos considerar é o uso de cola dentro de uma `\hbox{...}` e os cálculos $$\mathrm \TeX$$ que o usa para determinar quanto espaço a cola acabará ocupando. O comando que usaremos para criar alguma *horizontal* cola é `\hskip`, que tem a forma:

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

Para *vertical* cola que você usaria `**\vskip** *<largura natural>* **plus** *<quantidade a esticar>* **minus** *<quantidade a encolher>*`.

Por exemplo, alguma cola horizontal típica seria expressa como `\hskip 3pt plus 2pt minus 1pt`. Você também pode usar outras unidades físicas:

* `\hskip 3mm plus 2mm minus 1mm`
* `\hskip 3in plus 2in minus 1in`
* `\hskip 1in plus 3cm minus 20mm`

## $$\mathrm \TeX$$ cola e unidades de “infinidade”

Para o componente de encolhimento ou estiramento da cola $$\mathrm \TeX$$ introduz outro tipo de unidade: as chamadas “infinidades”: $$\text{fil}$$, $$\text{fill}$$ e $$\text{filll}$$. Esses três “níveis de infinito” são tais que, quando listados em sequência, cada um é “mais infinito” que o anterior:

$$\text{fil} < \text{fill} < \text{filll}$$

Talvez “infinidades” seja um nome um pouco confuso para essas unidades — pode ser útil também pensá-las como diferentes níveis de *prioridade*, porque, no fim, elas ajudam a determinar quais colas realmente participam do processo de estiramento ou encolhimento. Ao ter cola com um componente “infinito” de estiramento ou encolhimento, $$\mathrm \TeX$$ permite criar cola que pode se esticar ou encolher pela quantidade desejada. Observe que, para colas finitas, $$\mathrm \TeX$$ restringirá a quantidade pela qual tais colas podem encolher. Um exemplo de cola “infinita” é

`\hskip 3pt plus 2fil minus 1fill`

Observe que não podemos escrever, por exemplo, `\hskip 1fil` porque $$\mathrm \TeX$$ emitirá um erro com a mensagem `Unidade de medida inválida (pt inserido)`. Neste ponto, esses “níveis de infinito” podem parecer muito estranhos, mas, por enquanto, apenas aceite-os como fato e logo veremos como $$\mathrm \TeX$$ usa essas infinidades ao realizar os cálculos de cola.

### Níveis de infinito (“ordem da cola”)

Internamente, quando $$\mathrm \TeX$$ realiza seus cálculos de cola, considera que cada nível de infinito é uma “ordem de cola” variando de 0 a 3, em que a ordem 0 é para cola com dimensões físicas como bp, pt, mm e assim por diante. No entanto, com $$\text{Lua}\mathrm\TeX$$ há uma pequena diferença porque ele na verdade tem um tipo adicional (ordem) de infinito não presente em muitos outros $$\mathrm \TeX$$ motores: $$\text{fi}$$ (veja a explicação abaixo). Se você ler $$\text{The } \mathrm \TeX\text{book}$$ você não verá nenhuma menção ao $$\text{fi}$$ infinito — simplesmente porque ele não foi implementado no original de Knuth $$\mathrm \TeX$$ software. Consequentemente, há uma pequena “desconexão” entre $$\text{Lua}\mathrm\TeX\text{'s}$$ a ordem dos infinitos e aqueles que você pode ver em livros sobre $$\mathrm \TeX$$. $$\text{Lua}\mathrm\TeX$$ usa infinitos cuja ordem varia de 0 a 4, mas outros (comuns) $$\mathrm \TeX$$ motores variam de 0 a 3. Aqui está uma tabela mostrando a ordem da cola atribuída a cada tipo de unidade de cola.

|                           |                               |     |     |      |       |
| ------------------------- | ----------------------------- | --- | --- | ---- | ----- |
|                           | Unidades físicas (pt, mm, in) | fi  | fil | fill | filll |
| $$\text{Lua}\mathrm\TeX$$ | 0                             | 1   | 2   | 3    | 4     |
| Outros motores            | 0                             | N/D | 1   | 2    | 3     |

### Notas sobre $$\text{Lua}\mathrm\TeX$$: Por que ter um infinito extra?

$$\text{Lua}\mathrm\TeX$$ é derivado de vários projetos e bibliotecas de código, incluindo um chamado [Omega](https://en.wikipedia.org/wiki/Omega_\(TeX\)). $$\text{Lua}\mathrm\TeX$$ incorporou certos aspectos do código de Omega e isso inclui um novo tipo de cola infinita chamada $$\text{fi}$$. Do manual do Omega:

> “Um novo nível de infinito $$\text{fi}$$ foi adicionado. É menor que $$\text{fil}$$ mas maior que qualquer quantidade finita. Sua intenção original era para o estiramento entre letras: seja para preencher os espaços em preto, como é feito em escritas caligráficas como o árabe; seja para ênfase, como no russo; tudo isso sem ter de reescrever os pacotes de macros existentes. Há, portanto, uma nova palavra-chave, $$\text{fi}$$portanto, há uma nova palavra-chave, `\hfi` e `\vfi`.”

## De volta ao nosso desafio

Seguindo o modelo de Knuth, vamos definir duas quantidades:

* a largura desejada de uma caixa: $$\mathrm{W}\_{\mathrm{D}}$$—quão grande queremos que ela seja;
* a largura natural de uma caixa: $$\mathrm{W}\_{\mathrm{N}}$$—o espaço total ocupado por seus elementos constituintes antes de qualquer cola ser esticada ou encolhida.

### A largura natural de uma caixa

A largura natural de uma caixa é a largura total de todos os componentes nessa caixa: caracteres, kerns, caixas aninhadas e qualquer cola. Para a cola dentro da caixa, sua largura natural ignora qualquer estiramento ou encolhimento da cola: isto é, seu tamanho antes de qualquer estiramento ou encolhimento ocorrer.

Mais uma vez, aqui está a caixa que estamos examinando:

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

Claramente, queremos que a caixa tenha 100pt de largura, portanto $$\mathrm{W}*{\mathrm{D}}=100\mathrm{pt}$$ mas e quanto à sua largura natural, $$\mathrm{W}*{\mathrm{N}}$$? Para calcular a largura natural, é claro que precisamos das larguras dos quatro caracteres (A, B, C e D) mais as larguras naturais das quatro colas.

$$\eqalign{\mathrm{W}\_{\mathrm{N}} &= &\text{width(A)} + \text{width(B)} + \text{width(C)} + \text{width(D)} \ & &+ \text{width}(\verb\*\hskip 4pt plus3pt minus 2pt\*)\ & &+\text{width}(\verb\*\hskip 0pt plus 2fil\*)\ & &+\text{width}(\verb\*\hskip 0pt plus 2fill)*\ & &+\text{width}(\verb*\hskip 0pt plus 3fill\*)\ }$$

Onde $$\text{width}$$ é apenas uma notação para denotar a largura natural de um item. Podemos obter as larguras naturais dos quatro caracteres (A, B, C e D) a partir do nosso grafo de nós:

![grafo de nós](/files/34e505d30229645c21d23ce5ee08d80b0ca99484)

A partir do grafo de nós acima, podemos ver que:

$$\eqalign{ \text{width(A)} &= 7.50002\text{pt}\ \text{width(B)} &= 7.08336\text{pt}\ \text{width(C)} &= 7.22223\text{pt}\ \text{width(D)} &= 7.6389\text{pt}\ }$$

Agora, tudo o que precisamos são as larguras naturais de nossas colas, que são facilmente obtidas ignorando os componentes de estiramento e encolhimento:

$$\eqalign{ &\text{width}(\verb\*\hskip 4pt plus3pt minus 2pt\*) & = 4\text{pt}\ &\text{width}(\verb\*\hskip 0pt plus 2fil\*) &=0\text{pt}\ &\text{width}(\verb\*\hskip 0pt plus 2fill)*&=0\text{pt}\ &\text{width}(\verb*\hskip 0pt plus 3fill\*)&=0\text{pt}\ }$$

Portanto:

$$\eqalign{ \mathrm{W}\_{\mathrm{N}} & = \text{widths of characters} + \text{width of all glues}\ &= 7.50002\text{pt}+ 7.08336\text{pt} + 7.22223\text{pt} + 7.6389\text{pt} + 4\text{pt}\space \text{(from }\verb\*\hskip\*\text{)}\ &=33.4445\text{pt}\ }$$

Agora temos duas informações-chave:

$$\eqalign{ \mathrm{W}*{\mathrm{D}} & = 100\text{pt}\ \mathrm{W}*{\mathrm{N}} & = 33.4445\text{pt}\ }$$

Claramente, $$\mathrm{W}*{\mathrm{D}} > \mathrm{W}*{\mathrm{N}}$$ e a diferença é $$(100-33.4445)\text{pt}=66.5555\text{pt}$$; esse espaço excedente precisa ser preenchido esticando as colas — mas quais e em que medida?

### Quem tem o maior estiramento?

Seguindo a metodologia de Knuth (página 77 de $$\text{The } \mathrm \TeX \text{book}$$), mas permitindo o tipo adicional de infinito ($$\text{fi}$$) fornecido por $$\text{Lua}\mathrm \TeX$$, o próximo passo é escrever a *total* estiramento na forma:

$$\text{total stretch} = y\_{0}+ y\_{1}\text{fi} +y\_{2}\text{fil} +y\_{3}\text{fill} +y\_{4}\text{filll}$$

Primeiro, se anotarmos o $$\text{total glue}$$:

$$\text{total glue } = (\verb*4pt plus3pt minus 2pt*) + (\verb*0pt plus 2fil*) + (\verb*0pt plus 2fill*) + (\verb*0pt plus 3fill*)$$

podemos então ver que o $$\text{total stretch}$$ é:

$$\eqalign{ \text{total stretch} & = 3\text{pt}+ 0\text{fi} + (2\text{fil}) + (2\text{fill} + 3\text{fill}) + 0\text{filll}\ &=3\text{pt}+ 0\text{fi} + 2\text{fil} + 5\text{fill} + 0\text{filll}\ }$$

Comparando isso com $$\text{total stretch} = y\_{0}+ y\_{1}\text{fi} +y\_{2}\text{fil} +y\_{3}\text{fill} +y\_{4}\text{filll}\space$$podemos ver que:

$$\eqalign{ y\_0 &=3\text{pt}\ y\_1 &=0\ y\_2 &=2\ y\_3&=5\ y\_4&=0\ }$$

$$\mathrm\TeX$$ em seguida “se pergunta”: observando o $$\text{total stretch}$$, qual é o nível mais alto de infinito com um valor diferente de zero? Ao inspecionar os $$\text{total stretch}$$ fica claro que o componente de estiramento não nulo “mais infinito” é $$\text{fill}$$ e temos $$y\_3=5$$ unidades disso: são as colas com um $$\text{fill}$$ componente de estiramento que fornecem todo o estiramento. O subscrito 3 de $$y\_3$$ nos diz a `glue_order` da cola que será usada — neste caso para estiramento. Agora, se olharmos para a seção “metadados” dentro do nosso diagrama de nós para esta `\hbox` podemos agora entender mais dois “valores de metadados” (abordaremos `glue_set` na próxima seção)

![metadados](/files/c47d820f55be52c88e68577ed10e4e3d42ee54a4)

* `glue_sign`: informa se a cola está ajustada ao seu comprimento natural, esticada ou encolhida:
* 0=ajustada à largura natural
* 1=esticar
* 2=encolher

No nosso exemplo, `glue_sign` tem o valor de `1`, o que significa que as colas participantes serão esticadas.

* `glue_order` indica qual “infinito” está envolvido; para $$\text{Lua}\mathrm \TeX$$ um valor de 3 indica que colas com um $$\text{fill}$$ componente participarão dos cálculos de cola — no nosso caso, elas serão esticadas.

Qualquer cola que não tenha um componente de estiramento definido em unidades de $$\text{fill}$$ será **ajustada ao seu comprimento natural**: ou seja, ela não será esticada em nada (no nosso caso).

### Como esticar ou encolher: calculando glue\_set

Para resumir onde estamos e o que sabemos:

1. largura desejada da caixa: $$\mathrm{W}\_{\mathrm{D}} = 100\text{pt}$$;
2. largura natural da caixa: $$\mathrm{W}\_{\mathrm{N}} = 33.4445\text{pt}$$;
3. a cola terá de se esticar, mas apenas colas com um $$\text{fill}$$ componente de estiramento farão esse estiramento;
4. temos um total de $$(2+3)=5$$ unidades de $$\text{fill}$$ disponíveis.

A próxima questão é: em quanto essas colas realmente se esticarão? Entra em cena a *razão de ajuste da cola*—referida como `glue_set` no nosso grafo de nós. O que $$\mathrm \TeX$$ faz é calcular quanto espaço precisa ser preenchido e então distribuir essa quantidade de espaço entre as colas apropriadas, em proporção ao tamanho do seu componente de estiramento. Se você olhar novamente para o nosso `\hbox` você pode ver exatamente quais colas têm componentes de estiramento contendo unidades de $$\text{fill}$$:

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

O $$\textit{glue set ratio }(\text{or } \verb*glue\_set*)$$ é calculado da seguinte forma:

$$\eqalign{ \text{glue set ratio}\space (\verb*glue\_set*) = & {\text{amount to stretch}}\over{\text{value of highest infinity}}\ =& {\mathrm{W}*{\mathrm{D}}-\mathrm{W}*{\mathrm{N}}}\over{y\_3}\ =& {(100-33.4445)}\over{5}\ =& {66.5555}\over{5}\ =& 13.3111\space (\text{to 4 decimal places})\ }$$

E agora a etapa final no $$\mathrm\TeX$$ algoritmo é aplicada:

1. para cada item de cola cujo componente de estiramento corresponda ao `glue_order` (3 no nosso caso) o comprimento dessa cola será:

$$\text{stretched value} = \text{natural length} + (\verb*glue\_set* \times \text{value of stretch component})$$

3. todas as outras colas são ajustadas ao seu comprimento natural — isto é, elas não se esticam em absoluto.

Observando as colas na nossa caixa:

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

podemos percorrê-las para calcular seus valores finais:

1. **Entre A e B**: `\hskip 4pt plus3pt minus 2pt`. O componente de estiramento é `3pt`, que é de ordem `0`. O requerido `glue_order` é `3`: o componente de estiramento é ignorado e essa cola assume sua largura natural de `4pt`.
2. **Entre B e C**: `\hskip 0pt plus 2fil`. O componente de estiramento é `2fil`, que é de ordem `2`. O requerido `glue_order` é `3`: o componente de estiramento é ignorado e essa cola assume sua largura natural de `0pt`.
3. **Entre C e D**: `\hskip 0pt plus 2fill`. O componente de estiramento é `2fill`, que é de ordem `3` e corresponde ao requerido `glue_order` de `3`. Essa cola será esticada para: $$\eqalign{ \text{stretched value}\space = & \text{natural width} + (\verb*glue\_set* \times \text{value of stretch component})\ = & 0\text{pt} + 13.3111 \times 2 \ = & 26.6222\text{pt}\ }$$5. **Entre D e o fim da caixa**: `\hskip 0pt plus 3fill`. O componente de estiramento é `3fill`, que é de ordem `3` e corresponde ao requerido `glue_order` de `3`. Essa cola será esticada para: $$\eqalign{ \text{stretched value}\space = &\text{natural width} + (\verb*glue\_set* \times \text{value of stretch component})\ =& 0\text{pt} + 13.3111 \times 3 \ = &39.9333\text{pt}\ }$$

## E, por fim: verificando a largura total

O processo de calcular o espaço real ocupado pela cola é chamado *ajuste da cola* então agora podemos verificar se preenchemos a caixa até a largura desejada, $$(\mathrm{W}\_{\mathrm{D}} = \text{100pt})$$:

$$\eqalign{ \mathrm{W}\_{\mathrm{D}} & = \text{width of all characters} + \text{width of all }\textbf{set}\text{ glue values}\ & = \text{A:7.50002pt} + \text{B:7.08336pt} + \text{C:7.22223pt} + \text{D:7.6389pt}\ & + \text{4pt} + \text{0pt} + \text{26.6222pt} + \text{39.9333pt}\ & = \text{100.00pt} }$$

Agora conhecemos as larguras de todas as colas e podemos preparar um gráfico que responde à pergunta apresentada no início deste artigo: aqui estão as larguras das colas entre os caracteres em nossa `\hbox`:

![cola](/files/6852ca711ae096ff2e81d8dc61bd257c9ef88dc8)


---

# 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/24-how-tex-calculates-glue-settings-in-an-hbox.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.
