> 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/23-how-does-latex-typeset-headers-and-footers.md).

# Como o LaTeX compõe cabeçalhos e rodapés?

## Como o LaTeX compõe cabeçalhos e rodapés?

### Introdução

Se você está procurando um guia prático sobre como alterar cabeçalhos e rodapés, por favor [visite nossa página de ajuda](/latex/overleaf-learn-latex-pt/formatacao/02-headers-and-footers.md) porque este artigo se concentra em explicar os mecanismos de baixo nível usados pelos mecanismos TeX e pelo LaTeX para produzir cabeçalhos e rodapés.

* **Nota (atualização)**: Este artigo explora o mecanismo central de marcas do LaTeX em uso antes de junho de 2022, quando foi introduzida uma implementação nova e mais versátil do tratamento de marcas do LaTeX. Veja [Visão geral do novo mecanismo de marcas do LaTeX](https://www.latex-project.org/help/documentation/ltmarks-doc.pdf) para mais detalhes. Por motivos de compatibilidade retroativa, o LaTeX continua a oferecer suporte ao seu mecanismo legado de marcas. O material do artigo que discute o comportamento dos mecanismos TeX não é afetado por essas mudanças no LaTeX.
* **Nota**: os termos “LaTeX”, “TeX” e “mecanismo TeX” são usados ao longo destas discussões, por isso é útil entender o seu significado — veja o artigo do Overleaf [O Que Há num Nome: Um Guia para os Muitos Sabores de TeX](/latex/overleaf-learn-latex-pt/artigos-aprofundados/55-what-s-in-a-name-a-guide-to-the-many-flavours-of-tex.md) para mais informações.

Para fornecer um contexto de fundo útil, começamos com uma visão geral de algumas áreas relevantes de baixo nível da composição tipográfica baseada em TeX — incluindo armazenamento temporário de conteúdo (interno), quebra e construção de páginas. As discussões foram simplificadas ao considerar uma página composta que contém um “corpo” de texto além de alguns cabeçalhos e rodapés. Elementos de página como figuras (flutuantes) e notas de rodapé não são abordados porque envolvem um mecanismo complexo do TeX chamado *inserções*, que está muito além do escopo deste artigo.

Começaremos com a noção básica de *nós*: os blocos fundamentais usados pelos mecanismos TeX para o armazenamento temporário de conteúdo (interno).

### Algumas notas sobre o armazenamento de conteúdo: nós TeX

À medida que o mecanismo TeX subjacente processa o seu código LaTeX para produzir material composto — como parágrafos, tabelas e matemática —, ele precisa armazenar temporariamente esse conteúdo na memória de qualquer mecanismo TeX que esteja sendo usado para processar o seu código LaTeX. Para armazenar conteúdo composto, os mecanismos TeX usam uma sequência de chamados *nós*, que você pode imaginar como “blocos” de tamanho variável de memória de computador (do dispositivo), ligados entre si para formar uma lista (veja este [artigo da Wikipédia sobre estruturas de dados ligadas](https://en.wikipedia.org/wiki/Linked_data_structure)).

![Representação esquemática de como os mecanismos TeX armazenam conteúdo usando nós ligados](/files/0b960653696fe5a9c5ccdcddcdaefc7cc8965cd3)

Para representar os elementos fundamentais da composição tipográfica baseada em TeX — como caracteres, cola, caixas, penalidades, kerns e [*marcas*](#why-were-here-understanding-mark-nodes) (para citar apenas alguns) — os mecanismos TeX usam diferentes *tipos* de nó. Alguns nós, como os de caixas, precisam armazenar mais dados em comparação com tipos de nós mais simples, como os nós de caracteres; consequentemente, alguns nós são maiores do que outros — exigindo mais bytes para armazená-los na memória. Ao ler sobre TeX, você pode encontrar termos como *nós de caracteres*, *nós de cola*, [*nós de marca*](#why-were-here-understanding-mark-nodes) e assim por diante: agora você sabe que são apenas nomes dados a blocos de memória alocados para armazenar dados que representam um elemento da composição tipográfica do TeX.

#### Por que estamos aqui: entendendo os nós de marca

Dos muitos tipos de nós, o que precisamos discutir é chamado de *nó de marca* que é criado pelo `\mark` comando:

```latex
\mark{stuff to store}
```

O `\mark` o comando não produz diretamente qualquer conteúdo composto: o seu argumento `*stuff to store*` é salvo na memória para uso posterior e um *nó de marca* é criado para conter o local na memória de *stuff to store*. Como veremos, o `\mark` comando foi criado *especificamente* para auxiliar na produção de cabeçalhos e rodapés.

Nós de marca criados por `\mark` comandos são “embutidos” no conteúdo da página, prontos para uso durante os estágios finais da composição da página, quando o mecanismo TeX está pronto para adicionar cabeçalhos e rodapés à página composta (corpo). Normalmente, `*stuff to store*` contém material como números de página e títulos/números de capítulos ou seções — os blocos de construção de cabeçalhos e rodapés.

#### A ε-TeX adiciona o comando \marks

[A versão 2 do ε-TeX](https://texdoc.org/serve/e-TeX/0), uma extensão do TeX original de Knuth, foi publicada em 1998 e oferece novos recursos juntamente com melhorias em funcionalidades existentes. Hoje, a maioria das melhorias do ε-TeX foi incorporada aos mecanismos TeX principais: pdfTeX, LuaTeX e XeTeX — veja a opção de linha de comando [**`-etex`** dos mecanismos TeX](/latex/overleaf-learn-latex-pt/mais-topicos/44-tex-engine-command-line-options-for-pdftex-xetex-and-luatex.md) que permite o uso das extensões do ε-TeX.

O software TeX original de Knuth fornece o comando \mark, que cria apenas 1 “classe”, ou “tipo”, de nó de marca. Seu documento poderia incluir muitos comandos \mark, mas todos criam nós de marca do mesmo “tipo” ou “classe” — não há mecanismo integrado para agrupá-los ou classificá-los. Essa restrição foi removida por uma melhoria do ε-TeX: o comando \marks, suportado por pdfTeX, LuaTeX e XeTeX:

```latex
\marks n {stuff to store}
```

onde `n` é um inteiro (`0` <= `n` < `32768`) que determina o nó de marca *classe*.

Notas:

* escrever `\marks 0` (ou seja, `n`=`0`) é sinônimo de usar o original do TeX `\mark` comando
* O ε-TeX também introduziu variáveis de marca ([ver mais adiante](#pre-output-checks-looking-for-mark-nodes)) para cada classe (`n`) de marca: `\firstmarks n`, `\topmarks n` e `\botmarks n`. Classes selecionadas de variáveis de marca podem ser usadas para fornecer dados de marca para tarefas específicas de composição tipográfica.
* O LuaTeX aumentou o valor máximo de `n` para `65535`, permitindo $$2^{16}$$ classes de marca

### Razões para o uso de marcas pelo TeX

Para entender *porquê* (e como) os mecanismos TeX usam o `\mark` (ou `\marks`) comando para produzir cabeçalhos e rodapés, precisamos apreciar algumas “peculiaridades” dos mecanismos TeX para construir páginas — encontrar quebras de página e enviar páginas concluídas para um arquivo PDF. Na realidade, esses processos de construção de páginas são complexos, mas os princípios/conceitos centrais podem ser simplificados para fornecer explicações de fundo suficientes que ajudem nossa compreensão das marcas.

À medida que um mecanismo TeX conclui a composição de itens de conteúdo individuais, como parágrafos, tabelas ou matemática, ele chama uma rotina interna (uma função chamada `build_page(...)`) que tenta adicionar esses itens recém-compostos à página atualmente sendo construída na memória. Quando esse novo material é adicionado à página em construção, o TeX também verifica se esse conteúdo recém-adicionado tornou a página atual “suficientemente cheia”. Se a página estiver cheia, o TeX pode criar uma *quebra de página*— enviando essa quantidade de conteúdo da página para processamento final (“empacotamento”) e subsequente saída para o arquivo PDF.

Uma característica-chave do estágio final do empacotamento da página (composição) é algo chamado *rotina de saída* que é, na prática, uma sequência de comandos definida pelo usuário usada para empacotar a página de conteúdo, tornando-a pronta para ser enviada ao arquivo PDF. Uma atividade de “empacotamento” é adicionar cabeçalhos e rodapés, mas há inúmeras maneiras de usar rotinas de saída — por exemplo, veja [este artigo no TUGboat](https://tug.org/TUGboat/tb11-1/tb27salomon.pdf). As rotinas de saída são uma área bastante complexa do TeX, então não entraremos em detalhes aqui: para os propósitos atuais, basta lembrar que o estágio final da composição da página envolve o uso de uma sequência de comandos definida pelo usuário (coletivamente chamada de *rotina de saída*).

Mas vamos considerar o que pode acontecer quando o TeX conclui a composição de um longo parágrafo de texto, quebrando-o em uma sequência de linhas compostas individuais. O TeX vai querer adicionar esse parágrafo recém-composto — linha por linha — à página atualmente em construção, mas, talvez, apenas *algumas* algumas *não* dessas linhas caibam na página atual. Observe que, por “página”, estamos nos referindo à área principal de texto (corpo da página), que

Após várias linhas de parágrafo terem sido adicionadas à página atual, ela pode ficar “suficientemente cheia” e chegar a hora de o TeX criar uma quebra de página. No entanto, temos algum material “remanescente” porque apenas *part* do parágrafo chegou à página atual: o “excesso de conteúdo do parágrafo” é salvo para mais tarde, pronto para a criação da *próxima* página. O gráfico a seguir ilustra essa ideia: parte do parágrafo está na *atual* página e parte é retida para a *próxima* página.

![Representação esquemática de um parágrafo que atravessa uma quebra de página](/files/8bc7bd4a90137593e199f433cd02fd0bac5c818b)

Este exemplo de parágrafo demonstra que um mecanismo TeX frequentemente processa (compõe) pedaços de conteúdo que não conseguem, *na sua totalidade*, caber na página atual — porque esse conteúdo ultrapassa o ponto em que uma quebra de página se torna necessária. Lembre-se de que os mecanismos TeX encontram quebras de linha ao inserir e depois compor, *parágrafos inteiros* e, ao contrário de alguns aplicativos, não adotam uma abordagem linha a linha para compor parágrafos. Em outras palavras, o TeX compõe o *parágrafo inteiro* quer ele caiba ou não na página atual (isso é resolvido mais tarde). Aliás, o princípio de “compilar por completo e depois adicionar à página atual” também vale para outros tipos de conteúdo do TeX, incluindo tabelas, que são totalmente lidas do arquivo .tex e compostas em sua totalidade antes de qualquer tentativa de adicioná-las à página atual.

Para o nosso exemplo de parágrafo, o texto completo desse parágrafo, *incluindo quaisquer comandos dentro desse texto*, foi totalmente processado — o que significa que a composição tipográfica do TeX atingiu um determinado local no seu `.tex` arquivo. O “estado interno atual” do mecanismo TeX, como o valor de variáveis ou definições de parâmetros armazenadas, refletirá o material, incluindo quaisquer comandos, processado até o local atual — o fim do parágrafo.

Embora o parágrafo completo tenha sido composto, parte dele não pode ser acomodada pela página atual, resultando no “excesso de conteúdo do parágrafo” sendo salvo para a *próxima* página. Dentro do código LaTeX (texto mais comandos) que produziu o “excesso de conteúdo do parágrafo”, o mecanismo TeX *poderia* ter chamado qualquer número de comandos e macros que alteraram valores e variáveis armazenados internamente pelo mecanismo TeX — ou seja, fizeram alterações no “estado atual” do TeX.

O diagrama a seguir ilustra uma “peculiaridade” extremamente importante do TeX, uma que afeta vários aspectos da composição tipográfica baseada em TeX. Observando o lado direito do diagrama, você vê uma representação de nós que compreendem todo o conteúdo atualmente armazenado na memória: a área cinza-clara contém nós que formam a *atual* página e a área cinza-escura é conteúdo composto destinado à *próxima* página. Esse cenário reflete nosso exemplo de parágrafo: a área cinza-escura representa o “excesso de conteúdo do parágrafo”: linhas de texto retidas porque não cabem na página atual.

![Representação esquemática da localização do nó onde o TeX encontra uma quebra de página, mostrando também o conteúdo retido para a próxima página](/files/2827b83710ecf3df1222746bbe81ab159a095cb7)

Lembre-se de que, assim que o TeX tem uma página (corpo) “suficientemente cheia”, ele passa esse conteúdo para algo chamado *rotina de saída* que é uma sequência de comandos definida pelo usuário. Entre outras coisas, a rotina de saída adiciona cabeçalhos e rodapés ao corpo da página, finalizando a página para enviá-la ao arquivo PDF.

Nosso gráfico (acima) representa o instante em que o TeX escolheu fazer uma quebra de página em um determinado nó, como `\baselineskip` cola entre linhas compostas, e está pronto para começar a empacotar a página atual usando a rotina de saída — uma sequência de comandos integrados e macros definidas pelo usuário. *No entanto*, além do conteúdo que compõe a página atual (armazenado na memória), o TeX já processou e armazenou (na memória) *material adicional*, do seu `.tex` arquivo. Esse material extra se estende *além da quebra de página* e *poderia* poderia ter incluído comandos que alteraram valores ou variáveis importantes relacionadas à página, afetando o “estado interno atual” do TeX — que inclui valores de parâmetros internos ou dados armazenados por macros.

Quando o TeX começa a empacotar a página atual, o seu “estado interno atual” é *contém* definido por tudo o que foi composto até o local da quebra de página, porque o TeX já *passou desse ponto* em seu arquivo e processou material adicional. Se você considerar o local no seu arquivo correspondente ao ponto em que a quebra de página ocorre e o local que o TeX realmente alcançou no seu `.tex` arquivo, os dois estados internos correspondentes do TeX, incluindo dados armazenados e o valor das variáveis, podem ser muito diferentes. O estado atual da composição tipográfica do TeX geralmente está à frente do ponto em que ocorre a quebra de página; isto é, as atividades de composição do TeX *não estão sincronizadas* com o processo de saída das páginas compostas por meio da rotina de saída.

#### Exemplo hipotético: como obter os cabeçalhos errados

O diagrama a seguir ilustra comandos hipotéticos `\myheader` e `\myfooter` usados para armazenar o texto desejado dos cabeçalhos e rodapés; por exemplo, usando definições básicas como

```latex
\newtoks\headertoks% uma nova variável de lista de tokens para o texto do cabeçalho
\newtoks\footertoks% uma nova variável de lista de tokens para o texto do rodapé
% Use \global para garantir que os dados do cabeçalho ou rodapé armazenados
% sejam acessíveis em qualquer lugar, incluindo comandos na
% rotina de saída
\newcommand{\myheader}[1]{\global\headertoks={#1}}
\newcommand{\myfooter}[1]{\global\footertoks={#1}}
```

em que `\headertoks` e `\footertoks` são listas de tokens usadas para armazenar o texto dos cabeçalhos e rodapés.

Além disso, nosso exemplo hipotético também tem uma rotina de saída que obtém o texto do cabeçalho e do rodapé dos valores atuais de `\myheader` e `\myfooter`. Como mostrado no diagrama, dentro do conteúdo destinado à página atual, `\myheader` e `\myfooter` definir os valores apropriados (corretos). No entanto, seria possível `\myheader` e/ou `\myfooter` ser chamado dentro de um parágrafo que atravessa uma quebra de página. Como o TeX precisa processar o parágrafo inteiro, `\myheader` e `\myfooter` seria chamado novamente para redefinir o texto do cabeçalho/rodapé salvo no “estado interno do TeX”, produzindo valores que não estão corretos para a página atual. Quando a rotina de saída produz o cabeçalho e o rodapé, eles conterão texto destinado à página seguinte.

![Gráfico que mostra cabeçalhos e rodapés incorretos produzidos se a rotina de saída usar apenas macros TeX para recuperar o texto do cabeçalho e do rodapé](/files/494e759fd2d4f54d7788aec464b50c51f8d01962)

#### O comportamento assíncrono do TeX: o comando \mark para salvar o dia

As atividades de composição tipográfica (construção de conteúdo) do TeX são *não sincronizadas* com o processo final de saída de uma página composta por meio de comandos contidos na rotina de saída. Quando chega a hora de emitir uma página, o estado interno real do TeX já está à frente de qualquer estado que ele pudesse ter no local da quebra de página — onde compôs a peça final de conteúdo na página atual que está sendo emitida.

Em [O TeXbook](https://www.amazon.co.uk/TeXbook-Donald-Knuth/dp/0201134489), Donald Knuth, criador do TeX, descreve essa situação como

> ... a rotina de saída do TeX fica atrás de suas atividades de construção de páginas

Por causa dessa relação dessincronizada, são necessárias “facilidades especiais” na forma do *mecanismo de marcas*, aplicado por meio do `\mark` (ou `\marks n`) comando, para garantir que cabeçalhos e rodapés contenham material relevante para a página real que está sendo emitida. O `\mark` comando incorpora nós de marca ao conteúdo da página, armazenando o local na memória do conteúdo que pode ser usado para o cabeçalho e o rodapé da página hospedeira.

O autor do conhecido e respeitado livro [TeX by Topic](https://www.eijkhout.net/tex/tex-by-topic.html) descreve o `\mark` mecanismo como

> ... o principal mecanismo por meio do qual a rotina de saída pode obter informações sobre o conteúdo da página atualmente interrompida, em particular o seu topo e fundo.

O `\mark` comando é um mecanismo projetado para contornar a natureza assíncrona do algoritmo de quebra de página e da rotina de saída do TeX.

![Representação esquemática dos dados de marca (nós) incorporados ao conteúdo do corpo da página](/files/2e8ca151b3fd07194a4b0b7c3abd1c1168d5e775)

### Verificações pré-saída: procurando nós de marca

Depois que o mecanismo TeX determina a localização de uma quebra de página, ele chama uma rotina interna (chamada `fire_up()`) que faz muito pré-processamento antes de a rotina de saída completar a composição da página e escrever a página finalizada no arquivo PDF. Uma parte importante dessas etapas de pré-processamento é definir o valor de três *variáveis globais de marca*: `\botmark`, `\topmark` e `\firstmark` que são usadas para fornecer dados para a construção de cabeçalhos e rodapés. É claro que uma página pode conter vários nós de marca, mas estes são filtrados para produzir as três variáveis de marca, que atuam da seguinte forma:

* **`\botmark`** é a marca em vigor na quebra de página atual; isto é, a última marca vista na *atual* page
* **`\topmark`** é o valor da `\botmark` do *anterior* page
* **`\firstmark`** é a primeira marca na *atual* página — a primeira marca entre `\topmark` e `\botmark`

O esquema a seguir mostra os princípios básicos do pré-processamento do conteúdo da página composta para determinar os valores das três variáveis globais de marca `\botmark`, `\topmark` e `\firstmark`:

![Representação esquemática dos princípios básicos usados para determinar os valores das três variáveis globais de marca \botmark, \topmark e \firstmark](/files/385e712eb899d99538dea0126da35eb16e8ade6c)

A próxima seção usa algumas das explicações fornecidas acima para descrever como o LaTeX compõe cabeçalhos e rodapés.

### As classes do LaTeX: estilos de página e cabeçalhos/rodapés

Quando você escreve `\documentclass{*class*}` onde `*class*` pode ser `article`, `book`, `article` ou `letter`, o LaTeX carrega um arquivo chamado `*class*.cls`; por exemplo, `book.cls`, `article.cls` e assim por diante. Esses `.cls` arquivos contêm código LaTeX para implementar variações específicas da classe de vários comandos e recursos esperados em, e fornecidos por, todas as classes de documento — os comportamentos compartilhados por todas as classes de documento. Os exemplos podem incluir margens de layout de página específicas da classe, juntamente com versões específicas da classe de comandos, como `\section`, `\subsection` e assim por diante.

Outro elemento importante dos `.cls` arquivos é a implementação específica da classe de estilos de página padrão que definem os cabeçalhos e rodapés de documentos produzidos usando uma classe e um estilo de página específicos. Por exemplo:

* **`book.cls`** e **`article.cls`** cada um contém implementações dos estilos de página `headings` e `myheadings`
* **`letter.cls`** contém definições para os estilos de página `headings`, `empty`, `plain` e um chamado `firstpage`
* **`report.cls`** contém definições para os estilos de página `headings` e `myheadings`

As implementações de estilos de página geralmente dependem da opção `twoside` de `\documentclass`— se o documento é de face única ou dupla —, de modo que cabeçalhos e rodapés sejam definidos apropriadamente para páginas voltadas para a esquerda (pares) e páginas voltadas para a direita (ímpares).

As classes de documento podem depender de definições padrão dos `plain` ou `empty` estilos de página fornecidos em outro lugar no LaTeX — externos ao `.cls` arquivo que está sendo usado.

#### Mais sobre estilos de página

Quando você altera o estilo de uma página usando `\pagestyle{*somestyle*}` ou `\thispagestyle{*somestyle*}` o LaTeX espera encontrar um comando interno chamado `ps@*somestyle*`— geralmente fornecido pela classe do documento `.cls` arquivo ou talvez por um pacote como `fancyhdr`. Aliás, por “comando interno” queremos dizer um comando que faz parte do código-fonte do LaTeX e cujo nome contém um `@` símbolo, o que normalmente impede o uso casual (devido a sua [código de categoria](/latex/overleaf-learn-latex-pt/mais-topicos/43-table-of-tex-category-codes.md)).

A definição de `\ps@*somestyle*` é responsável por implementar os recursos/comportamentos desse estilo de página, o que inclui fornecer definições de:

* comandos usados durante os estágios finais da composição da página (para adicionar cabeçalhos e rodapés, veja [mais adiante no artigo](#commands-for-the-output-routine)):
  * `\@oddhead`
  * `\@oddfoot`
  * `\@evenhead`
  * `\@evenfoot`
* comandos para inserir dados de marca relacionados à seção para uso na geração de cabeçalhos e rodapés do documento que contenham títulos, números e itens semelhantes de seção. Por exemplo, o `headings` estilo de página (dentro de `book.cls`) define os seguintes comandos que produzem marcas:
  * `\chaptermark`
  * `\sectionmark`

Vamos [explorar mais adiante os comandos geradores de marcas](#mark-commands-and-mark-data), como `\chaptermark`, mas apenas a título de exemplo: quando você escreve `\chapter{chapter title}` o `\chaptermark` o comando também é executado para inserir dados de marca relacionados ao capítulo para a produção subsequente de cabeçalhos de página.

#### Uma anatomia dos comandos de cabeçalho e rodapé baseada em estilo de página

Esta seção explora alguns dos comandos/processos centrais do LaTeX usados para criar cabeçalhos e rodapés — apoiando-se em explicações ou conceitos apresentados anteriormente neste artigo.

**O “modelo” de cabeçalhos e rodapés do LaTeX**

O conteúdo dos cabeçalhos e rodapés (padrão) do LaTeX baseia-se em uma hierarquia em dois níveis de seções de documento: uma seção de “nível superior” contendo múltiplas seções de “nível inferior”. Para as classes book e article isso se traduz em:

* `**book**` **classe**: as seções de “nível superior” são produzidas por comandos `\chapter` e as seções de “nível inferior” por `\section`, refletindo capítulos contendo muitas seções.
* `**article**` **classe** (assumindo documentos em duas faces): as seções de “nível superior” são produzidas usando comandos `\section` e as de “nível inferior” por `\subsection`, refletindo várias subseções que aparecem dentro da mesma seção.

O LaTeX aplica seu “modelo” de cabeçalhos e rodapés por meio de seus comandos de seção, que “injetam” nós de marca (via o `\mark` comando) para armazenar dados relevantes para a seção do documento que está sendo criada. Por exemplo, toda vez que você escreve `\section{*some section title*}` um nó de marca será criado, contendo dados que refletem `*some section title*` e o número da seção.

O LaTeX usa um sistema de marcas que contém dados na forma `{left}{right}`, gerados em última instância via `\mark` comandos

```latex
\mark{{left}{right}}
```

enquadrado em camadas de macros projetadas para proteger os usuários dos detalhes de nível inferior — que são explorados nas seções subsequentes deste artigo.

#### Explorando a classe book

Quando o `book.cls` arquivo é carregado, uma de suas ações finais é executar `\pagestyle{headings}` que define o estilo de página padrão como `headings`, então veremos esse estilo de página com mais detalhes.

Como [observado acima](#more-on-page-styles), os recursos/propriedades do `headings` estilo de página, conforme implementado pela classe `book` , serão definidos pelo comando (interno) `\ps@headings` contido no arquivo `book.cls`. A definição precisa de `\ps@headings` depende de o documento ser de face única ou dupla (padrão para a classe `book` ).

**“Comandos de marca” e “dados de marca”**

Para documentos de duas faces produzidos pela classe `book` , a definição de `\ps@headings` cria (define) dois “comandos de marca”: `\chaptermark` e `\sectionmark` que produzem “dados de marca”, da forma `{left}{right}`, para uso em cabeçalhos e rodapés. Esses comandos de marca refletem o modelo do LaTeX de cabeçalhos e rodapés — baseado na hierarquia das seções do documento:

* o comando de seção de “nível superior” (aqui, `\chapter`) é usado para fornecer “dados de marca” para cabeçalhos de páginas voltadas para a esquerda (pares). Quando você inicia um novo capítulo, escrevendo `\chapter{*chapter title*}`, `\chaptermark` é chamado para criar “dados de marca” que refletem esse novo capítulo — contendo seu `*chapter title*` e número.
* o comando de seção de “nível inferior” (aqui, `\section`) é usado para fornecer “dados de marca” para páginas à direita (ímpares). Quando você escreve `\section{*título da secção*}` o `\sectionmark` o comando será chamado para criar “dados de marca” que refletem a nova secção — contendo o seu `*título da secção*` e número. Quaisquer dados de marca fornecidos pela secção anterior `\chapter` não são afetados por quaisquer comandos subsequentes \section.

**\markboth e \markright**

Os comandos de marca específicos de secção do LaTeX, como `\chaptermark` e `\sectionmark`, utilizam dois outros comandos chamados `\markboth` e `\markright` que fornecem os dados de marca reais para cabeçalhos e rodapés. `\markboth` e/ou `\markright` podem incluir comandos para estilizar o texto do cabeçalho ou rodapé, como colocá-lo em maiúsculas.

Para documentos produzidos usando `book` os valores predefinidos da classe (frente e verso, `headings` estilo de página), os comandos que geram marcas funcionam da seguinte forma:

* `\chaptermark` gera dados de marca usando `\markboth`
* `\sectionmark` gera dados de marca `\markright`

`\markboth` e `\markright` são macros que, no fim, usam a primitiva (incorporada, de baixo nível) `\mark` comando para inserir efetivamente marcas geradas a partir de comandos de secção.

`\markboth` assume a forma

* **`\markboth{left}{right}`**: insere uma marca (nó) usando `\mark{{left}{right}}` resultando num nó de marca contendo um par de valores entre chavetas `{left}{right}`.

`\markright` assume a forma

* **`\markright{newright}`**: insere uma marca (nó) usando `\mark{{currentleft}{newright}}`; ou seja, altera o valor atual de `direita` para `newright` mas o valor atual de `esquerda` (ou seja, `currentleft`) permanece inalterado, resultando num nó de marca contendo um par de valores entre chavetas `{currentleft}{newright}`.

O comportamento de `\markboth` e `\markright` suportam a hierarquia de secções em dois níveis, como um documento contendo várias secções dentro de cada capítulo.

A título de exemplo para a ( `book` classe de documento (usando o estilo de página headings):

* `\chaptermark` usa `\markboth` para definir:
  * a `{left}` campo que compõe CHAPTER . em maiúsculas.
  * um campo {right} em branco (`{}`)
* `\sectionmark` usa `\markright` para definir o `{right}` campo de marca a compor, também em maiúsculas.

Para entender por que `\sectionmark` usa `\markright` podemos observar que cada novo `\section` comando deve:

* inserir uma nova marca contendo dados para esta `\section` (como o título e o número).
* mas *contém* afetar os valores dos dados de marca para a atual `\chapter` em que esse particular `\section` comando aparece

Por estas razões, o `\section` comando chama `\sectionmark` que usa `\markright` para criar uma `\section`-relacionada: ela atualiza o `{right}` campo de dados de marca, mas não afeta o atual `{left}` valor do campo de dados de marca que foi definido pelo atual `\chapter`.

Nota: o código-fonte do LaTeX contém o aviso:

> Os comandos de marca funcionam razoavelmente bem para marcas direitas ‘numeradas dentro de’ marcas esquerdas—por exemplo, a marca esquerda é alterada por um comando \chapter e a marca direita é alterada por um comando \section. No entanto, produz resultados um pouco anómalos se ocorrerem 2 \markboth na mesma página.

**Comandos para a rotina de saída**

O `\ps@headings` comando implementa definições dos seguintes comandos

* `\@oddhead`
* `\@oddfoot`
* `\@evenhead`
* `\@evenfoot`

que são usados pela rotina de saída para adicionar cabeçalhos e rodapés durante a fase final da composição da página. Por exemplo, `book.cls` define `\@oddfoot` e `\@evenfoot` para o valor `\@empty`, que é definido como `\def\@empty{}`, assim `\ps@headings` produz rodapés vazios em páginas à esquerda e à direita:

```latex
\let\@oddfoot\@empty
\let\@evenfoot\@empty
```

Os cabeçalhos são definidos como:

```latex
\def\@evenhead{\thepage\hfil\slshape\leftmark}%
\def\@oddhead{{\slshape\rightmark}\hfil\thepage}%
```

onde

* `\leftmark` extrai o `{left}` valor de um `{left}{right}` par de marcas
* `\rightmark` extrai o `{right}` valor de um `{left}{right}` par de marcas
* \thepage exibe o número da página atual

Em essência, estas implementações de `\@evenhead` e `\@oddhead` produzem os seguintes resultados:

* `\@evenhead`: o número da página aparece à esquerda do cabeçalho e o conteúdo de `\leftmark`, estilizado com o comando de fonte `\slshape`, é apresentado à direita do cabeçalho — o espaço em branco entre eles é fornecido pela muito flexível `\hfil` glue.
* `\@oddhead`: o conteúdo de `\rightmark`, estilizado com o comando de fonte `\slshape`, aparece à esquerda do cabeçalho e o número da página atual é apresentado à direita do cabeçalho — novamente, o espaço em branco entre eles é fornecido por `\hfil` glue.

No entanto, permanece uma questão-chave: *quais* `{left}{right}` par de marcas é usado por `\leftmark` e `\rightmark`: por outras palavras, de onde obtêm os seus valores de dados de marca?

Como [observado acima](#filtering) mas [explicado abaixo](#explainfiltering), durante as fases finais de composição da página, quaisquer marcas contidas nas páginas do documento são “filtradas” e usadas para definir o valor de três variáveis globais de marca: `\botmark`, `\topmark` e `\firstmark`. Devido à [estrutura das marcas do LaTeX](#latexs-model-of-headers-and-footers), cada uma dessas 3 variáveis de marca acabará por conter um valor de `{left}{right}` para algum par de valores `{left}` e `{right}` e são estes que fornecem o par de `{left}{right}` marcas reais (campos) para `\leftmark` e `\rightmark`:

* `\leftmark` extrai o `esquerda` valor de um `{left}{right}` par de marcas (campos) fornecido por `\botmark`
* `\rightmark` extrai o `direita` valor de um `{left}{right}` par de marcas fornecido por `\firstmark`

Nota `\markboth` e `\markright` podem conter comandos para estilizar o texto do cabeçalho e rodapé — como a conversão para maiúsculas.

### Exemplos usando comandos de baixo nível do LaTeX

Os exemplos seguintes demonstram alterações aos estilos de página ou aos cabeçalhos e rodapés ao redefinir alguns dos comandos de baixo nível (internos) do LaTeX discutidos neste artigo (os que contêm o símbolo @). Não estamos a defender este método para alterar cabeçalhos e rodapés, mas ele está disponível para quem precisar dele (por exemplo, autores de pacotes). A solução preferida para alterar cabeçalhos e rodapés é usar o [`fancyhdr` pacote](https://ctan.org/pkg/fancyhdr?lang=en), que é discutido numa [artigo de ajuda do Overleaf](/latex/overleaf-learn-latex-pt/formatacao/02-headers-and-footers.md).

#### Definindo um estilo de página mínimo

O exemplo seguinte define um novo estilo de página, extremamente minimalista, chamado `demostyle` que usa texto estático para definir os cabeçalhos e rodapés e não depende de comandos de secção (`\chapter`, `\section` etc.) para definir o conteúdo do cabeçalho e do rodapé.

O exemplo começa por alterar o código de categoria do `@` carácter para 11 para que possa ser usado dentro de nomes de macros. O `\ps@demostyle` comando implementa o nosso estilo de página minimalista ao redefinir os comandos usados (na rotina de saída) para produzir os cabeçalhos e rodapés: `\@oddhead`, `\@oddfoot`, `\@evenhead` e `\@evenfoot`. Note o `twoside` opção na nossa `\documentclass` declaração — que usa a `article` classe.

```latex
\documentclass[twoside]{article}
\catcode`@=11
\newcommand{\ps@demostyle}{%
\renewcommand\@oddfoot{\hfil Rodapé da página ímpar\hfil}%
\renewcommand\@evenfoot{\hfil Rodapé da página par\hfil}%
\renewcommand\@evenhead{\thepage\hfil Cabeçalho da página par}%
\renewcommand\@oddhead{Cabeçalho da página ímpar\hfil\thepage}}
\catcode`@=12
\title{Demonstrando um estilo de página}
\author{Overleaf}
\date{Agosto de 2022}
\begin{document}
\pagestyle{demostyle}
\maketitle
\newpage
\section{Introdução}
\newpage
\section{Mais material}
\end{document}
```

[Abra este exemplo no Overleaf](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Creating+a+new+page+style\&snip=%5Cdocumentclass%5Btwoside%5D%7Barticle%7D%0A%5Ccatcode%60%40%3D11%0A%5Cnewcommand%7B%5Cps%40demostyle%7D%7B%25%0A%5Crenewcommand%5C%40oddfoot%7B%5Chfil+The+odd-page+footer%5Chfil%7D%25%0A%5Crenewcommand%5C%40evenfoot%7B%5Chfil+The+even-page+footer%5Chfil%7D%25%0A%5Crenewcommand%5C%40evenhead%7B%5Cthepage%5Chfil+The+even-page+header%7D%25%0A%5Crenewcommand%5C%40oddhead%7BThe+odd-page+header%5Chfil%5Cthepage%7D%7D%0A%5Ccatcode%60%40%3D12%0A%5Ctitle%7BDemonstrating+a+page+style%7D%0A%5Cauthor%7BOverleaf%7D%0A%5Cdate%7BAugust+2022%7D%0A%5Cbegin%7Bdocument%7D%0A%5Cpagestyle%7Bdemostyle%7D%0A%5Cmaketitle%0A%5Cnewpage%0A%5Csection%7BIntroduction%7D%0A%5Cnewpage%0A%5Csection%7BMore+material%7D%0A%5Cend%7Bdocument%7D)

#### Alterando cabeçalhos para a classe book

O exemplo seguinte altera os cabeçalhos para a classe book ao redefinir `\@oddhead` e `\@evenhead` de modo que os cabeçalhos das páginas à esquerda e à direita contenham o número da página atual e o título do capítulo. Note como o segundo `\chapter` comando usa o título curto opcional do capítulo `[O título curto]` que agora fornece o texto do cabeçalho, em vez do título longo.

`\section` os comandos não têm efeito no conteúdo do cabeçalho porque as nossas redefinições do cabeçalho usam apenas `\leftmark` que obtém detalhes do capítulo atual. Para aceder aos detalhes da secção atual, precisaríamos usar `\rightmark` na definição de `\@oddhead` e/ou `\evenhead`.

```latex
\documentclass{book}
% NB: o código de categoria de '@' é temporariamente alterado para 11
% para permitir o seu uso em nomes de comandos
\catcode `@=11
% Faça \@oddfoot e \evenfoot serem equivalentes a \@empty
% para os tornar em branco (vazios)
\let\@oddfoot\empty\let\evenfoot\empty
% Redefina \@oddhead e \@evenhead
\renewcommand{\@oddhead}{\leftmark\hfil\thepage}
\renewcommand{\@evenhead}{\thepage\hfil\leftmark}
\catcode `@=12
% Use um tamanho de página convenientemente pequeno
\usepackage[paperheight=16cm,paperwidth=12cm,textwidth=10cm]{geometry}
\title{Memórias de um utilizador de \TeX{}}
\author{Overleaf}
\begin{document}
\frontmatter
\maketitle
Esta é a parte inicial que usa algarismos romanos.
\mainmatter
\chapter{Por onde começo?}
Capítulo 1: Um capítulo curto.
\newpage
\section{No início...}
Uma secção.
\chapter[O título curto]{Um capítulo com um título muito longo, tornando-o inadequado para cabeçalhos}
\newpage
\section{Outra secção}
Com pouco conteúdo.
\newpage
\section{O quê, outra secção?}
Também com pouco conteúdo.
\end{document}
```

[Abra este exemplo no Overleaf](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Changing+headers+for+the+book+class\&snip=%5Cdocumentclass%7Bbook%7D%0A%25+NB%3A+category+code+of+%27%40%27+temporarily+changed+to+11%0A%25+to+enable+its+use+in+command+names%0A%5Ccatcode+%60%40%3D11%0A%25+Let+%5C%40oddfoot+and+%5Cevenfoot+be+equivalent+to+%5C%40empty%0A%25+to+make+them+blank+%28empty%29%0A%5Clet%5C%40oddfoot%5Cempty%5Clet%5Cevenfoot%5Cempty%0A%25+Redefine+%5C%40oddhead+and+%5C%40evenhead%0A%5Crenewcommand%7B%5C%40oddhead%7D%7B%5Cleftmark%5Chfil%5Cthepage%7D%0A%5Crenewcommand%7B%5C%40evenhead%7D%7B%5Cthepage%5Chfil%5Cleftmark%7D%0A%5Ccatcode+%60%40%3D12%0A%25+Use+a+conveniently+small+page+size%0A%5Cusepackage%5Bpaperheight%3D16cm%2Cpaperwidth%3D12cm%2Ctextwidth%3D10cm%5D%7Bgeometry%7D%0A%5Ctitle%7BMemoirs+of+a+%5CTeX%7B%7D+user%7D%0A%5Cauthor%7BOverleaf%7D%0A%5Cbegin%7Bdocument%7D%0A%5Cfrontmatter%0A%5Cmaketitle%0AThis+is+frontmatter+which+uses+Roman+numerals.%0A%5Cmainmatter%0A%5Cchapter%7BWhere+do+I+start%3F%7D%0AChapter+1%3A+A+short+chapter.%0A%5Cnewpage%0A%5Csection%7BIn+the+beginning...%7D%0AA+section.%0A%5Cchapter%5BThe+short+title%5D%7BA+chapter+with+a+very+long+title%2C+making+it+unsuitable+for+headers%7D%0A%5Cnewpage%0A%5Csection%7BAnother+section%7D%0AWith+little+content.%0A%5Cnewpage%0A%5Csection%7BWhat%2C+another+section%3F%7D%0AAlso+with+little+content.%0A%5Cend%7Bdocument%7D)

#### Usando os comandos de marcas estendidas do ε-TeX

O `book` classe usa as seguintes definições de `\@evenhead` e `\@oddhead` para produzir cabeçalhos:

```latex
\def\@evenhead{\thepage\hfil\slshape\leftmark}
\def\@oddhead{{\slshape\rightmark}\hfil\thepage}
```

onde os comandos `\leftmark` e `\rightmark` são definidos como

```latex
\def\leftmark{\expandafter\@leftmark\botmark\@empty\@empty}
\def\rightmark{\expandafter\@rightmark\firstmark\@empty\@empty}
```

Usando os comandos estendidos do ε-TeX, e a equivalência entre a classe de marca 0 do ε-TeX e os comandos originais do TeX, podemos:

* reescrever `\leftmark` para substituir `\botmark` com o `\botmarks0` equivalente, e
* reescrever `\rightmark` para substituir `\firstmark` com o `\firstmarks0` equivalente

Estas redefinições produzem

```latex
\renewcommand{\leftmark}{\expandafter\@leftmark\botmarks0\relax\@empty\@empty}
\renewcommand{\rightmark}{\expandafter\@rightmark\firstmarks0\relax\@empty\@empty}
```

Note o uso de `\relax` para terminar a procura do TeX por mais dígitos — também pode substituir `\relax` por um espaço para atuar como terminador.

O exemplo seguinte produz saída que é idêntica às definições originais de `\leftmark` e `\rightmark`.

```latex
\documentclass{book}
% Redefine \leftmark e \rightmark para usarem
% \botmarks0 e \firstmarks0, respetivamente
% NB: o código de categoria de '@' é temporariamente alterado para 11
% para permitir o seu uso em nomes de comandos
\catcode `@=11
\renewcommand{\leftmark}{\expandafter\@leftmark\botmarks0\relax\@empty\@empty}
\renewcommand{\rightmark}{\expandafter\@rightmark\firstmarks0\relax\@empty\@empty}
\catcode `@=12
% Use um tamanho de página convenientemente pequeno
\usepackage[paperheight=16cm,paperwidth=12cm,textwidth=10cm]{geometry}
\title{Memórias de um utilizador de \TeX{}}
\author{Overleaf}
\begin{document}
\frontmatter
\maketitle
Esta é a parte inicial que usa algarismos romanos.
\mainmatter
\chapter{Por onde começo?}
Capítulo 1: Um capítulo curto.
\newpage
\section{No início...}
Uma secção.
\newpage
Outra secção.
\end{document}
```

[Abra este exemplo no Overleaf](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Using+%CE%B5-TeX%E2%80%99s+extended+marks+command\&snip=%5Cdocumentclass%7Bbook%7D%0A%25+Redefine+%5Cleftmark+and+%5Crightmark+to+use+%0A%25+%5Cbotmarks0+and+%5Cfirstmarks0+respectively%0A%25+NB%3A+category+code+of+%27%40%27+temporarily+changed+to+11%0A%25+to+enable+its+use+in+command+names%0A%5Ccatcode+%60%40%3D11%0A%5Crenewcommand%7B%5Cleftmark%7D%7B%5Cexpandafter%5C%40leftmark%5Cbotmarks0%5Crelax%5C%40empty%5C%40empty%7D%0A%5Crenewcommand%7B%5Crightmark%7D%7B%5Cexpandafter%5C%40rightmark%5Cfirstmarks0%5Crelax%5C%40empty%5C%40empty%7D%0A%5Ccatcode+%60%40%3D12%0A%25+Use+a+conveniently+small+page+size%0A%5Cusepackage%5Bpaperheight%3D16cm%2Cpaperwidth%3D12cm%2Ctextwidth%3D10cm%5D%7Bgeometry%7D%0A%5Ctitle%7BMemoirs+of+a+%5CTeX%7B%7D+user%7D%0A%5Cauthor%7BOverleaf%7D%0A%5Cbegin%7Bdocument%7D%0A%5Cfrontmatter%0A%5Cmaketitle%0AThis+is+frontmatter+which+uses+Roman+numerals.%0A%5Cmainmatter%0A%5Cchapter%7BWhere+do+I+start%3F%7D%0AChapter+1%3A+A+short+chapter.%0A%5Cnewpage%0A%5Csection%7BIn+the+beginning...%7D%0AA+section.%0A%5Cnewpage%0AAnother+section.%0A%5Cend%7Bdocument%7D)

**Notas sobre o ε-TeX**

Como [anotámos acima](#etex), o ε-TeX introduz o `\marks` comando:

```latex
\marks n {stuff to store}
```

que estende a original `\mark` funcionalidade do motor TeX de Knuth e está disponível em todos os três principais motores TeX: pdfTeX, LuaTeX e XeTeX.

A implementação do ε-TeX também introduz novas variáveis globais de marca `\firstmarks n`, `\botmarks n` e `\topmarks n`: uma para cada classe `n`. Estas variáveis de marca baseadas em classes são determinadas [usando os mecanismos descritos acima](#pre-output-checks-looking-for-mark-nodes), e todas podem ser usadas na produção de cabeçalhos e rodapés.

Pode usar qualquer uma das $$2^{15}$$ = 32768 classes de marca, variando de 0 a 32767, dentro de redefinições de `\leftmark` ou `\rightmark`. Isso assume que forneceu (inseriu) dados de marca adequados para a classe de marca escolhida, `n`, através de `\marks n{{left}{right}}`.

Note que o LuaTeX fornece $$2^{16}$$ = 65536 classes de marca, com `n` variando de 0 a 65535.

**Exemplo usando a classe de marca 10**

Este exemplo demonstra o uso da classe de marca 10 (escolhida aleatoriamente) para criar cabeçalhos de documento. O documento de exemplo compõe 6 páginas que contêm a sequência de marcas apresentada no [exemplo resolvido no final deste artigo](#a-worked-example-to-show-how-tex-engines-determine-values-for-botmark-topmark-and-firstmark). Um estudo desse exemplo mostrará por que o motor TeX selecionou uma marca específica, $$\alpha$$, $$\beta$$, $$\gamma$$ e $$\delta$$, para uso em cada um dos cabeçalhos.

Começamos por definir uma macro de conveniência, `\domark`, que usa `\marks 10` para inserir dados de marca que seguem a convenção do LaTeX `{left}{right}` :

```latex
\newcommand{\domark}[2]{\marks 10{{#1}{#2}}}
```

As marcas da classe 10 são tornadas acessíveis ao mecanismo de cabeçalhos e rodapés do LaTeX ao redefinir `\leftmark` e `\rightmark`—com um pouco de informação extra adicionada:

```latex
\renewcommand{\leftmark}{\expandafter\@leftmark\botmarks10 \@empty\@empty{} (via \texttt{\string\botmarks10})}
\renewcommand{\rightmark}{\expandafter\@rightmark\firstmarks10 \@empty\@empty{} (via \texttt{\string\firstmarks10})}
```

Após inserir várias marcas (da classe 10), o motor TeX (aqui, pdfTeX) cria prontamente variáveis globais de marca para a classe 10 —`\botmarks10`, `\topmarks10` e `\firstsmarks10` quais `\leftmark` e `\rightmark` usadas para produzir os cabeçalhos.

```latex
\documentclass{book}
% Um comando curto para usar marcas com a classe 10
% e seguindo a estrutura de marcas do LaTeX {left}{right}
\newcommand{\domark}[2]{\marks 10{{#1}{#2}}}
% Redefine \leftmark e \rightmark para usarem
% \botmarks10 e \firstmarks10, respetivamente
\catcode`@=11
\renewcommand{\leftmark}{\expandafter\@leftmark\botmarks10 \@empty\@empty{} (via \texttt{\string\botmarks10})}
\renewcommand{\rightmark}{\expandafter\@rightmark\firstmarks10 \@empty\@empty{} (via \texttt{\string\firstmarks10})}
\catcode`@=12
\title{Demonstrando as marcas melhoradas do \(\varepsilon\)-\TeX}
\author{Overleaf}
\date{Agosto de 2022}
\begin{document}

Página 1: Nenhuma marca adicionada, pelo que todas as variáveis de marca permanecem no seu estado inicial: vazias (NULL).

\newpage
Página 2: marca-$\alpha$ adicionada a esta página através de

\verb|\domark{$\alpha$-left}{$\alpha$-right}|\domark{$\alpha$-left}{$\alpha$-right}

\newpage
Página 3: Nenhuma nova marca adicionada a esta página.

\newpage
Página 4: marca-$\beta$ seguida de marca-$\gamma$ adicionadas a esta página através de

\verb|\domark{$\beta$-left}{$\beta$-right}|

\verb|\domark{$\gamma$-left}{$\gamma$-right}|.
\domark{$\beta$-left}{$\beta$-right}
\domark{$\gamma$-left}{$\gamma$-right}

\newpage
Página 5: marca-$\delta$ adicionada a esta página através de

\verb|\domark{$\delta$-left}{$\delta$-right}|
\domark{$\delta$-left}{$\delta$-right}

\newpage
Página 6: Nenhuma marca adicionada a esta página.
\end{document}
```

[Abra este exemplo no Overleaf](https://www.overleaf.com/docs?engine=pdflatex\&snip_name=Using+e-TeX+global+marks+variables\&snip=%5Cdocumentclass%7Bbook%7D%0A%25+A+short+command+to+use+marks+with+class+10%0A%25+and+following+LaTeX%27s+mark+structure+%7Bleft%7D%7Bright%7D%0A%5Cnewcommand%7B%5Cdomark%7D%5B2%5D%7B%5Cmarks+10%7B%7B%231%7D%7B%232%7D%7D%7D%0A%25+Redefine+%5Cleftmark+and+%5Crightmark+to+use+%0A%25+%5Cbotmarks10+and+%5Cfirstmarks10+respectively%0A%5Ccatcode%60%40%3D11%0A%5Crenewcommand%7B%5Cleftmark%7D%7B%5Cexpandafter%5C%40leftmark%5Cbotmarks10+%5C%40empty%5C%40empty%7B%7D+%28via+%5Ctexttt%7B%5Cstring%5Cbotmarks10%7D%29%7D%0A%5Crenewcommand%7B%5Crightmark%7D%7B%5Cexpandafter%5C%40rightmark%5Cfirstmarks10+%5C%40empty%5C%40empty%7B%7D+%28via+%5Ctexttt%7B%5Cstring%5Cfirstmarks10%7D%29%7D%0A%5Ccatcode%60%40%3D12%0A%5Ctitle%7BDemonstrating+%5C%28%5Cvarepsilon%5C%29-%5CTeX%E2%80%99s+enhanced+marks%7D%0A%5Cauthor%7BOverleaf%7D%0A%5Cdate%7BAugust+2022%7D%0A%5Cbegin%7Bdocument%7D%0A%0APage+1%3A+No+marks+added+so+all+mark+variables+remain+in+their+initialized+state%3A+empty+%28NULL%29.%0A%0A%5Cnewpage%0APage+2%3A+%24%5Calpha%24-mark+added+to+this+page+via%0A%0A%5Cverb%7C%5Cdomark%7B%24%5Calpha%24-left%7D%7B%24%5Calpha%24-right%7D%7C%5Cdomark%7B%24%5Calpha%24-left%7D%7B%24%5Calpha%24-right%7D%0A%0A%5Cnewpage%0APage+3%3A+No+new+marks+added+to+this+page.%0A%0A%5Cnewpage%0APage+4%3A+%24%5Cbeta%24-mark+followed+by+%24%5Cgamma%24-mark+added+to+this+page+via%0A%0A%5Cverb%7C%5Cdomark%7B%24%5Cbeta%24-left%7D%7B%24%5Cbeta%24-right%7D%7C%0A%0A%5Cverb%7C%5Cdomark%7B%24%5Cgamma%24-left%7D%7B%24%5Cgamma%24-right%7D%7C.%0A%5Cdomark%7B%24%5Cbeta%24-left%7D%7B%24%5Cbeta%24-right%7D%0A%5Cdomark%7B%24%5Cgamma%24-left%7D%7B%24%5Cgamma%24-right%7D%0A%0A%5Cnewpage%0APage+5%3A+%24%5Cdelta%24-mark+added+to+this+page+via%0A%0A%5Cverb%7C%5Cdomark%7B%24%5Cdelta%24-left%7D%7B%24%5Cdelta%24-right%7D%7C%0A%5Cdomark%7B%24%5Cdelta%24-left%7D%7B%24%5Cdelta%24-right%7D%0A%0A%5Cnewpage%0APage+6%3A+No+marks+added+to+this+page.%0A%5Cend%7Bdocument%7D)

O gráfico seguinte mostra os cabeçalhos produzidos por este exemplo:

![Gráfico que mostra a saída do código LaTeX usando os comandos de marcas estendidas do ε-TeX](/files/f367231ec00b734853654cc0f8e6a455a0543f03)

* **Nota**: O cabeçalho da página 1 é criado num momento em que as três variáveis de marca da classe 10 —`\botmarks10`, `\topmarks10` e `\firstsmarks10`— estão vazias. O resultado final é que `\rightmark` (para a página 1) insere apenas o último fragmento do cabeçalho: `(através de \texttt{\string\firstmarks10})`, como mostrado no gráfico acima.

## Um exemplo resolvido para mostrar como os motores TeX determinam valores para \botmark, \topmark e \firstmark

![Db.gif](/files/58f345e3ec1fb5d65660af2714d7e5482455e871)![Db.gif](/files/58f345e3ec1fb5d65660af2714d7e5482455e871) Parece apropriado replicar o uso de Knuth de sinais de curva perigosa duplos (imagem cortesia de [este sítio](http://www.truetex.com/db.htm)) porque o material é um pouco de baixo nível e “espreita por baixo do capô” — embora esperemos que possa ser do interesse de leitores intrépidos que desejem compreender mais alguns detalhes.

A discussão seguinte baseia-se de perto no último exemplo da página 258 de [O TeXbook](https://www.amazon.co.uk/TeXbook-Donald-Knuth/dp/0201134489). Aqui, editámos e recompusemos esse exemplo para quem não tem acesso a The TeXbook:

![Uma versão editada e recomposta de um exemplo da página 258 de The TeXbook](/files/07c11e883f57597ad79fbb80ee577e600ab54a4f)

A tabela apresentada neste gráfico é reproduzida de uma fornecida por Knuth, mas, tal como a original, não há explicação de como foi derivada. Aqui vamos abordar isso para fornecer detalhes adicionais que mostram como esses valores de `\botmark`, `\topmark` e `\firstmark` foram determinados — obter estes detalhes exigiu explorar o código-fonte de um motor TeX!

O processo de definição de valores para `\botmark`, `\topmark` e `\firstmark` pode ser resumido em 3 pequenos fragmentos de pseudocódigo, como mostrado no diagrama seguinte e nas explicações subsequentes:

1. Verificação pré-conteúdo
2. Ciclo de conteúdo
3. Verificação pós-conteúdo

Nota:

* Os testes no passo 1 “Verificação pré-conteúdo” e no passo 3 “Verificação pós-conteúdo” são realizados uma vez por página.
* O passo 2 “Ciclo de conteúdo” envolve o TeX a percorrer o conteúdo da página procurando nós de marca e usando-os para definir os valores das variáveis de marca, como mostrado.

![Imagem que mostra versões em pseudocódigo do código usado para definir valores para as três variáveis globais de marca usadas pelos motores TeX](/files/49a6c9338f7fcbd514defc15d98168bd5a7c1760)

Sempre que o TeX encontra uma quebra de página adequada, envia o conteúdo dessa página para processamento final, realizando estes (três) passos de processamento de marcas em cada página do seu documento. Os passos de processamento identificados como 1, 2 e 3 são referenciados no diagrama final dentro desta secção.

Note que:

* antes de a primeira página ter sido processada, as três variáveis globais de marca `\botmark`, `\topmark` e `\firstmark` foram inicializadas para vazias (NULL).
* os valores finais de `\botmark`, `\topmark` e `\firstmark` determinados no fim da *anterior* página tornam-se os valores (de entrada) para processar a *atual* página — a que está a ser processada.

Os seguintes fragmentos de código são ***pseudocódigo*** derivados (resumidos) do código-fonte real do motor TeX. O objetivo é fornecer um resumo conciso do código que ajude a demonstrar os princípios-chave envolvidos.

**Passo 1: Verificação pré-conteúdo** Antes de o TeX percorrer o conteúdo real da página atual, verifica se o atual `\botmark` valor — ou seja, resultante da *anterior* página — está vazio (NULL):

```latex
if(\botmark != NULL)
{
   \topmark = \botmark;
   \firstmark= NULL;
}
```

Neste teste, se `\botmark` (da *anterior* página) estiver *contém* vazio:

* `\topmark` para a *atual* página é definido para o *anterior* da página `\botmark` valor
* `\firstmark`, para a *atual* página (a ser processada), é definido para vazio (NULL): comece esta página assumindo que não há `\mark` nós.

Note que este teste é realizado *uma vez* para cada página que está a ser processada.

**Passo 2: Ciclo de conteúdo** De seguida, o TeX percorre o conteúdo da página; parte desse ciclo inclui procurar `\mark` nós:

```latex
if(type(node)==mark_node)
{
   if(\firstmark==NULL)
   {
      \firstmark=node(text);
   }
   \botmark= node(text);
}
```

Este teste é aplicado a cada nó de marca localizado dentro (contido em) da página atual. O teste anterior (Passo 1, acima) poderia ter definido `\firstmark` para vazio, de modo que a primeira marca encontrada na página atual se torne o valor de `\firstmark` e `\botmark`. Qualquer *subsequente* `\mark` nó detetado ao executar este ciclo não alterará o valor de `\firstmark`, porque ele já não está vazio (NULL), mas `\botmark` é atualizado — porque esse é o propósito de `\botmark`: armazenar o último `\mark` nó visto para esta página.

**Passo 3: Verificação pós-conteúdo** Depois de percorrer o conteúdo da página, o TeX aplica o seguinte teste final, que também é realizado uma vez por página:

```latex
if((\topmark != NULL)&&(\firstmark==NULL))
{
	\firstmark= \topmark;
}
```

* Se `\topmark` não está vazio (NULL), sabemos, pelo Passo 1, que `\botmark` da página anterior não estava vazio (NULL).
* Se `\firstmark` ainda está vazio, então não vimos nenhum `\mark` nós porque o teste no Passo 2 não foi acionado; consequentemente, `\firstmark` é definido como o valor de `\topmark` que também é o valor de `\botmark` da página anterior.

Após a aplicação sequencial destes três passos a todas as 6 páginas do nosso exemplo, os valores de `\botmark`, `\topmark` e `\firstmark` são derivados usando as transições mostradas no diagrama abaixo, onde:

* os retângulos arredondados azul-claro são os valores finais da variável de marca para cada página
* os quadrados arredondados cinzento-claro representam valores intermédios que surgem durante o processamento
* as setas com rótulos representam alterações nos valores das variáveis de marca de acordo com os passos 1, 2 ou 3 no diagrama acima — ou um valor não foi alterado por nenhum dos passos; rotuladas “sem alteração”.

O diagrama seguinte mostra como os três fragmentos de pseudocódigo geram os valores finais de `\botmark`, `\topmark` e `\firstmark` listados na tabela contida na página 258 de The TeXbook.

![Um diagrama de transição que acompanha o exemplo da página 258 de The TeXbook, mostrando transições internas à medida que as variáveis globais de marca recebem os seus valores](/files/1b20bd2f75b902938983b53f4b7939ffce22028a)


---

# 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/23-how-does-latex-typeset-headers-and-footers.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.
