%! Public Domain Software 2022-2025
%! 2025-07-17
%! 4.0.0-beta
%! Elayson Abreu
%! abntexto.classe@gmail.com

% \codesection{RECOMENDAÇÕES\label{codesec:rec}}

% Macros internas não devem ser modificadas ou usadas direta ou indiretamente no seu documento. Isso porque
% essas macros podem ser redefinidas ou até renomeadas em futuras versões desta
% classe. Por macros internas entende-se aquelas com o prefixo do pacote em
% questão, neste caso, `tnba@`. Se você precisa de algum comando interno, defina
% outro sem anexar o prefixo.

% Redefinir arquivos `.sty`, `.cls`, entre outros, diretamente no diretório da sua distribuição TeX também não é aconselhado, pelo mesmo motivo exposto no parágrafo anterior.

% Copiar arquivos `.sty`, `.cls` etc. para o mesmo diretório do seu documento e modificá-los pode ser útil. Nesse caso, é preciso renomeá-los após as alterações para não haver confusão em relação ao original (principalmente se o arquivo alterado for compartilhado).

% \codesection{ESTILO DE CÓDIGO}

% O formato Plain \TeX\ define atalhos como `\chardef\@ne=1` e `\chardef\tw@=2` que, na época em que foi concebido, nos anos 80, serviam para diminuir o tempo de compilação\footnote{\url{https://tex.stackexchange.com/questions/9787/ne-tw-thr}.}. Para fins semelhantes, \LaTeX\ define `\def\hb@xt@{\hbox to}`, `\def\@height{height}` e outros mais. Com a eficiência computacional atual, todavia, esses atalhos só são úteis em situações onde se queira a máxima performance. Sendo assim, no `abntexto`, esses atalhos serão deixados de lado em favor da legibilidade de código.

% Além disso, arrobas (@) serão evitados de modo geral a fim de reduzir a necessidade do uso de `\makeatletter` e `\makeatother` em documentos.

% \codesection{INICIALIZAÇÃO}

% Identificação do formato \TeX\ e da classe.

% \begin{code}
\NeedsTeXFormat{LaTeX2e}

\ProvidesClass{abntexto}%
    [2025-07-17 4.0.0-beta Preparation of works in ABNT standards]
%. \end{code}

% Estas são as únicas dependências do `abntexto`. Os pacotes `enumitem` e
% `etoolbox` foram adicionados nesta versão (4.0.0-beta). O primeiro permite personalizar listas usando interfaces \emph{key-value}. O segundo oferece macros úteis como `\appto` e `\csletcs` para programadores de macros.

% \begin{code}
\LoadClass{article}

\RequirePackage{geometry}
\RequirePackage{graphicx}
\RequirePackage[autostyle=true]{csquotes}
\RequirePackage{enumitem}
\RequirePackage{etoolbox}
%. \end{code}

% Atalhos para `\ClassWarning` e `\ClassError`.

% \begin{code}
\def\tnba@warning#1{\ClassWarning{abntexto}{#1.}}
\def\tnba@error#1{\ClassError{abntexto}{#1}{}}
%. \end{code}

% Os comandos `\pdfbookmark` e `\phantomsection` pertencem ao `hyperref.sty`. Infelizmente, no entanto, o `\pdfbookmark` insere um destino de \emph{link} sem altura, por isso teremos de utilizar parametrizar `\Hy@writebookmark` por meio de `\makeoutline`.

% Parametrizaremos `\NR@gettitle` para suporte ao `nameref.sty`, por meio de `\processsectitle`. Infelizmente, o comando \NR@gettitle não tem versão não-prefixada. A instrução `\processsectitle` expande para `\NR@gettitle` caso o pacote `nameref` esteja carregado. Do contrário, `\processsectitle` está programado para absorver o argumento. A instrução `\NR@gettitle`, de fato, configura `\@currentlabelname` para ser usado em `\nameref`.

% \begin{code}
\AtBeginDocument{%
    \@ifpackageloaded{hyperref}{%
        \def\makeoutline#1#2#3{\Hy@writebookmark{#2}{#3}{\@currentHref}{#1}{toc}}%
    }{%
        \def\makeoutline#1#2#3{}%
        \def\phantomsection{}%
    }%
    \@ifpackageloaded{nameref}{%
        \def\processsectitle#1{\NR@gettitle{#1}}%
    }{%
        \def\processsectitle#1{}%
    }%
}
%. \end{code}

% O `hyperref.sty` verifica se `\pdfstringdefPreHook` existe. Se sim, ele é usado, senão um novo é criado. Essa âncora servirá para desativar comandos que devem expandir de forma diferente nas linhas da Lista de Marcadores do PDF.

% \begin{code}
\def\pdfstringdefPreHook{}
%. \end{code}

% \codesection{A MACRO \type{\\eqbox}}

% A macro \`\eqbox` foi adaptada de OpTeX e foi introduzida nesta
% versão do `abntexto` (4.0.0-beta). São caixas que, ao receberem um mesmo
% rótulo, vão se igualar com a largura da maior caixa após duas compilações \cite{optex}. Exemplo de uso:

% \leavevmode
% \hbox{\begin{xp}[boxpos=t]
%   \noindent
%   \eqbox{x}{ab}?\\
%   \eqbox{x}{abc}?\\
%   \eqbox{x}{abcd}?
%. \end{xp}}\quad
% \hbox{\vtop{
%   \noindent
%   \eqbox{x}{ab}?\\
%   \eqbox{x}{abc}?\\
%   \eqbox{x}{abcd}?
% }}
% \par\nointerlineskip\vbox{}

% Elas serão úteis para definir a largura dos rótulos do Sumário, Listas de
% Siglas, Abreviaturas, Símbolos, Figuras e estruturas semelhantes. Do
% contrário, o usuário final precisaria pôr valores para `\toclabelwidth`,
% `\appendixlabelwidth`, `\annexlabelwidth`, entre outros, para que, assim, após 10 ou 15
% compilações manuais, alcançar um valor próximo do exato. Se a fonte ou
% tamanho de fonte forem alterados, mais compilações seriam necessárias.

% Diferente da versão em OpTeX, a `\eqbox` nesta classe foi modificada para ter
% uma sintaxe LaTeX-amigável: `\eqbox[<alinhamento horizontal>]{<rótulo>}{<texto>}`.
% Os valores para o parâmetro opcional são `l`, `c` ou `r`. Se o parâmetro
% opcional não for chamado, `l` é usado como padrão \cite{optex}.

% Na primeira compilação, a instrução `\eqbox` anexa `\Xeqbox{<rótulo>}{<largura>}` no arquivo auxilar `.aux` e as caixas são imprimidas na forma que estão. Já na segunda compilaçao, `\begin{document}` chama `\input{\jobname.aux}` e cada ocorrência de `\Xeqbox{<rótulo>}{<largura>}` entra em ação. A aparência das caixas no arquivo `.aux` é semelhante a exemplificada a seguir:
% \begin{xp}
%   \Xeqbox{<rótulo>}{5.8769pt}
%   \Xeqbox{<rótulo>}{8.2784pt}
%   \Xeqbox{<rótulo>}{12.877pt}
%. \end{xp}

% O arquivo `.aux` é chamado entre `\begingroup` e `\endgroup`, exigindo que prefixemos
% `\global` em `\csdef` para que o valor `\tnba@eqb@<rótulo>` se torne conhecido.

% Por fim, o valor da maior largura de uma caixa de determinado rótulo é acessível por meio de \`\eqboxsize`\nobreak`{<rótulo>}{<valor>}`, também foi copiada do formato OpTeX \cite{optex}. Na primeira compilação, `\eqboxsize` utiliza <valor> como largura. Essa macro é expansível em contextos de expansão completa (dentro de `\edef`, por exemplo).

% O `\eqbox` terá o \emph{status} `\protected` para não ser expandido por `\MakeUppercase`.

% \begin{code}
\def\Xeqbox#1#2{%
    \ifcsname tnba@eqb@#1\endcsname
        \ifdim #2>\csname tnba@eqb@#1\endcsname\relax \global\csdef{tnba@eqb@#1}{#2}\fi
    \else \global\csdef{tnba@eqb@#1}{#2}\fi
}
\protected\def\eqbox{\@ifnextchar[\starteqbox{\starteqbox[l]}}

\def\starteqbox[#1]#2#3{\setbox0=\hbox{{#3}}%
    \immediate\write\@auxout {\string\Xeqbox{#2}{\the\wd0}}%
    \ifcsname tnba@eqb@#2\endcsname
        \hbox to\csname tnba@eqb@#2\endcsname{%
             \ifcsname starteqbox#1\endcsname \csname starteqbox#1\endcsname\relax
             \else \tnba@warning{Parâmetro opcional "#1" desconhecido em "\string\eqbox".
                                 Use "l", "r" ou "c"}\starteqboxl
             \fi
        }%
    \else \tnba@obs@eqbox \box0 \fi
}
\def\starteqboxl{\unhbox0\hss}
\def\starteqboxr{\hss\unhbox0}
\def\starteqboxc{\hss\unhbox0\hss}

\def\tnba@obs@eqbox{\tnba@warning{Recompile para o cálculo da \string\eqbox}%
    \global\let\tnba@obs@eqbox=\relax
}

\appto\pdfstringdefPreHook{%
    \def\eqbox#1#2{#2}%
}

\def\eqboxsize#1#2{\ifcsname tnba@eqb@#1\endcsname\csname tnba@eqb@#1\endcsname\else#2\fi}
%. \end{code}

% \codesection{FONTE TIPOGRÁFICA}

% O tamanho 12\,pt foi definido usando
% \`\definesize` e é o tamanho padrão da classe. Com ele foi definido um
% tamanho menor \`\abntsmall`.

% Para configurar um tamanho de fonte para o documento, precisamos definir
% `\normalsize` por meio de
% \begin{xp}
%   \definesize\<seletor>{<tamanho>}%
%                        {<entrelinha simples>}{<instruções extras>}
%. \end{xp}
% A seguir, um documento exemplificando seu uso:
% \begin{xp}
%   \documentclass{abntexto}
%   \usepackage{lmodern}
%   \definesize\normalsize{17pt}{20pt}{}
%   \begin{document}
%       Texto lorem lipsum dolor
%   \end{document}
%. \end{xp}
% O exemplo acima já produz efeito sobre o tamanho de fonte, porque o
% LaTeX inicializa `\normalsize` durante `\begin{document}`.

% \codesubsection{O ponto \TeX\ \emph{versus} o ponto DTP}

% Quando \TeX\ foi criado, a unidade ponto (pt) valia $1\over72,27$ de polegada pelo Sistema de Ponto Americano. Donald Knuth adotou esse padrão. Nos anos que seguiram, com o advento da impressão digital, o ponto passou a ser aceito como $1\over72$ de polegada. Esse ponto é conhecido como Desktop Publishing Point, PostScript Point ou CSS Point. Felizmente, \TeX\ tem suporte para o ponto DTP através da unidade \enquote{bp} (\emph{big point})\footnotemark. Vamos usá-la na definição da entrelinha e tamanho de fonte nos seletores do `abntexto`.

% \bgroup
% \def\UrlBreaks{\do\-}
% \footnotetext{\url{https://tex.stackexchange.com/questions/200934/why-does-a-tex-point-differ-from-a-desktop-publishing-point}.}
% \egroup

% \codesubsection{Definindo conjuntos de tamanho de fonte}

% Até a versão anterior do `abntexto` (3.2.1-beta), o comando `\small` era usado para selecionar o tamanho menor e uniforme conforme a ABNT NBR 10\,520: \Enquote{Recomenda-se, quando digitado, a fonte tamanho 12 para todo o trabalho, inclusive capa, excetuando-se citações com mais de três linhas, notas de rodapé, paginação, dados internacionais de catalogação-na-publicação, legendas e fontes das ilustrações e das tabelas, que devem ser em \textit{tamanho menor e uniforme} \cite[p.~10, grifo próprio]{abnt-2024-14724-trabalhos-academicos}.} Nesta versão, 4.0.0-beta, ele será renomeado para `\abntsmall`, de forma a não haver confusão com o significado original do comando `\small` da classe `article`. Por enquanto, o significado de `\small` será igual ao de `\abntsmall` para compatibilidade com documentos antigos.

% \begin{code}
\input{size12.clo}
\def\definesize#1#2#3#4{\DeclareRobustCommand#1{\@setfontsize{#1}{#2}{#3}#4\relax}}
\definesize\normalsize{12bp}{13.8bp}{} % 13.8 = 12 * 1.15
\definesize\abntsmall{10bp}{11.5bp}{} % 11.5 = 10 * 1.15
\def\small{\abntsmall} % Para compatibilidade com versões anteriores da classe.
\normalsize
%. \end{code}

% \codesubsection{Espaçamento simples e de 1,5 do Microsoft Word}

% Até a versão anterior (3.2.1-beta), o `abntexto` utilizava a fórmula
% $$
%    `\baselineskip` = <tamanho de fonte> * <fator espaçamento>
% $$
% para o cálculo do espaçamento simples e de 1,5, onde o <tamanho de fonte> é dado em pontos. Nela, se o fator espaçamento simples for de 1,2 e o tamanho da fonte for de 12~pt, teremos o valor $`\baselineskip` = 12 * 1,2 = 14,4$~pt para a entrelinha simples. No entanto, quando a \textcite{abnt-2024-14724-trabalhos-academicos} menciona as expressões \enquote{espaçamento simples} e \enquote{espaçamento 1,5}, ela deve estar referindo-se às fórmulas wordianas desses conceitos, exigindo uma análise mais aprofundada sobre eles: \Enquote{Todo texto deve ser digitado ou datilografado com espaçamento 1,5 entre as linhas, excetuando-se as citações de mais de três linhas, notas de rodapé, referências, legendas das ilustrações e das tabelas, natureza (tipo do trabalho, objetivo, nome da instituição a que é submetido e área de concentração), que devem ser digitados ou datilografados em espaço simples. As referências, ao final do trabalho, devem ser separadas entre si por um espaço simples em branco \cite[][p.~10]{abnt-2024-14724-trabalhos-academicos}.}

% Segundo a Microsoft\footnotemark, o espaçamento simples é um pouco menor que o espaçamento 1,15 e o espaçamento 1,5 é um pouco menor que o espaçamento 2. Todavia, isso não clarifica-nos acerca da real definição de espaçamento do Word.

% \footnotetext{Extraído da URL: \url{https://www.microsoft.com/en-us/microsoft-365-life-hacks/writing/single-spacing-vs-double-spacing}.}

% Por enquanto, deixaremos o Word em segundo plano e falaremos sobre outro programa de processamento de texto: Adobe InDesign. De acordo com o ex-cientista principal da Adobe, Dov Isaacs, a fórmula usada no programa Adobe InDesign é\footnote{Extraído da URL: \url{https://community.adobe.com/t5/indesign-discussions/line-spacing-in-indesign/m-p/11586306?profile.language=pt}.}:
% $$
%    `\baselineskip` = <tamanho> * <fator simples> * <fator espaçamento>
% $$
% A qual é, de fato, equivalente a:
% $$
%    `\baselineskip` = <entrel. simples> * <fator espaçamento>
%    \eqno (1)
% $$
% Como consequência, pode-se afirmar que espaçamento simples é sinônimo de espaçamento 1. Partindo do ponto de que essa fórmula é a mesma do Word, vamos ter que
% \begin{topics}
%    \item Abrir o Word\footnote{Versão testada: Office LTSC Professional Plus 2024 - Volume License; Word versão 2048.};
%    \item Remover espaços obtusos conforme \ref{scr:zere};
%          \legend{scr}{Zerando espaços verticais extras}
%          \src{\me}
%          \label{scr:zere}
%          \begin{place}
%             \fbox{\includegraphics{screenshot1.png}}
%          \end{place}
%    \item Aplicar o espaçamento 1,5 e salvar o arquivo em PDF sob o nome `onehalf-word.pdf`.
% \end{topics}

% Em seguida, ao realizar testes empíricos com auxílio do \ref{cd:emp}, o valor <entrelinha> foi incrementado até chegar-se num valor visivelmente próximo ao exibido no Word, constatando-se que o espaçamento 1,5 vale $<entrelinha> = 20,7\hbox{pt}$.

% \legend{code}{Procedimentos empíricos no Plain LuaTeX}
% \src{\me}
% \label{cd:emp}
% \begin{place}
% \begin{xp}[basicstyle=\abntsmall\ttfamily\singlesp]
%   \input luaotfload.sty
%   \font\times="Times New Roman" at12bp \times
%   \baselineskip=<entrelinha> % Valor 20,7pt descoberto.
%   \noindent
%   Lorem ipsum dolor\hfil\break
%   Lorem ipsum dolor\hfil\break
%   Lorem ipsum dolor\hfil\break
%   Lorem ipsum dolor
%   \bye
%. \end{xp}
% \end{place}

% Logo depois, foi feita a divisão $20,7\hbox{pt} \div 12\hbox{pt} \div 1,5\hbox{pt}$ que revela 1,15 como sendo o fator simples. Em seguida, o arquivo foi compilado e salvo sob o nome `onehalf-tex.pdf`. Todavia, não podemos garantir que esse fator, ou a fórmula em questão, são os mesmos em todas as versões passadas/futuras do Word e tampouco os mesmos em todos os tipos e tamanhos de fonte.

% Para fins de comparação, foi compilado o \ref{cd:comparacao-no-lualatex}, exibido na \ref{output:tex-word}.

% \legend{code}{Comparação no LuaLaTeX}
% \src{\me}
% \label{cd:comparacao-no-lualatex}
% \begin{place}
% \begin{xp}[basicstyle=\abntsmall\ttfamily\singlesp]
%   \documentclass{abntexto}
%   \begin{document}
%   \baselineskip=20.7bp
%   \def\.{\kern20.7bp \kern-.4pt % Correção da largura da linha de base.
%          \hrule width8cm height.4pt}
%   \vbox to0pt{\kern-6bp \.\.\.\.\vss}
%   \fbox{\vbox to3cm{\hsize=3.5cm\includegraphics[trim=70 690 420 72]{onehalf-tex.pdf}\vss}}%
%   \fbox{\vbox to3cm{\hsize=3.5cm\includegraphics[trim=83 690 420 72]{onehalf-word.pdf}\vss}}
%   \end{document}
%. \end{xp}
% \end{place}

% \legend{output}{Arquivo \type{onehalf-tex.pdf} à esquerda; \type{onehalf-word.pdf} à direita}
% \src{\me}
% \label{output:tex-word}
% \begin{place}\vbox\bgroup\hsize=7.5cm
%   \baselineskip=20.7bp
%   \def\.{\kern20.7bp \kern-.4pt
%          \hrule width8cm height.4pt}
%   \vbox to0pt{\kern-6bp \.\.\.\.\vss}
%   \fbox{\vbox to3cm{\hsize=3.5cm\includegraphics[trim=70 690 420 72]{onehalf-tex.pdf}\vss}}%
%   \fbox{\vbox to3cm{\hsize=3.5cm\includegraphics[trim=83 690 420 72]{onehalf-word.pdf}\vss}}
% \egroup
% \end{place}

% O comando `\linespread{<fator espaçamento>}` é exatamente o que precisamos para implementar a fórmula~(1) nos espaçamentos simples e de 1,5. Tomemos o exemplo:
% \begin{xp}
%   \normalsize\linespread{1.5}\selectfont
%. \end{xp}
% Ele expande, em essência, para `\set@fontsize`\footnote{Não confundir com \type{\\@setfontsize} que também existe.}:
% \begin{xp}
%   \fontsize{12pt}{13.8pt}\selectfont
%   \set@fontsize{1.5}{\f@size}{\f@baselineskip}\selectfont
%. \end{xp}
% As macros `\f@size` e `\f@baselineskip` expandem para o tamanho de fonte atual em~`pt` (sem a unidade) e a entrelinha simples atual em~`pt` (com a unidade). Dessa forma, teremos, em essência:
% \begin{xp}
%   \fontsize{12pt}{13.8pt}\selectfont
%   \set@fontsize{1.5}{12}{13.8pt}\selectfont
%. \end{xp}
% Finalmente, após mais uma etapa de expansão, obteremos, em essência:
% \begin{xp}
%   \fontsize{12pt}{13.8pt}\selectfont
%   \baselineskip=13.8pt \baselineskip=1.5\baselineskip
%. \end{xp}
% Onde o tamanho de fonte 12~pt permaneceu inalterado e a entrelinha foi configurada para
% $$
%   `\baselineskip` = \hbox{13.8~pt} * 1.5 \eqno \hbox{\vrule width1.5ex height1.5ex}
% $$
% Que corresponde à aplicação da fórmula~(1).

% A \textcite{abnt-2024-14724-trabalhos-academicos} não recomenda espaçamento duplo em nenhum momento. Portanto, `\doublesp` está obsoleto a partir desta versão do `abntexto`. Por fim, a antiga fórmula usada por `\spacing` também está obsoleta.

% O \`\singlesp` e o \`\onehalfsp` iniciam os espaçamentos simples e de 1,5, respectivamente.

% \begin{code}
\def\singlesp{\linespread{1}\selectfont}
\def\onehalfsp{\linespread{1.5}\selectfont}
\def\doublesp{\tnba@obsolete\doublesp{}\linespread{2}\selectfont}

\def\spacing#1{%
    \tnba@obsolete\spacing{Use "\string\singlesp" ou "\string\onehalfsp", ao invés}%
    \baselineskip=\f@size pt
    \baselineskip=#1\baselineskip
    \ignorespaces
}
%. \end{code}

% \codesection{\emph{LAYOUT}}

% Nas linhas abaixo estão as definições de \`\onesidelayout`, \`\twosidelayout` e \`\eletroniclayout`.

% É importante notar que, cada chamada de `\newgeometry`, reseta, de `\geometry` e `\usepackage`, os valores anteriores de chaves não relacionadas com o tamanho da folha tais como `left`, `top`, `right` e `bottom`, entre outras exigindo que sejam reafirmadas em cada chamada de `\newgeometry`\footnote{Além disso, \type{\\newgeometry} também reseta as opções do \type{\\newgeometry} anterior, apesar disso não estar explicitado no manual.}.

% Este manual erroneamente afirmava que `\newgeometry` resetava `\parindent`.

% \begin{code}
\geometry{a4paper,onecolumn}

\def\onesidelayout{%
    \newgeometry{
        twoside = false,
        left    = 3cm,
        top     = 3cm,
        right   = 2cm,
        bottom  = 2cm
    }%
}
\def\twosidelayout{%
    \newgeometry{
        twoside = true,
        left    = 3cm,
        top     = 3cm,
        right   = 2cm,
        bottom  = 2cm
    }%
}
\def\eletroniclayout{%
    \newgeometry{
        twoside = false,
        left    = 2.5cm,
        top     = 3cm,
        right   = 2.5cm,
        bottom  = 2cm
    }%
}
%. \end{code}

% Os estilos de página \`\pretextual` e \`\textual` são definidos aqui.

% \begin{code}
\frenchspacing
\onehalfsp
\parskip=0pt
\parindent=1.5cm
\emergencystretch=2em

\def\pretextual{%
    \onesidelayout
    \let\@oddhead=\empty
    \let\@evenhead=\empty
    \let\@oddfoot=\empty
    \let\@evenfoot=\empty
}
\def\textual{%
    \twosidelayout
    \def\@oddhead{\hfil\abntsmall\thepage}%
    \def\@evenhead{\abntsmall\thepage\hfil}%
    \let\@oddfoot=\empty
    \let\@evenfoot=\empty
}
%. \end{code}

% O `\pretextual` é iniciado automaticamente pela classe, mas não diretamente, caso o usuário queira redefiní-lo no preâmbulo.

% \begin{code}
\AtBeginDocument{\pretextual}
%. \end{code}

% A \textcite{abnt-2024-14724-trabalhos-academicos} diz que \enquote{para trabalhos digitados ou datilografados somente no anverso, todas as folhas, a partir da folha de rosto, devem ser contadas sequencialmente, considerando somente o anverso. [\dots]}. Todavia, o `abntexto` ainda não tem suporte automático para esse requisito.

% \codesection{SUMÁRIO\label{codesec:sumario}}

% O \`\tocsectionfont`, \`\tocsubsectionfont` e semelhantes foram definidos aqui.

% Aqui, a macro `\extline` foi baseada em `\@dottedtocline`, definida no LaTeX \cite{source2e}. Uma âncora de abstração de nome `\hookextline` foi deixada em `\extline` para permitir que o escritor insira parâmetros de ajuste de parágrafo, do tipo:
% \begin{xp}
%   \def\hookextline{\emergencystretch=2.5em\hbadness=10000\relax}
%. \end{xp}

% A macro `\noprotrusion` foi definida no LaTeX e serve para desabilidar protrusão (\emph{\selectlanguage{english}hanging punctuation}) em entradas do Sumário, que pode ser produzida, por exemplo, pelo `microtype.sty`. Se a sua versão do LaTeX não o possui, defina-o:
% \begin{xp}
%   \def\noprotrusion{\leavevmode\kern-1pt\kern1pt}
%. \end{xp}

% \begin{code}
\def\tocpartfont          {\bfseries\MakeUppercase}
\def\tocchapterfont       {\bfseries\MakeUppercase}
\def\tocsectionfont       {\bfseries\MakeUppercase}
\def\tocsubsectionfont    {\itshape}
\def\tocsubsubsectionfont {\scshape}
\def\tocparagraphfont     {}
\def\tocsubparagraphfont  {}

\def\hookextline{}
\def\extpagenumwidth{1.55em} % \@pnumwidth em article.cls
\def\extrightmargin{2.55em}  % \@tocrmarg em article.cls

% #1 = recuo de parágrafo
% #2 = largura do rótulo
% #3 = fonte tipográfica
% #4 = título
% #5 = número de página
\def\extline#1#2#3#4#5{%
    \begingroup
        \parindent=0pt \leftskip=#1\relax
        \rightskip=\extrightmargin\relax \parfillskip=-\rightskip
        \advance\leftskip by#2\relax
        \hookextline \hskip-#2\relax #3{#4}%
        \extleaders \nobreak\hbox to\extpagenumwidth{\hfil #5\noprotrusion}%
    \nbpar\endgroup
}
%. \end{code}

% O valor `\tocbigvalue` é o espaço vertical que precede as entradas do tipo `\part`; `\tocmedvalue`, o valor que precede seções e capítulos; `\tocsmallvalue`, o valor para as entradas restantes.

% Não existe preenchimento pontilhado entre título e número de página em entradas geradas com `\section`, a não ser que `\usechapters` ou `\useparts` esteja ativo. De qualquer forma, o preenchimento pontilhado em seções pode ser habilitado assim:
% \begin{xp}
%   \appto\hooktocsection{\let\extleaders=\extdotleaders}
% \end{xp}

% A penalidade $-300$ foi retirada de `\@secpenalty` \cite{source2e}.

% \begin{code}
\def\tocbigvalue{1.576em plus1pt} % 2.25em plus1pt em article.cls
\def\tocmedvalue{.7004em plus1pt} % 1em plus1pt em article.cls
\def\tocsmallvalue{0pt plus.2pt}  % article.cls

\def\l@part         #1#2{{\hooktocpart
                          \extline{0pt}\toclabelwidth\tocpartfont{#1}{#2}}}
\def\l@chapter      #1#2{{\hooktocchapter
                          \extline{0pt}\toclabelwidth\tocchapterfont{#1}{#2}}}
\def\l@section      #1#2{{\hooktocsection
                          \extline{0pt}\toclabelwidth\tocsectionfont{#1}{#2}}}
\def\l@subsection   #1#2{{\hooktocsubsection
                          \extline{0pt}\toclabelwidth\tocsubsectionfont{#1}{#2}}}
\def\l@subsubsection#1#2{{\hooktocsubsubsection
                          \extline{0pt}\toclabelwidth\tocsubsubsectionfont{#1}{#2}}}
\def\l@paragraph    #1#2{{\hooktocparagraph
                          \extline{0pt}\toclabelwidth\tocparagraphfont{#1}{#2}}}
\def\l@subparagraph #1#2{{\hooktocsubparagraph
                          \extline{0pt}\toclabelwidth\tocsubparagraphfont{#1}{#2}}}
%. \end{code}

% O `\tocfirst` serve para remover material vertical (penalidades, colas verticais etc.) que não pode ser impresso na primeira entrada do Sumário para que não haja espaço duplicado após `\nonum\notoc\section{Sumário}`. Ele absorve seu argumento na primeira expansão e redefine a si mesmo para `\let\tocfirst=\@firstofone`.

% \begin{code}
\def\hooktocpart   {\tocfirst{\penalty-300\vskip\tocbigvalue}\def\extleaders{\nobreak\hfil}}
\def\hooktocchapter{\tocfirst{\penalty-300\vskip\tocmedvalue}\def\extleaders{\nobreak\hfil}}
\def\hooktocsection{\tocfirst{\penalty-300\vskip\tocmedvalue}\def\extleaders{\nobreak\hfil}}
\def\hooktocsubsection   {\vskip\tocsmallvalue\relax}
\def\hooktocsubsubsection{\vskip\tocsmallvalue\relax}
\def\hooktocparagraph    {\vskip\tocsmallvalue\relax}
\def\hooktocsubparagraph {\vskip\tocsmallvalue\relax}

\def\tocfirst#1{\gdef\tocfirst##1{##1}}

\def\extdotleaders{\nobreak
    \leaders\hbox{$\mathsurround=0pt\mkern4.5mu\hbox{.}\mkern4.5mu$}\hfil
}
\let\extleaders=\extdotleaders
%. \end{code}

% A definição de `\toclabelbox` necessita do `\lowercase` a fim de proteger o segundo argumento de `\eqbox` contra `\MakeUppercase` em situações como
% \begin{xp}
%   \def\tocsectionfont{\MakeUppercase}
% \end{xp}

% A diretiva \`\maketoc` é análoga a instrução `\tableofcontents`, definida em `article.cls`; o `\@starttoc` (definido no LaTeX) pode ser usado não apenas para criar sumários, mas também listas em geral, como Listas de Figuras, Tabelas etc. as quais são armazenadas em arquivos de extensão predefinida, a saber, `.toc`, `.lof`, `.lot`, entre outros.

% O `\tocfirst` precisa ser restaurado ao fim de `\@starttoc` no caso deste ter mais de uma ocorrência no documento.

% \begin{code}
\def\toclabelwidth{\eqboxsize{toc}{2em}}
\def\toclabelbox{\lowercase{\eqbox{toc}}}
\def\toclabel#1{#1\quad}

\appto\pdfstringdefPreHook{%
    \def\quad{\space}%
}

\def\inittocfirst{\gdef\tocfirst##1{\gdef\tocfirst####1{####1}}}
\def\maketoc{\@starttoc{toc}\inittocfirst}
\def\tableofcontents{\nonum\notoc\csname\mainsecname\endcsname{\contentsname
    \@mkboth{\MakeUppercase\contentsname}{\MakeUppercase\contentsname}}%
    \@starttoc{toc}\inittocfirst
} % Para compatibilidade com a classe article.
%. \end{code}

% \codesection{SECIONAMENTO}

% Nesta parte estão definidos os comandos secionais \`\sectionfont`, \`\subsectionfont`, \`\subsubsectionfont`, \`\paragraphfont` e \`\subparagraphfont` assim como \`\abovesection`, \`\belowsection` e similares. Eles podem ser redefinidos pelo usuário.

% \begin{code}
\newcounter{chapter}

\def\sectionfont       {\bfseries\MakeUppercase}
\def\subsectionfont    {\itshape}
\def\subsubsectionfont {\scshape}
\def\paragraphfont     {}
\def\subparagraphfont  {}

\def\abovechapter       {50pt}
\def\abovesection       {\baselineskip}
\def\abovesubsection    {\baselineskip}
\def\abovesubsubsection {\baselineskip}
\def\aboveparagraph     {\baselineskip}
\def\abovesubparagraph  {\baselineskip}

\def\belowchapter       {40pt}
\def\belowsection       {\baselineskip}
\def\belowsubsection    {\baselineskip}
\def\belowsubsubsection {\baselineskip}
\def\belowparagraph     {\baselineskip}
\def\belowsubparagraph  {\baselineskip}

\def\thepart          {\Roman{part}}
\def\thechapter       {\arabic{chapter}}
\def\thesection       {\arabic{section}}
\def\thesubsection    {\thesection .\arabic{subsection}}
\def\thesubsubsection {\thesubsection .\arabic{subsubsection}}
\def\theparagraph     {\thesubsubsection .\arabic{paragraph}}
\def\thesubparagraph  {\theparagraph .\arabic{subparagraph}}
%. \end{code}

% As âncoras `\hookprintchapter` e `\hookprintsection` serão usadas na definição de `\appendix` e `\annex`.

% O comando `\@hangfrom` é oriundo de `source2e.pdf` \cite{source2e}. Ele vai ser útil na formatação das seções.

% A macro `\nbpar` (\emph{no break par}) impede que um parágrafo se quebre entre páginas. A instrução `\endgraf` em sua definição, é um comando do `plain.tex` definido como `\let\endgraf=\par`. Sua função é guardar o significado original de `\par` para situações onde este possa ser redefinido.

% \begin{code}
\def\hookprintchapter{}
\def\hookprintsection{}

\let\hangfrom=\@hangfrom
\def\nbpar{{\interlinepenalty=10000\endgraf}}
%. \end{code}

% Os comandos `\toptitle` e `\bottitle` foram inspirados em `\abovetitle` e `\belowtitle` do OpTeX \cite{optex}. Aqueles tem o mesmo funcionamento dos originais, explicitado nos casos abaixo:
% \begin{topics}
%   \item $`\nobreak\bottitle{<skipA>}` + `\toptitle{<penaltyA>}{<skipB>}`$
%         $$\offinterlineskip\halign{$#$\cr
%           `\nobreak\vskip<skipB>`;
%         \cr}$$
%   \item $<skipA> + `\toptitle{<penaltyB>}{<skipB>}`$
%         $$\offinterlineskip\halign{$#$\cr
%           <penaltyB>`\vskip` \mathop{\fam0 maior} (<skipA>, <skipB>).
%         \cr}$$
% \end{topics}

% \begin{code}
\newskip \savedtitleskip
\newskip \savedlastskip

\def\toptitle #1#2{\savedlastskip=\lastskip
    \ifdim\lastskip>0pt \vskip-\lastskip \fi
    \ifnum\lastpenalty=11333 \vskip-\savedtitleskip \else #1\fi
    \ifdim\savedlastskip>0pt \setbox0=\vbox{#2\global\dimen3=\lastskip}%
    \else \dimen3=\maxdimen \fi
    \ifdim\savedlastskip>\dimen3 \vskip\savedlastskip \else #2\relax \fi
}
\def\bottitle #1{#1\global\savedtitleskip=\lastskip \penalty11333 }
%. \end{code}

% As próximas linhas definem o \emph{layout} dos comandos de seção, sendo que os \emph{designs} de `\printchapter` e `\printpart` não foram baseados no estilo ABNT, mas copiados das classes `book` e `article`, respectivamente.

% A \textcite{abnt-2024-14724-trabalhos-academicos} recomenda que haja um caractere de Espaço entre o contador e o título das seções. No entanto, esta classe optou pelo uso de `\quad`, mas o escritor pode redefinir `\printsection` substituindo `\quad` por Espaço usando o comando `\patchcmd` do `etoolbox.sty` da seguinte forma:
% \begin{xp}
%   \patchcmd{\printsection}{\quad}{\space}{}{}
%   \patchcmd{\printsubsection}{\quad}{\space}{}{}
%   ...
% \end{xp}

% \begin{code}
\def\printpart#1{\hookpart \leavevmode\vfil
    \noindent\targetpart{#1}%
    \begingroup
        \centering\huge\bfseries Parte \thepart \vskip20pt
        \Huge\bfseries #1\par
    \endgroup \newpage
}
\def\printchapter#1{\hookchapter \trytextual
    \leavevmode \vskip\abovechapter\relax
    \noindent\targetchapter{#1}%
    \begingroup
        \raggedright\huge\bfseries
        \ifnonum \else Capítulo \thechapter \vskip20pt \fi
        \Huge\bfseries \hookprintchapter{#1\par}%
    \endgroup
    \chaptermark{#1}%
    \nobreak \bottitle{\vskip\belowchapter}%
}
\def\printsection#1{\hooksection \trytextual
    \par\toptitle{\penalty-300}{\vskip\abovesection}%
    \noindent\targetsection{#1}%
    \ifnonum
        {\centering\sectionfont{\hookprintsection{#1\nbpar}}}%
    \else
        {\sectionfont{\hangfrom{\thesection\quad}#1\nbpar}}\sectionmark{#1}%
    \fi
    \nobreak \bottitle{\vskip\belowsection}%
}
\def\printsubsection#1{\par\toptitle{\penalty-300}{\vskip\abovesubsection}%
    \noindent\targetsubsection{#1}%
    {\subsectionfont{\hangfrom{\thesubsection\quad}#1\nbpar}}\subsectionmark{#1}%
    \nobreak \bottitle{\vskip\belowsubsection}%
}
\def\printsubsubsection#1{\par\toptitle{\penalty-300}{\vskip\abovesubsubsection}%
    \noindent\targetsubsubsection{#1}%
    {\subsubsectionfont{\hangfrom{\thesubsubsection\quad}#1\nbpar}}%
    \nobreak \bottitle{\vskip\belowsubsubsection}%
}
\def\printparagraph#1{\par\toptitle{\penalty-300}{\vskip\aboveparagraph}%
    \noindent\targetparagraph{#1}%
    {\paragraphfont{\hangfrom{\theparagraph\quad}#1\nbpar}}%
    \nobreak \bottitle{\vskip\belowparagraph}%
}
\def\printsubparagraph#1{\par\toptitle{\penalty-300}{\vskip\abovesubparagraph}%
    \noindent\targetsubparagraph{#1}%
    {\subparagraphfont{\hangfrom{\thesubparagraph\quad}#1\nbpar}}%
    \nobreak \bottitle{\vskip\belowsubparagraph}%
}
%. \end{code}

% Aqui estão \`\nonum` e \`\notoc`.

% Os comandos secionais `\part`, `\chapter` e `\section` têm âncoras em suas definições que servem para instruções de quebra de página.

% \begin{code}
\def\hookpart{\clearpage}
\def\hookchapter{\clearpage}
\def\hooksection{\clearpage}

\newif\ifnotoc
\newif\ifnonum

\def\nonum{\global\nonumtrue}
\def\notoc{\global\notoctrue}
\def\resetnonumnotoc{\global\notocfalse \global\nonumfalse}
%. \end{code}

% As diretivas da forma `\target<name>` são, em essência, definidas assim:
% \begin{xp}
%   \def\target<nome>#1{%
%       \refstepcounter{<contador>}%
%       \addcontentsline{<ext>}{<seção>}{#1}}
%. \end{xp}
% O `\refstepcounter` avança o <contador> e cria um destino de \emph{hyperlink}. Já `\addcontentsline`, escreve `#1` num comando da forma `\l@<seção>` e imprime o resultado no arquivo de extensão <ext>. Se o `hyperref.sty` for chamado, `\addcontentsline` adicionalmente cria uma entrada na Lista de Marcadores (\emph{outlines/bookmarks list}) do PDF. É importante que `\target<nome>` sempre seja lido no modo horizontal para o correto posicionamento da âncora de \emph{hyperlink}.

% \begin{code}
\def\targetpart#1{\refstepcounter{part}%
    \addcontentsline{toc}{part}{\protect\toclabelbox{\toclabel{\thepart}}#1}%
    \expandafter\processsectitle\expandafter{\savedsectitle}%
}
\def\targetchapter#1{%
    \ifnonum
        \phantomsection
        \ifnotoc
            \makeoutline{\mainseclevel}{\thechapter}{#1}%
        \fi
    \else
        \refstepcounter{chapter}%
    \fi
    \ifnotoc \else
        \addcontentsline{toc}{chapter}{%
            \ifnonum \protect\toclabelbox{}%
            \else    \protect\toclabelbox{\toclabel{\thechapter}}%
            \fi #1}%
    \fi
    \expandafter\processsectitle\expandafter{\savedsectitle}%
}
\def\targetsection#1{%
    \ifnonum
        \phantomsection
        \ifnotoc
            \makeoutline{\mainseclevel}{\thesection}{#1}%
        \fi
    \else
        \refstepcounter{section}%
    \fi
    \ifnotoc \else
        \addcontentsline{toc}{section}{%
            \ifnonum \protect\toclabelbox{}%
            \else    \protect\toclabelbox{\toclabel{\thesection}}%
            \fi #1}%
    \fi
    \expandafter\processsectitle\expandafter{\savedsectitle}%
}
\def\targetsubsection#1{\refstepcounter{subsection}%
    \addcontentsline{toc}{subsection}{\protect\toclabelbox{\toclabel{\thesubsection}}#1}%
    \expandafter\processsectitle\expandafter{\savedsectitle}%
}
\def\targetsubsubsection#1{\refstepcounter{subsubsection}%
    \addcontentsline{toc}{subsubsection}{\protect\toclabelbox{\toclabel{\thesubsubsection}}#1}%
    \expandafter\processsectitle\expandafter{\savedsectitle}%
}
\def\targetparagraph#1{\refstepcounter{paragraph}%
    \addcontentsline{toc}{paragraph}{\protect\toclabelbox{\toclabel{\theparagraph}}#1}%
    \expandafter\processsectitle\expandafter{\savedsectitle}%
}
\def\targetsubparagraph#1{\refstepcounter{subparagraph}%
    \addcontentsline{toc}{subparagraph}{\protect\toclabelbox{\toclabel{\thesubparagraph}}#1}%
    \expandafter\processsectitle\expandafter{\savedsectitle}%
}
%. \end{code}

% Definições de \`\part`, \`\chapter`, \`\section`, \`\subsection`, \`\subsubsection`, \`\paragraph`, \`\subparagraph`.

% É mais provável que o usuário queira redefinir comandos como `\printsection`, ao invés de seus invólucros maiores, nesse caso, `\section`.

% Nesta classe, não há suporte para a sintaxe `\section*[<título alternativo>]`. O uso de `*` foi substituído por nomenclaturas de maior peso semântico: `\nonum` e `\notoc`\footnotemark, porque, no LaTeX, o asterisco (`*`) não carrega valor semântico suficiente. Por exemplo, em `\newcommand`, `\section` e `\vspace`, `*` significa \enquote{não prefixe \type{\\long}}, \enquote{não enumere e não ingresse no Sumário} e \enquote{insira um item horizontal se estiver no topo da página}, respectivamente. Além disso, o parâmetro opcional <título alternativo> também não foi contemplado.

% \footnotetext{A ideia de usar \type{\\nonum} e \type{\\notoc} ao invés de \type{*} vem do Op\TeX\ (muitas outras implementações aqui foram inspiradas nele) \cite{optex}.}

% A sequência de controle `\trytextual` será prefixada em `\section`, `\chapter` e iniciará o estilo de página `\textual` automaticamente. O usuário final pode desativar essa funcionalidade digitando `\let\trytextual=\relax` no preâmbulo e inserindo `\textual` manualmente no documento.

% O `\savedsectitle` será usado em `\processsectitle` que expande para `\NR@gettitle`, do `nameref.sty`.

% \codesubsection{\type{\\label} e \type{\\section}}\label{codesub:label}

% Pode-se rotular seções inserindo `\label` em `\section`: `\section{Título\label{<chave>}}` ou `\section{\label{<chave>}Título}`, por exemplo. No entanto, também é comum que usuários coloquem `\label` após um comando de seção: `\section{Título}\label{<chave>}`. Todavia, existe um problema com essa última opção. Há uma primitiva na definição de `\label` chamada `\write`. Essa primitiva é um nó do tipo <whatsit>, e esse tipo de nó, quando em modo vertical, interfere na comunicação de comandos que precisam usar `\lastskip` ou `\lastpenalty` para remoção de `\vskip`s duplicados
% \bgroup\def\UrlBreaks{\do\-}\footnote{\url{https://tex.stackexchange.com/questions/709109/cross-referencing-label-affects-vertical-spacing},
%                  \url{https://tex.stackexchange.com/questions/22068/biblatex-multicol-incorrect-vertical-space-after-bibliography-heading}.}\egroup.

% Exemplos de tais comandos são `\toptitle` e `\bottitle`, implementados nesta classe.

% Para viabilizar este último caso, precisaremos de `\@ifnextchar` para verificar se o token que sucede o fim do parâmetro corresponde a `\label`. Se sim, `\label` e sua <chave> são removidos do modo vertical e inseridos no parâmetro de `\section`, no modo horizontal. É importante que o usuário não insira tokens entre o fim do parâmetro e o `\label` que o sucede.

% \begin{code}
\def\trytextual{\ifnonum \else \textual \let\trytextual=\relax \fi}
\def\predictlbl#1#2#3#4{#1{#2#3{#4}}}
\def\savedsectitle{}

\def\part#1{\@ifnextchar\label{\predictlbl\inpart{#1}}{\inpart{#1}}}
\def\chapter#1{\@ifnextchar\label{\predictlbl\inchapter{#1}}{\inchapter{#1}}}
\def\section#1{\@ifnextchar\label{\predictlbl\insection{#1}}{\insection{#1}}}
\def\subsection#1{\@ifnextchar\label{\predictlbl\insubsection{#1}}{\insubsection{#1}}}
\def\subsubsection#1{\@ifnextchar\label{\predictlbl\insubsubsection{#1}}{\insubsubsection{#1}}}
\def\paragraph#1{\@ifnextchar\label{\predictlbl\inparagraph{#1}}{\inparagraph{#1}}}
\def\subparagraph#1{\@ifnextchar\label{\predictlbl\insubparagraph{#1}}{\insubparagraph{#1}}}

\def\inpart#1{%
    \ifuseparts
        \def\savedsectitle{#1}%
        \printpart{#1}%
    \else
        \tnba@warning{Para usar "\string\part" você deve ativar
                      "\string\useparts" no preâmbulo}%
    \fi
}
\def\inchapter#1{%
    \ifusechapters
        \def\savedsectitle{#1}
        \printchapter{#1}%
        \resetnonumnotoc
    \else
        \tnba@warning{Para usar "\string\chapter" você deve ativar
                      "\string\usechapters" no preâmbulo}%
    \fi
}
\def\insection#1{\def\savedsectitle{#1}\printsection{#1}\resetnonumnotoc}
\def\insubsection#1{\def\savedsectitle{#1}\printsubsection{#1}}
\def\insubsubsection#1{\def\savedsectitle{#1}\printsubsubsection{#1}}
\def\inparagraph#1{\def\savedsectitle{#1}\printparagraph{#1}}
\def\insubparagraph#1{\def\savedsectitle{#1}\printsubparagraph{#1}}
%. \end{code}

% Aqui estão definidos \`\usechapters` e \`\useparts`.

% \begin{code}
\newif\ifusechapters
\newif\ifuseparts

\def\mainseclevel{\csname toclevel@\mainsecname\endcsname}
\def\mainsecname{section}
\def\maintocfont{\tocsectionfont}

\def\usechapters{%
    \ifuseparts \tnba@error{"\string\usechapters" e "\string\useparts" não devem
                            ser usados em conjunto. Escolha um ou outro}%
    \else \def\hooktocsection{\vskip\tocsmallvalue\relax}%
          \def\tocsectionfont{\bfseries}%
          \def\sectionfont{\bfseries}%
          \def\thesection{\thechapter .\arabic{section}}%
          \def\mainsecname{chapter}%
          \def\maintocfont{\tocchapterfont}%
          \usechapterstrue
    \fi
}
\def\useparts{%
    \ifusechapters \tnba@error{"\string\usechapters" e "\string\useparts" não devem
                               ser usados em conjunto. Escolha um ou outro}%
    \else \usechapters
          \def\hooktocchapter{\penalty-300\vskip\tocmedvalue\relax}%
          \usepartstrue
    \fi
}

\@onlypreamble \usechapters
\@onlypreamble \useparts
%. \end{code}

% O comando `\toclabelbox` deve ser redefinido no momento da criação da Lista de Marcadores do PDF.

% \begin{code}
\appto\pdfstringdefPreHook{%
    \def\toclabelbox#1{#1}%
}
%. \end{code}

% \codesubsection{Cabeçalhos e rodapés}

% A seguir, temos os comandos que podem ser usados para criar linhas de cabeçalho e rodapé. Eles foram renomeados nessa versão, 4.0.0-beta, e, até a versão anterior, se chamavam `\markchapter`, `\marksection` e `\marksubsection`.

% \begin{code}
\def\chaptermark#1{}
\def\sectionmark#1{}
\def\subsectionmark#1{}
%. \end{code}

% TeX possui a primitiva `\mark` que viabiliza a criação de títulos correntes. Contudo, ela não consegue diferenciar tipos de título, ou seja, TeX não sabe identificar se o primeiro `\mark` de uma página, o qual será armazenado em `\firstmark`, pertence a uma Seção ou Subseção, por exemplo. Felizmente, a extensão \etex\ resolveu esse problema e providenciou novas primitivas: `\marks<número>`, `\firstmarks<número>`, `\botmarks<número>` e `\topmarks<número>` \cite{breitenlohner1998etex}. O escritor pode, dessa forma, habilitar cabeçalhos correntes, como no exemplo a seguir:
% \begin{xp}
%   \makeatletter
%   \appto\textual{
%      \def\@oddhead {\abntsmall \firstmarks0\hfil\thepage}
%      \def\@evenhead{\abntsmall \thepage\hfil\botmarks1}
%      \def\sectionmark   #1{\marks0{Seção \thesection: \unexpanded{#1}}}
%      \def\subsectionmark#1{\marks1{Subseção \thesubsection: \unexpanded{#1}}}
%   }
%   \makeatother
%. \end{xp}
% No exemplo acima, a primeira Seção de uma página será impressa no cabeçalho, à esquerda, se a numeração for ímpar. Analogamente, a última Subseção de uma página será impressa no cabeçalho, à direita, se a numeração for par. Além disso, se o escritor deseja adicionar uma linha horizontal embaixo dos cabeçalhos, basta acrescentar mais duas linhas no fim do `\appto` anterior:
% \begin{xp}
%   \appto\textual{% \preto = prepend to
%      % ...
%      \preto\@oddhead {\lower4pt\rlap{\vrule width\hsize height.4pt}}
%      \preto\@evenhead{\lower4pt\rlap{\vrule width\hsize height.4pt}}
%    }
%. \end{xp}
% O resultado é semelhante ao mostrado abaixo:

% \hbox to\hsize{\lower4pt\rlap{\vrule width\hsize height.4pt}\abntsmall
%    Seção 1: Um título de exemplo\hfil 1}

% Todavia, é importante notar que a rotina de saída do LaTeX não possui suporte para o uso direto de `\topmark/\topmarks`\footnote{\url{https://tex.stackexchange.com/questions/883/why-do-floats-change-the-mark?noredirect=1&lq=1}} \cite{source2e}.

% \codesubsection{Ambiente \type{corrprint}}

% Comandos como `\printbibliography` e `\printglossary` já vêm com título embutido, mas eles usam a sintaxe com asterisco (`*`) para `\section` que não é suportada pela classe. Por esse motivo foi definido o ambiente \`corrprint`.

% O comando `\printglossary` insere um `\clearpage` quando `hyperref.sty` é carregado (um \emph{bug}?). Para remover esse `\clearpage`, é preciso redefinir `\glossarysection`.

% O `glossaries.sty` e o `glossaries-extra.sty` \cite{glossaries-package, glossaries-extra-package} escrevem as entradas de suas listas no ambiente `description`, definido em `article.cls`. Para formatar essas listas, a classe providenciou a âncora `\hookcorrprint`. Nela, o usuário pode reformatar `description` como desejar.

% Infelizmente, o `glossaries.sty` define localizadores sem conformidade com os arquivos `.ldf` do `babel`, então nós temos de redefiní-los no último instante.

% Nós precisamos do `\appto\bibsetup` para remover um espaço vertical desconhecido seguido de `\unskip` gerados pelo `\printbibliography`.

% \begin{code}
\def\corrprintnum{0}
\def\hookcorrprint{%
    \def\descriptionlabel{}%
    \setlist[description]{
        font       = \eqbox{gls\corrprintnum},
        labelwidth = \eqboxsize{gls\corrprintnum}{2em},
        leftmargin = \dimexpr \eqboxsize{gls\corrprintnum}{2em} + \labelsep \relax,
    }%
}

\newenvironment{corrprint}{%
    \begingroup
    \let\ORIsection=\section
    \let\ORIchapter=\chapter
    \def\section##1{\nonum \csname ORI\mainsecname\endcsname}%
    \let\chapter=\section
    \ifdefined\glossarysection
    \renewcommand*\glossarysection[1][]{\nonum \csname ORI\mainsecname\endcsname}%
    \fi
    \xdef\corrprintnum{\the\numexpr\corrprintnum + 1}%
    \let\acronymname=\listacronymname
    \let\abbreviationsname=\listabbreviationname
    \let\glssymbolsgroupname=\listsymbolname
    \ifdefined\bibsetup
    \appto\bibsetup{\vskip-\f@size pt\vskip0pt\relax}%
    \fi
    \hookcorrprint
}{%
    \endgroup
}
%. \end{code}

% \codesubsection{Os contadores \type{secnumdepth} e \type{tocdepth}}

% Os comandos a seguir serão usados pelo `hyperref.sty` na criação da Lista de Marcadores em PDFs. Note que, nesta classe, `secnumdepth` não tem efeito. Já `tocdepth`, possui o único efeito de controlar os níveis secionais que devem entrar na Lista de Marcadores. Ajustar esse valor, portanto, não interfere nas entradas do Sumário como é de esperar-se na classe `article`.

% \begin{code}
\setcounter{tocdepth}{7}

\def\toclevel@part          {-1}
\def\toclevel@chapter       {0}
\def\toclevel@section       {1}
\def\toclevel@subsection    {2}
\def\toclevel@subsubsection {3}
\def\toclevel@paragraph     {4}
\def\toclevel@subparagraph  {5}

\def\toclevel@appendix {\mainseclevel}
\def\toclevel@annex    {\mainseclevel}
%. \end{code}

% \codesubsection{Anexo e Apêndice}

% Aqui estão definidos \`\appendix`, \`\annex`, \`\appendixlabelwidth` e \`\annexlabelwidth`. Os comandos \`\appendixlabelbox` e \`\annexlabelbox` precisam do `\lowercase` para serem protegidos de `\MakeUppercase.`

% \begin{code}
\newcounter{appendix}
\newcounter{annex}

\def\theappendix{\Alph{appendix}}
\def\theannex{\Alph{annex}}

\def\l@appendix #1#2{{\csname hooktoc\mainsecname\endcsname
                      \extline{0pt}\appendixlabelwidth\maintocfont{#1}{#2}}}
\def\l@annex    #1#2{{\csname hooktoc\mainsecname\endcsname
                      \extline{0pt}\annexlabelwidth\maintocfont{#1}{#2}}}

\def\appendixlabelwidth{\dimexpr\eqboxsize{toc}{2em} + \eqboxsize{appendix}{2em}\relax}
\def\annexlabelwidth{\dimexpr\eqboxsize{toc}{2em} + \eqboxsize{annex}{2em}\relax}
\def\appendixlabelbox{\lowercase{\eqbox{appendix}}}
\def\annexlabelbox{\lowercase{\eqbox{annex}}}
\def\appendixlabel{Apêndice~\theappendix~---~}
\def\annexlabel{Anexo~\theannex~---~}
%. \end{code}

% Os comandos `\appendix` e `\annex` são funcionalmente idênticos a `\nonum\section` ou `\nonum\chapter`. A única diferença é que aqueles usam contadores e caixas de rótulo distintas. Observe que `\appendix` precisa ser definido em `\AtBeginDocument`, porque `\appendix` é redefinido pelo `cleveref.sty`. Esse cuidado não é realmente necessário com `\annex`.

% \begin{code}
\def\targetappendix#1{\refstepcounter{appendix}%
    \addcontentsline{toc}{appendix}%
        {\protect\toclabelbox{}\protect\appendixlabelbox{\appendixlabel}#1}%
    \expandafter\processsectitle\expandafter{\savedsectitle}%
}
\def\targetannex#1{\refstepcounter{annex}%
    \addcontentsline{toc}{annex}%
        {\protect\toclabelbox{}\protect\annexlabelbox{\annexlabel}#1}%
    \expandafter\processsectitle\expandafter{\savedsectitle}%
}

\AtBeginDocument{%
    \def\appendix#1{\@ifnextchar\label{\predictlbl\inappendix{#1}}{\inappendix{#1}}}%
    \def\annex#1{\@ifnextchar\label{\predictlbl\inannex{#1}}{\inannex{#1}}}%
}

\def\inappendix#1{%
    \csletcs{ORItarget\mainsecname}{target\mainsecname}%
    \csletcs{ORIhookprint\mainsecname}{hookprint\mainsecname}%
    \csletcs{target\mainsecname}{targetappendix}%
    \long\csdef{hookprint\mainsecname}##1{\MakeUppercase{\appendixlabel##1}}%
    \nonum \csname\mainsecname\endcsname {#1}%
    \csletcs{target\mainsecname}{ORItarget\mainsecname}%
    \csletcs{hookprint\mainsecname}{ORIhookprint\mainsecname}%
}
\def\inannex#1{%
    \csletcs{ORItarget\mainsecname}{target\mainsecname}%
    \csletcs{ORIhookprint\mainsecname}{hookprint\mainsecname}%
    \csletcs{target\mainsecname}{targetannex}%
    \long\csdef{hookprint\mainsecname}##1{\MakeUppercase{\annexlabel##1}}%
    \nonum \csname\mainsecname\endcsname {#1}%
    \csletcs{target\mainsecname}{ORItarget\mainsecname}%
    \csletcs{hookprint\mainsecname}{ORIhookprint\mainsecname}%
}
%. \end{code}

% Na forma que se encontram, os comandos de rótulo não podem expandir nas linhas da Lista de Marcadores do visualizador de PDF.

% \begin{code}
\appto\pdfstringdefPreHook{%
    \def\appendixlabelbox#1{#1}%
    \def\annexlabelbox#1{#1}%
}
%. \end{code}

% \codesection{CITAÇÕES}

% Existem três formas de usar aspas simples/duplas no documento. A primeira delas é através da sequência \TeX\ especial \expandafter`\2texto"` ou \expandafter`\2texto''` que introduz aspas duplas no documento e \expandafter`\1texto'` para aspas simples. Todavia, esses atalhos são visualmente confusos\footnotemark\ e independentes do contexto idiomático. A segunda forma é memorizar os atalhos do teclado `Alt + 0147` e `Alt + 0148` para imprimir os caracteres Unicode diretamente: `“` e `”`, respectivamente. Porém, `Alt` tem um comportamento imprevisível quando `Num Lock` encontra-se desabilitado. Para exemplificar, ao digitar `Alt + 4`, o caractere Unicode esperado é corretamente inserido, mas o cursor do texto move-se erraticamente pelo editor de texto do autor em razão das teclas direcionais no teclado numérico.

% \footnotetext{Exemplos de mal uso: {\ttfamily ´´Teste", \2Teste´´, ''Teste\2, "Teste"}. A depender da fonte tipográfica em questão, o equívoco na utilização desses atalhos pode ser mais provável.}

% Em virtude disso, o pacote `csquotes` foi carregado pela classe. Ele fornece o comando `\enquote` para digitar aspas que é capaz de respeitar o contexto idiomático. Exemplos: `\enquote{lipsum}` produz \enquote{lipsum} se seu idioma padrão, definido em `babel`, for `brazil`; `{\selectlanguage{german}\enquote{lipsum}}` produz {\selectlanguage{german}\enquote{lipsum}}, se o idioma secundário `german` foi previamente carregado. Além disso, `\enquote` também é sensível ao agrupamento: `\enquote{Um pequeno \enquote{exemplo} aqui}` gera \enquote{Um pequeno \enquote{exemplo} aqui}. Note que o `\enquote` interno produziu aspas simples ao invés de duplas \cite{csquotes-package}.

% Já o comando \`\Enquote` foi construído com base numa resposta em TeX~StackExchange\footnotemark. Ele não é um ambiente, porque, dessa forma, o escritor vai conseguir alternar entre os comandos de citação com mais rapidez.

% \footnotetext{\url{https://tex.stackexchange.com/a/739824/383003}.}

% \begin{code}
\def\Enquote#1{\par\nobreak
    \ifdim\lastskip>0pt \vskip-\lastskip \fi
    \ifnum\lastpenalty=11333 \else \vskip\aboveEnquote\relax \fi
    \vskip\baselineskip
    {\singlesp\abntsmall\vskip-\baselineskip
     \hangindent=4cm\hangafter=0\noindent
     \ignorespaces#1\par}\vskip\belowEnquote\relax
}
\def\aboveEnquote{\baselineskip}
\def\belowEnquote{\baselineskip}
%. \end{code}

% \codesection{ALÍNEAS}

% As linhas que seguem criam o ambiente \`topics` usando instruções do `enumitem.sty` que é inicializado nesta classe \cite{enumitem-package}. Com esse ambiente o autor pode escrever alíneas conforme a NBR~6024: \cite{abnt-2012-6024-numeracao-progressiva-das}.

% \begin{code}
\newlist{topics}{enumerate}{2}

\setlist{
    nosep
}
\setlist[topics,1]{
    label       = \alph*),
    align       = left,
    leftmargin  = !,
    labelwidth  = 0.5cm,
    labelindent = \parindent
}
\setlist[topics,2]{
    label      = ---,
    align      = left,
    leftmargin = !,
    labelwidth = 0.6cm
}
%. \end{code}

% \codesection{ÁREAS DE LEGENDA}

% As versões anteriores do \`\definelegendplace` (até a 3.2.1-beta) possuiam quatro argumentos. O terceiro ensinava a forma como `\ref` seria exibido no documento. No entanto, essa funcionalidade era limitada e não fornecia rótulo para letras maiúsculas ou uma versão para plural e recursos mais extensivos. Por causa disso, o `abntexto` resolveu incumbir essa tarefa a pacotes externos que desenvolvem o sistema de referência-cruzada tais como o `cleveref.sty` e o `zref.sty`.

% \begin{code}
\def\definelegendplace#1#2#3{%
    \@ifnextchar\bgroup{\tnba@old@definelegendplace{#1}{#2}{#3}}%
                       {\tnba@new@definelegendplace{#1}{#2}{#3}}%
}

% #1 = tipo
% #2 = nome
% #3 = formato do rótulo em \ref
% #4 = extensão
\def\tnba@old@definelegendplace#1#2#3#4{%
    \tnba@warning{Esta é a antiga sintaxe com 4 argumentos de "\string\definelegendplace".
                  A nova sintaxe tem apenas 3. Remova o terceiro argumento}%
    \tnba@new@definelegendplace{#1}{#2}{#4}}
%. \end{code}

% A nova definição de `\definelegendplace`, incorporada nesta versão (4.0.0-beta), tem a sintaxe:
% \begin{xp}
%   \definelegendplace{<tipo>}{<nome>}{<extensão>}
%. \end{xp}
% Se o escritor precisa de uma área de legenda para inserir gráficos, ele só precisa escrever `\definelegendplace{graphic}{Gráfico}{logr}`\footnotemark\ no preâmbulo. Ao fazê-lo, estará criando, implicitamente, vários comandos:
% \footnotetext{Observe que TeX cria um arquivo de `.log` ao fim de cada compilação, por isso usamos `.logr`.}
% \begin{xp}
%   \newcounter{graphic}
%   \def\thegraphic{\arabic{graphic}}
%   \def\l@graphic#1#2{{\csname hooktoc\mainsecname\endcsname
%                       \extline{0pt}\logrlabelwidth\logrfont{#1}{#2}}}
%   \def\logrlabelwidth{\eqboxsize{lo:logr}{2em}}
%   \def\logrlabelbox{\lowercase{\eqbox{lo:logr}}}
%   \def\IDgraphic{Gráfico}
%   \def\logrfont{\maintocfont}
%   \def\makelogr{\@starttoc{logr}\inittocfirst}
%. \end{xp}
% É importante saber que `\definelegendplace`, a partir desta versão, não cria mais os comandos `#1name` e `#3label`. Ao invés disso, ele verifica se `#1name` existe. Se sim, `\definelegendplace` utiliza `#1name` na definição de `\<ext>label`, do contrário, este será definido com a designação dada no segundo argumento de `\definelegendplace`, como foi o caso no exemplo acima. Quanto a função de `#3label`, foi deixada para `\legendlabel`.

% \begin{code}
\def\lastfloattype{0}

% #1 = tipo
% #2 = nome
% #3 = extensão
\def\tnba@new@definelegendplace#1#2#3{%
    \cslet{the#1}{\undefined}%
    \ifcsname c@#1\endcsname \else
        \newcounter{#1}%
    \fi
    \csedef{ftype@#1}{\the\numexpr\lastfloattype + 1}%
    \csdef{fps@#1}{tbp}%
    \csdef{ext@#1}{#3}%
    \ifcsname #1name\endcsname
        \csdef{ID#1\expandafter}\expandafter{\csname #1name\endcsname}%
    \else
        \csdef{ID#1}{#2}%
    \fi
    \csdef{the#1}{\arabic{#1}}%
    \csedef{l@#3}##1##2{{\noexpand\csname hooktoc\noexpand\mainsecname\endcsname
        \noexpand\extline{0pt}%
        \expandafter\noexpand\csname #3labelwidth\endcsname
        \expandafter\noexpand\csname #3font\endcsname {##1}{##2}%
    }}%
    \csdef{#3labelwidth}{\eqboxsize{lo:#3}{2em}}%
    \csdef{#3labelbox}{\lowercase{\eqbox{lo:#3}}}%
    \appto\pdfstringdefPreHook{%
        \csdef{#3labelbox}##1{##1}%
    }
    \csdef{#1extfont}{\maintocfont}%
    \csdef{make#3}{\@starttoc{#3}\inittocfirst}%
    \protected\csedef{tnba@obs@#3label}{%
        \noexpand\tnba@obsolete{\expandafter\noexpand\csname#3label\endcsname}
                               {Redefina "\string\legendlabel" ao invés}}%
    \csdef{#3label\expandafter}\expandafter{\csname tnba@obs@#3label\endcsname}%
    \protected\csedef{tnba@obs@l@#3i}{%
        \noexpand\tnba@obs{\expandafter\noexpand\csname l@#3i\endcsname}%
                          {\expandafter\string\csname l@#3\endcsname}}%
    \csdef{l@#3i\expandafter}\expandafter{%
        \csname tnba@obs@l@#3i\expandafter\endcsname \csname l@#3\endcsname
    }%
}

\@onlypreamble \definelegendplace

\definelegendplace{figure}{Ilustração}{lof}
\definelegendplace{table}{Tabela}{lot}
%. \end{code}

% O `\targetlegend`, ao contrário de seus semelhantes, não detém parâmetro.

% \begin{code}
\def\targetlegend{%
    \refstepcounter\savedplace
    \expandafter\processsectitle\expandafter{\savedlegend}%
    \ifx\ORIlabel\undefined \else
    \ifx\savedlbl\undefined \else \ORIlabel\savedlbl \fi
    \addcontentsline
        {\csname ext@\savedplace\endcsname}%
        {\csname ext@\savedplace\endcsname}%
        {\expandafter\protect
         \csname\csname ext@\savedplace\endcsname labelbox\endcsname{\legendlabel}\savedlegend}%
}
%. \end{code}

% \codesubsection{\type{\\legend} e \type{\\label}}

% Em \`\legend``{<tipo>}{<título>}`, <tipo> e <título> são armazenados em `\savedplace` e `\savedlegend`, respectivamente. Por fim, com auxílio de `\makerefcounter`, o contador <tipo> é avançado, ao mesmo tempo em que `\@currentlabel` e análogos são definidos. Por fim, \`\src` armazena o argumento em `\savedsrc`.

% Mais uma vez, precisaremos remover `\label` do modo vertical e inserí-lo no modo horizontal como explicado na \ref{codesub:label}. A abordagem aqui será diferente daquela utilizada na referida Seção: teremos de redefinir `\label` e salvar seu argumento em `\savedlbl` para ser inserido posteriormente em `\targetlegend` que será lido no modo horizontal. O significado original de `\label` será restaurado ao fim do ambiente `place`.

% \begin{code}
\newdimen\savedplacewidth

\def\legend#1#2{%
    \def\savedplace{#1}\def\savedlegend{#2}%
    \ifx\ORIlabel\undefined
        \let\ORIlabel=\label
        \def\label##1{\def\savedlbl{##1}\ignorespaces}%
    \fi
    \ignorespaces % Caso multiplace encontre-se dentro de place.
}
\def\src#1{\def\savedsrc{#1}\ignorespaces}
\def\resetORIlabel{\ifx\ORIlabel\undefined \else
    \let\label=\ORIlabel
    \let\ORIlabel=\undefined \fi
}
\def\gresetORIlabel{\ifx\ORIlabel\undefined \else
    \global\let\label=\ORIlabel
    \global\let\ORIlabel=\undefined \fi
}

\def\legendname{\tnba@obs\legendname{\string\currentlegendID}%
    \currentlegendID} % Obsoleto. Use \currentlegendID.
\def\currentlegendID{\csname ID\savedplace\endcsname}
\def\thelegend{\arabic{\savedplace}}
\def\legendlabel{\currentlegendID~\thelegend~---~}
\def\legendmaxwidth{.7\linewidth}
\def\srclabel{Fonte:~}
%. \end{code}

% O ambiente \`place` tem a sintaxe `\begin{place}[<arg>]<conteúdo>\end{place}`. Ele captura o <conteúdo> e armazena-o numa `\hbox` por meio da primitiva\footnote{Primitiva não é sinônimo de macro \cite{olsak-2012-tex-in-nutshell}.} `\setbox`. O <arg> pode ser `here`\footnote{Semelhante ao especificador `H` do pacote `float` \cite{float-package}.}, definido nesta classe, ou os parâmetros de objeto flutuante do LaTeX: \expandafter`\excl`, `t`, `p`, `b` ou `h`. Se <arg> não for especificado, \`\placepos` será usado.

% O usuário final pode especificar o posicionamento de todos os ambientes `place` digitando, no preâmbulo, `\def\placepos{tbp}`, por exemplo.

% O <arg> será processado em `\processplacearg` e definirá `\initplace` e `\finishplace` que vão inserir \`\aboveplace` e \`\belowplace` se <arg> for igual a `here`. Do contrário, `\initplace` e `\finishplace` iniciarão e finalizarão o modo flutuante, respectivamente, e <arg> será processado no ambiente `@float` do LaTeX. Depois, a informação da largura da caixa é guardada em `\savedplacewidth` para uso posterior. Em seguida, `\buildplace` entra em ação e expõe três componentes:
% \begin{topics}
%    \item `\printlegendbox`: é nada mais que uma `\vtop` centralizada na página por meio da primitiva `\hfil`. A largura da `\vtop` independe da largura do <conteúdo>. Se a largura do título e do rótulo juntos é maior que `\legendmaxwidth`, a `\vtop` terá largura igual a `\legendmaxwidth`, do contrário, terá largura igual ao do título e do rótulo juntos;
%    \item `\printplacebox`: é responsável por desempacotar a caixa por meio da primitiva `\unhbox`. O alinhamento é, mais uma vez, centralizado por meio de `\hfil`;
%    \item `\printsrcbox`: está programado para desenhar uma `\vbox` de largura `\savedplacewidth` centralizada com `\hfil`.
% \end{topics}

% \begin{code}
\def\placepos{here}
\def\aboveplace{\baselineskip}
\def\belowplace{\baselineskip}

\def\initplace{}
\def\finishplace{}

\def\place{\@ifnextchar\bgroup\tnba@old@place\tnba@new@place}
\def\endplace{\endtnba@new@place}

\long\def\tnba@old@place#1{%
    \tnba@warning{Sintaxe obsoleta do \string\place. Use-o
                  na forma de ambiente: \string\begin{place}}%
    \tnba@new@place#1\endtnba@new@place}

\newenvironment{tnba@new@place}[1][\placepos]{%
    \begingroup
    \processplacearg{#1}%
    \parindent=0pt \parskip=0pt
    \setbox0=\hbox\bgroup \resetORIlabel
    \let\resetplace=\relax \let\gresetORIlabel=\relax % Caso multiplace
    \def\placepos{here}%                              % encontre-se dentro
    \def\aboveplace{0pt}\def\belowplace{0pt}%         % de place.
    \ignorespaces
}{%
    \unskip \egroup
    \savedplacewidth=\wd0
    \buildplace \resetplace \gresetORIlabel
    \endgroup
}
\def\processplacearg#1{%
    \begingroup
        \edef\tmpa{#1}\def\tmpb{here}%
    \expandafter\endgroup
    \ifx\tmpa\tmpb
        \def\initplace{\par
            \ifdim\lastskip>0pt \vskip-\lastskip \fi
            \ifnum\lastpenalty=11333 \else \vskip\aboveplace\relax \fi
        }%
        \def\finishplace{\vskip\belowplace\relax}%
    \else % É float.
        \ifx\savedplace\empty
            \def\initplace{}%
            \def\finishplace{}%
        \else
            \edef\initplace{\noexpand\@float{\savedplace}[#1]}%
            \def\finishplace{\end@float}%
        \fi
    \fi
}
\def\buildplace{%
    \initplace
    \ifx\savedplace\empty \else
        \printlegendbox
    \fi
    \printplacebox
    \printsrcbox
    \finishplace
}
\def\printlegendbox{\hfil \vtop{%
    \leavevmode\targetlegend
    \setbox0=\hbox{\abntsmall{\legendlabel}\savedlegend}% \legendlabel precisa estar entre chaves,
    \ifdim\wd0>\legendmaxwidth                          % porque o próximo \legendlabel também está.
        \hsize=\legendmaxwidth \else
        \hsize=\wd0 \fi
    \singlesp\abntsmall \hangfrom{\legendlabel}\savedlegend \strut
}}
\def\printplacebox{\par\nointerlineskip \nobreak\vskip\medskipamount \hfil \unhbox0\relax}
\def\printsrcbox{\par\nointerlineskip \nobreak\vskip\medskipamount
    \hfil \vbox{\hsize=\savedplacewidth
        \raggedright\abntsmall\singlesp
        \hangfrom\srclabel \savedsrc \strut
}}

\def\savedlegend{}
\def\savedplace{}
\def\savedsrc{}
\def\resetplace{%
    \global\let\savedplace=\empty
    \global\let\savedlegend=\empty
    \global\let\savedsrc=\empty
}
%. \end{code}

% \codesection{O AMBIENTE \type{multiplace}}\label{codesec:multiplace}

% Antes de introduzirmos o ambiente \`multiplace`, propriamente dito, precisamos definir três macros que auxiliarão na sua construção: `\makerefcounter`, `\makecurrentlabel` e `\makehyperdest`. O `\refstepcounter{<contador>}` é definido em `source2e.pdf` \cite{source2e}. Ele avança globalmente o <contador> em uma unidade, e nomeia ambos `\@currentcounter` e `\@currentlabel`. Se o `hyperref.sty` estiver presente, `\refstepcounter` também nomeia `\@currentHref` e cria um destino de \emph{hyperlink}.

% O fato de `\refstepcounter` realizar tantas operações simultaneamente, nos impede de posicioná-lo arbitrariamente. Em virtude desse fato, esta classe definiu três comandos cujos objetivos são:
% \begin{topics}
%    \item `\makerefcounter{<contador>}`: Incrementar o <contador> e gerar `\@currentlabel` e semelhantes;
%    \item `\makecurrentlabel{<contador>}`: Gerar `\@currentlabel` e semelhantes;
%    \item `\makehyperdest{<contador>}`: Criar um destino/âncora de \emph{hyperlink}.
% \end{topics}

% \begin{code}
\def\makerefcounter#1{%
    \let\tnba@hyperanchorstart=\hyper@anchorstart
    \let\hyper@anchorstart=\@gobble
    \refstepcounter{#1}%
    \let\hyper@anchorstart=\tnba@hyperanchorstart
}
\def\makecurrentlabel#1{\addtocounter{#1}{-1}\makerefcounter{#1}}
\def\makehyperdest#1{\addtocounter{#1}{-1}\begingroup\refstepcounter{#1}\endgroup}
%. \end{code}

% Neste ponto, criaremos o ambiente `multiplace`, de sintaxe `\begin{multiplace}[<arg>]`. Onde <arg> são parâmetros de objeto flutuante ou `here`. Esse ambiente, ao contrário de `place`, não armazena seu conteúdo numa `\setbox`. Ao invés, as caixas são armazenadas e desempacotadas, de fato, no ambiente \`subplace`, de sintaxe `\begin{subplace}[<arg>]`. Este basicamente repete o processo de impressão do ambiente `place`. Todavia, possui um argumento opcional onde o usuário pode especificar um valor para a largura da caixa, por exemplo: `\begin{subplace}[4cm]`. Se <arg> não for especificado, seu valor padrão será `0.45\linewidth`.

% O \`\sublegend` salva o conteúdo do seu argumento em `\savedsublegend`, avança o contador `subplace`, define `\@currentlabel` e afins, e, por fim, remove espaços espúrios por meio de `\ignorespaces`, porque `\sublegend` será lido no modo horizontal. O `\savedsublegend` será usado posteriormente em `\buildsubplace`.

% O \`\subsrc` salva o conteúdo em `\savedsubsrc` para ser usado posteriormente em `\buildsubplace`.

% \begin{code}
\newcounter{subplace}
\def\hooktargetlegend{}

\def\sublegend{\@ifnextchar[\alternativesublegend\normalsublegend}
\def\normalsublegend#1{%
    \def\savedsublegend{#1}\stepcounter{subplace}%
    \ifx\ORIlabel\undefined
        \let\ORIlabel=\label
        \def\label##1{\def\savedlbl{##1}\ignorespaces}%
    \fi
    \ignorespaces
}
\def\alternativesublegend[#1]#2{%
    \legend{#1}{}\stepcounter{subplace}%
    \def\hooktargetlegend{%
        \ifcsname tnba@sleg@#1\endcsname \else
            \refstepcounter{#1}\csdef{tnba@sleg@#1}{}%
        \fi
    }%
    \def\legendlabel{\currentlegendID~\thelegend~---~}%
    \normalsublegend{#2}\ignorespaces
}
\def\subsrc#1{\def\savedsubsrc{#1}\ignorespaces}
\def\sublegendlabel{(\alph{subplace})~}
\def\sublegendmaxwidth{\linewidth}

\newenvironment{multiplace}[1][\placepos]{%
    \begingroup
    \processplacearg{#1}%
    \setcounter{subplace}{0}%
    \parindent=0pt \parskip=0pt \interlinepenalty=10000
    \initplace
    \ifx\savedplace\empty \else
        \csdef{the\savedplace}{\arabic{\savedplace}\alph{subplace}}%
        \printlegendbox
        \par\nointerlineskip \nobreak\vskip\medskipamount
    \fi
    \let\legendmaxwidth=\sublegendmaxwidth
    \let\legendlabel=\sublegendlabel
    \def\targetlegend{%
        \hooktargetlegend
        \makecurrentlabel\savedplace
        \expandafter\processsectitle\expandafter{\savedlegend}%
        \ifx\ORIlabel\undefined \else
        \ifx\savedlbl\undefined \else \ORIlabel\savedlbl \fi\fi
    }%
    \leavevmode % Previne que o \nobreak das linhas de código acima seja anulado.
}{%
    \savedplacewidth=\hsize
    \ifx\savedsrc\empty
        \par\nointerlineskip \nobreak\vbox{}%
    \else
        \printsrcbox
    \fi
    \finishplace \resetplace \gresetORIlabel
    \endgroup
}
%. \end{code}

% O `\ignorespacesafterend` é uma macro do LaTeX e serve para remover espaços ao fim de um ambiente \cite{source2e}.

% \begin{code}
\newenvironment{subplace}[1][.4\linewidth]{%
    \begingroup
    \hsize=#1\relax \linewidth=\hsize
    \let\savedlegend=\savedsublegend
    \let\savedsrc=\savedsubsrc
    \setbox0=\hbox\bgroup \resetORIlabel
    \ignorespaces
}{%
    \unskip \egroup
    \savedplacewidth=\wd0
    \buildsubplace
    \resetsubplace
    \ignorespacesafterend
    \endgroup
}
\def\buildsubplace{\leavevmode\vbox{%
    \initplace
    \ifx\savedplace\empty \else
        \printlegendbox
    \fi
    \printplacebox
    \printsrcbox
    \finishplace
}}

\def\savedsublegend{}
\def\savedsubplace{}
\def\savedsubsrc{}
\def\resetsubplace{%
    \global\let\savedsubplace=\empty
    \global\let\savedsublegend=\empty
    \global\let\savedsubsrc=\empty
}
%. \end{code}

% \codesection{NOTAS DE RODAPÉ}

% As próximas linhas de código seguem a recomendação: \Enquote{As notas devem ser digitadas ou datilografadas dentro das margens, ficando separadas do texto por um espaço simples de entre as linhas e por filete de 5 cm, a partir da margem esquerda. Devem ser alinhadas, a partir da segunda linha da mesma nota, abaixo da primeira letra da primeira palavra, de forma a destacar o expoente, sem espaço entre elas e com fonte menor \cite{abnt-2024-14724-trabalhos-academicos}.}.

% \begin{code}
\def\@makefntext#1{\hangfrom{\@makefnmark\kern2pt}\abntsmall\singlesp #1}
\def\footnoterule{\kern-3pt \hrule width5cm \kern2.6pt }
\footnotesep=0pt
%. \end{code}

% \codesection{IDENTIFICAÇÃO DO TRABALHO\label{codesec:identificacao}}

% Nesta seção, ofereceremos o suporte para elaboração de uma ficha catalográfica através do ambiente \`indexcard`. Todavia, é provável que a biblioteca de sua instituição forneça-lhe uma ficha em formato `.png` ou `.pdf`. Nesse caso, as macroinstruções abaixo não serão úteis.

% Você pode personalizar a ficha com instruções do tipo `\icard<Atributo>`, escritas em notação húngara\footnote{\url{https://pt.wikipedia.org/wiki/Nota\%C3\%A7\%C3\%A3o_h\%C3\%BAngara}.}. Demonstração:
% \begin{xp}[gobble=1]
%\def\Centro{\noindent\hfil}
%\def\icardWidth{7cm}
%\def\icardHeight{4.2cm}
%\def\icardBorder{5pt}
%\def\icardPadding{6pt}
%\icardPrintGrid
%{\centering Ficha catalográfica da biblioteca com dados \\
%            informados pelo próprio autor.\par}% Esse \par
%\Centro                                        % é necessário.
%\begin{indexcard}
%    Sobrenome, Autor, Ano.
%    Título: subtítulo / Autor. Ano.
%
%    Orientador: Nome
%
%    Coorientador: Nome
%
%    Tipo de trabalho --- Universidade
%
%    1. Palavra-chave A. 2. Palavra-chave B. I Título.
%
%    \hfill CDU 4321
%\end{indexcard}
%. \end{xp}
% Cujo resultado é:

% \def\Centro{\noindent\hfil}
% \def\icardWidth{8cm}
% \def\icardHeight{5.2cm}
% \def\icardBorder{5pt}
% \def\icardPadding{6pt}
% \icardPrintGrid
% {\centering Ficha catalográfica da biblioteca com dados \\
%             informados pelo próprio autor.\par}
% \Centro
% \begin{indexcard}
%    Sobrenome, Autor, Ano.
%    Título: subtítulo / Autor. Ano.
%
%    Orientador: Nome
%
%    Coorientador: Nome
%
%    Tipo de trabalho --- Universidade
%
%    1. Palavra-chave A. 2. Palavra-chave B. I Título.
%
%    \hfill CDU 4321
% \end{indexcard}

% No exemplo acima, usamos a instrução \`\icardPrintGrid` para desenhar quatro linhas que delimitam as margens internas da estrutura, em outras palavras, uma grade. Elas são úteis para verificar se o texto não ultrapassou as margens o que, de fato, aconteceu: note que CDU 4321 ultrapassou a margem inferior. Felizmente, podemos resolver esse problema dando um valor maior para `\icardWidth`, `\icardHeight` ou ambos. Segue-se a implementação:

% \begin{code}
\def\icardLeft{\hbox\bgroup \icardGridLeft\vrule width\icardBorderLeft}
\def\icardRight{\icardGridRight\vrule width\icardBorderRight \egroup}
\def\icardTop{%
    \vbox to\icardHeight\bgroup \hsize=\icardWidth
    \advance\hsize by -2\dimexpr\icardPadding
    \advance\hsize by - \dimexpr\icardBorderLeft
    \advance\hsize by - \dimexpr\icardBorderRight
    \hrule height\icardBorderTop \icardGridTop
}
\def\icardBottom{\vss\icardGridBottom\hrule height\icardBorderBottom \egroup}

\def\indexcard{\@ifnextchar\bgroup\tnba@old@indexcard\tnba@new@indexcard}
\def\endindexcard{\endtnba@new@indexcard}

\long\def\tnba@old@indexcard#1{%
    \tnba@warning{Sintaxe obsoleta do \string\indexcard. Use-o
                  na forma de ambiente: \string\begin{indexcard}}%
    \tnba@new@indexcard#1\endtnba@new@indexcard}

\newenvironment{tnba@new@indexcard}{%
    \leavevmode
    \icardLeft \icardTop
        \hbox spread 2\dimexpr\icardPadding \bgroup\hss
        \vbox spread 2\dimexpr\icardPadding \bgroup\vss
        \linewidth=\hsize
        \emergencystretch=4em \hbadness=7000
        \icardFont \ignorespaces
}{%
        \unskip \vss\egroup\hss\egroup
    \icardBottom \icardRight
}

\def\icardWidth{12.5cm}
\def\icardHeight{7.5cm}
\def\icardPadding{1cm}
\def\icardBorder{0.4pt}
\def\icardBorderLeft{\icardBorder}
\def\icardBorderRight{\icardBorder}
\def\icardBorderTop{\icardBorder}
\def\icardBorderBottom{\icardBorder}
\def\icardFont{\raggedright\parindent=1em\abntsmall\ttfamily}

\def\icardPrintGrid{%
    \def\icardGridTop{\kern\icardPadding \hrule \icardTopCorr \kern-\icardPadding}%
    \def\icardGridBottom{\hrule \kern\icardPadding}%
    \def\icardGridLeft{\kern \dimexpr \icardPadding +\icardBorderLeft
                       \vrule \icardLeftCorr
                       \kern \dimexpr-\icardPadding -\icardBorderLeft}%
    \def\icardGridRight{\kern-\icardPadding
                        \icardRightCorr \vrule
                        \kern \icardPadding}%
}

\def\icardGridTop{}
\def\icardGridBottom{}
\def\icardGridLeft{}
\def\icardGridRight{}

\def\icardLeftCorr{\kern-.4pt}  % Remove a largura da 1ª linha vertical do Grid.
\def\icardRightCorr{\kern-.4pt} % Remove a largura da 2ª linha vertical do Grid.
\def\icardTopCorr{\kern-.4pt}   % Remove a largura da 1ª linha horizontal do Grid.
%. \end{code}

% O comando \`\Enter` produz um espaço vertical equivalente ao efeito da tecla `Enter`. Ele é utilizado com frequência no arquivo `abntexto-exemplo.tex`, disponível no repositório da classe no CTAN\footnote{\url{https://ctan.org/pkg/abntexto}.}; o comando \`\nohyph` impede a hifenização dos parágrafos integralmente, sendo útil em títulos e parágrafos curtos; o \`\judgeline` produz uma linha para assinatura na Folha de Aprovação.

% \begin{code}
\def\Enter{\@ifnextchar[\startEnter{\startEnter[]}}
\def\startEnter[#1]{\vskip#1\baselineskip\relax}
\def\nohyph{\hyphenpenalty=10000\exhyphenpenalty=10000\relax}
\long\def\judgeline#1{\par{\centering \rule{.7\linewidth}{.6pt}\\ #1\par}}
%. \end{code}

% \codesection{A VÍRGULA COMO SEPARADOR DECIMAL}

% No Brasil e em outro lugares a vírgula é um separador decimal, portanto `$1,2$` deve produzir um resultado diferente de `$1, 2$`, por exemplo. As linhas abaixo são uma cópia da implementação do pacote `icomma` \cite{icomma-package}.

% \begin{code}
{\catcode`,=13 \gdef,{\futurelet\@let@token\tnba@smartcomma}}
\def\tnba@smartcomma{%
    \ifx\@let@token\@sptoken \else
    \ifx\@let@token\space    \else \mathord \fi\fi
    \tnba@mathcomma
}
\AtBeginDocument{%
    \mathchardef\tnba@mathcomma=\mathcode`\,%
    \mathcode`\,="8000
}
%. \end{code}

% \codesection{TRADUÇÕES}

% Vamos criar localizadores extras em conformidade com os arquivos de definição do `babel`, em especial, `portuges.ldf`:

% \begin{code}
\def\listacronymname{Lista de Siglas}
\def\listabbreviationname{Lista de Abreviaturas}
\def\listsymbolname{Lista de Símbolos}
%. \end{code}

% Em seguida, definiremos os localizadores acima nas âncoras do `babel.sty`, caso ele esteja presente. O ideal é que as definições abaixo estivessem em seus respectivos arquivos `.ldf`. A macroinstrução `\tryappto<cs>{<defs>}` tentará pendurar <defs> na sequência de controle <cs>, caso exista. Se <cs> não existir, `\tryappto` absorve <defs> e nada acontece. Temos que usar `\tryappto` ao invés de `\addto` ou `\appto`, porque as âncoras `\captionsbrazil`, `\captionsenglish`, `\captionsspanish` etc. só existem se seus respectivos idiomas forem chamados no argumento de `babel.sty`.

% \begin{code}
\def\tryappto#1{\ifdefined#1\expandafter\appto\expandafter#1\else\expandafter\@gobble\fi}

\AtBeginDocument{%
    \@ifpackageloaded{babel}{%
        \tryappto\captionsbrazil{%
            \def\listacronymname{Lista de Siglas}%
            \def\listabbreviationname{Lista de Abreviaturas}%
            \def\listsymbolname{Lista de Símbolos}%
        }%
        \tryappto\captionsenglish{%
            \def\listacronymname{List of Acronyms}%
            \def\listabbreviationname{List of Abreviations}%
            \def\listsymbolname{List of Simbols}%
        }%
    }{}%
}
%. \end{code}

% \codesection{O COMANDO \type{\\MakeUppercase} E O HYPERREF}

% Abaixo está definido um ajuste para que o `hyperref` não crie conflito com `\MakeUppercase` nas entradas do Sumário em situações como `\def\tocsectionfont{\MakeUppercase}`\footnote{\url{https://github.com/latex3/hyperref/issues/121\#issuecomment-589834307}.}. Esse ajuste consiste em redefinir `\hyper@linkstart` aplicando o \emph{status} `\protected` e a primitiva `\lowercase`. Infelizmente, no entanto, tal modificação não funciona no \xelatex\ quando a opção `colorlinks` está habilitada no `hyperref`: as cores dos \emph{links} não aparecem.

% \begin{code}
\AtBeginDocument{%
    \ifdefined\XeTeXversion \else
        \let\tnba@hyper@linkstartORI=\hyper@linkstart
        \protected\def\hyper@linkstart#1#2{\lowercase{\tnba@hyper@linkstartORI{#1}{#2}}}%
    \fi
}
%. \end{code}

% \codesection{COMPATIBILIDADE}

% Mensagens de alerta para comandos obsoletos definidas abaixo. Elas receberão o prefixo `\protected` como barreira contra `\MakeUppercase`.

% \begin{code}
\def\tnba@obsolete#1#2{\tnba@warning{"\string#1" é obsoleto\if#2\empty\else. #2\fi}}
\def\tnba@obs#1#2{\tnba@obsolete#1{Use "#2" ao invés}}

\protected\def \tnba@obs@sizeselectordef {\tnba@obs\sizeselectordef
    {\string\definesize}}
\protected\def \tnba@obs@sizedef {\tnba@obs\sizedef {\string\definesize}}
\protected\def \tnba@obs@normalsizedef
    {\tnba@obs \normalsizedef{\detokenize{\definesize\normalsize}}}
\protected\def \tnba@obs@extfile {\tnba@obs \extfile{\string\@starttoc{<ext>}}}
\protected\def \tnba@obs@setlayout {\tnba@obsolete \setlayout
    {Use "\string\geometry{<opções>}" do pacote "geometry" ao invés}}
\protected\def \tnba@obs@makeext {\tnba@obs \makeext{\string\addcontentsline}}
\protected\def \tnba@obs@addtoext {\tnba@obs \addtoext{\string\addcontentsline}}
\protected\def \tnba@obs@addtotoc {\tnba@obs \addtotoc{\string\addcontentsline{toc}}}
\protected\def \tnba@obs@begcorrprint {\tnba@obsolete \begcorrprint
    {Use o ambiente "corrprint" ao invés}}
\protected\def \tnba@obs@corrprinton {\tnba@obsolete \corrprinton
    {Use o ambiente "corrprint" ao invés}}
\protected\def \tnba@obs@corrprintoff {\tnba@obsolete \corrprintoff
    {Use o ambiente "corrprint" ao invés}}
\protected\def \tnba@obs@twonewpage {\tnba@obs \twonewpage
    {\detokenize{\newpage\leavevmode\newpage}}}
\protected\def \tnba@obs@setlabel {\tnba@obsolete \setlabel {}}
\protected\def \tnba@obs@cfpart {\tnba@obsolete \cfpart
    {Use "cleveref.sty"}}
\protected\def \tnba@obs@cfchapter {\tnba@obsolete \cfchapter
    {Use "cleveref.sty"}}
\protected\def \tnba@obs@cfsection {\tnba@obsolete \cfsection
    {Use "cleveref.sty"}}
\protected\def \tnba@obs@cfsubsection {\tnba@obsolete \cfsubsection
    {Use "cleveref.sty"}}
\protected\def \tnba@obs@cfsubsubsection {\tnba@obsolete \cfsubsubsection
    {Use "cleveref.sty"}}
\protected\def \tnba@obs@cfparagraph {\tnba@obsolete \cfparagraph
    {Use "cleveref.sty"}}
\protected\def \tnba@obs@cfsubparagraph {\tnba@obsolete \cfsubparagraph
    {Use "cleveref.sty"}}
\protected\def \tnba@obs@cfappendix {\tnba@obsolete \cfappendix
    {Use "cleveref.sty"}}
\protected\def \tnba@obs@cfannex {\tnba@obsolete \cfannex
    {Use "cleveref.sty"}}
\protected\def \tnba@obs@cftopics {\tnba@obsolete \cftopics
    {Use "cleveref.sty"}}
\protected\def \tnba@obs@cfsubtopics {\tnba@obsolete \cfsubtopics
    {Use "cleveref.sty"}}
\protected\def \tnba@obs@partlevel {\tnba@obsolete\partlevel{}}
\protected\def \tnba@obs@chapterlevel {\tnba@obsolete\chapterlevel{}}
\protected\def \tnba@obs@sectionlevel {\tnba@obsolete\sectionlevel{}}
\protected\def \tnba@obs@subsectionlevel {\tnba@obsolete\subsectionlevel{}}
\protected\def \tnba@obs@subsubsectionlevel {\tnba@obsolete\subsubsectionlevel{}}
\protected\def \tnba@obs@paragraphlevel {\tnba@obsolete\paragraphlevel{}}
\protected\def \tnba@obs@subparagraphlevel {\tnba@obsolete\subparagraphlevel{}}
\protected\def \tnba@obs@countseclevel {\tnba@obsolete\countseclevel{}}
\protected\def \tnba@obs@countpart {\tnba@obsolete\countpart{}}
\protected\def \tnba@obs@countchapter {\tnba@obsolete\countchapter{}}
\protected\def \tnba@obs@countsection {\tnba@obsolete\countsection{}}
\protected\def \tnba@obs@countsubsection {\tnba@obsolete\countsubsection{}}
\protected\def \tnba@obs@countsubsubsection {\tnba@obsolete\countsubsubsection{}}
\protected\def \tnba@obs@countparagraphlevel {\tnba@obsolete\countparagraphlevel{}}
\protected\def \tnba@obs@countsubparagraphlevel {\tnba@obsolete\countsubparagraphlevel{}}
\protected\def \tnba@obs@recountchapter {\tnba@obsolete\recountchapter{}}
\protected\def \tnba@obs@recountsection {\tnba@obsolete\recountsection{}}
\protected\def \tnba@obs@recountsubsection {\tnba@obsolete\recountsubsection{}}
\protected\def \tnba@obs@recountsubsubsection {\tnba@obsolete\recountsubsubsection{}}
\protected\def \tnba@obs@recountparagraph {\tnba@obsolete\recountparagraph{}}
\protected\def \tnba@obs@printnonumchapter {\tnba@obsolete\printnonumchapter{}}
\protected\def \tnba@obs@counttopicsdepth {\tnba@obsolete\counttopicsdepth{}}
\protected\def \tnba@obs@counttopics {\tnba@obsolete\counttopics{}}
\protected\def \tnba@obs@countsubtopics {\tnba@obsolete\countsubtopics{}}
\protected\def \tnba@obs@thetopics {\tnba@obsolete\thetopics{}}
\protected\def \tnba@obs@topicslabelwidth {\tnba@obsolete\topicslabelwidth
    {Configure a lista topics usando o pacote "enumitem" carregado por padrão no abntexto}}
\protected\def \tnba@obs@topicsitem {\tnba@obsolete\topicsitem
    {Configure a lista topics usando o pacote "enumitem" carregado por padrão no abntexto}}
\protected\def \tnba@obs@topicslabeli {\tnba@obsolete\topicslabeli
    {Configure a lista topics usando o pacote "enumitem" carregado por padrão no abntexto}}
\protected\def \tnba@obs@topicslabelii {\tnba@obsolete\topicslabelii
    {Configure a lista topics usando o pacote "enumitem" carregado por padrão no abntexto}}
\protected\def \tnba@obs@printlegend {\tnba@obsolete\printlegend{Use \noexpand\printlegendbox ao invés}}
\protected\def \tnba@obs@printplace {\tnba@obsolete\printplace{Use \noexpand\printplacebox ao invés}}
\protected\def \tnba@obs@printsrc {\tnba@obsolete\printsrc{Use \noexpand\printsrcbox ao invés}}
%. \end{code}

% Os comandos abaixo estão obsoletos, mas o `abntexto` vai manter suas funcionalidades ao máximo e emitirá um alerta caso sejam usados. No futuro, estes comandos serão removidos.

% \begin{code}
\def \sizeselectordef #1#2#3{\tnba@obs@sizeselectordef
                             \definesize{#1}{#2}{#3}{}}
\def \sizedef #1#2#3#4{\tnba@obs@sizedef \definesize{#1}{#2}{#3}{#4}}
\def \normalsizedef #1#2{\tnba@obs@normalsizedef
                         \definesize\normalsize{#1}{#2}{}}
\def \extfile {\tnba@obs@extfile \@starttoc}
\def \makeext {\tnba@obs@makeext \@starttoc}
\def \setlayout {\tnba@obs@setlayout \geometry}
\def \addtoext {\tnba@obs@addtoext \addcontentsline}
\def \addtotoc {\tnba@obs@addtotoc \addcontentsline{toc}}
\def \begcorrprint {\tnba@obs@begcorrprint \begin{corrprint}}
\def \corrprinton {\tnba@obs@corrprinton \begin{corrprint}}
\def \corrprintoff {\tnba@obs@corrprintoff \end{corrprint}}
\def \twonewpage {\tnba@obs@twonewpage \newpage\leavevmode\newpage}
\def \setlabel #1{\tnba@obs@setlabel \def\@currentlabel{#1}}
\def \cfpart {\tnba@obs@cfpart}
\def \cfchapter {\tnba@obs@cfchapter}
\def \cfsection {\tnba@obs@cfsection}
\def \cfsubsection {\tnba@obs@cfsubsection}
\def \cfsubsubsection {\tnba@obs@cfsubsubsection}
\def \cfparagraph {\tnba@obs@cfparagraph}
\def \cfsubparagraph {\tnba@obs@cfsubparagraph}
\def \cfappendix {\tnba@obs@cfappendix}
\def \cfannex {\tnba@obs@cfannex}
\def \cftopics {\tnba@obs@cftopics}
\def \cfsubtopics {\tnba@obs@cfsubtopics}
\def \partlevel {-1\tnba@obs@partlevel}
\def \chapterlevel {0\tnba@obs@chapterlevel}
\def \sectionlevel {1\tnba@obs@sectionlevel}
\def \subsectionlevel {2\tnba@obs@subsectionlevel}
\def \subsubsectionlevel {3\tnba@obs@subsubsectionlevel}
\def \paragraphlevel {4\tnba@obs@paragraphlevel}
\def \subparagraphlevel {5\tnba@obs@subparagraphlevel}
\def \countseclevel {\tnba@obs@countseclevel \count2}
\def \countpart {\tnba@obs@countpart \count2}
\def \countchapter {\tnba@obs@countchapter \count2}
\def \countsection {\tnba@obs@countsection \count2}
\def \countsubsection {\tnba@obs@countsubsection \count2}
\def \countsubsubsection {\tnba@obs@countsubsubsection \count2}
\def \countparagraph {\tnba@obs@countparagraph \count2}
\def \countsubparagraph {\tnba@obs@countsubparagraph \count2}
\def \recountchapter {\tnba@obs@recountchapter}
\def \recountsection {\tnba@obs@recountsection}
\def \recountsubsection {\tnba@obs@recountsubsection}
\def \recountsubsubsection {\tnba@obs@recountsubsubsection}
\def \recountparagraph {\tnba@obs@recountparagraph}
\def \printnonumchapter #1{\tnba@obs@printnonumchapter {\centering\Huge\bfseries{#1}\par}}
\def \counttopicsdepth {\tnba@obs@counttopicsdepth \count2}
\def \counttopics {\tnba@obs@counttopics}
\def \countsubtopics {\tnba@obs@countsubtopics}
\def \thetopics {\tnba@obs@thetopics}
\def \topicslabelwidth {4ex \tnba@obs@topicslabelwidth}
\def \topicslabeli {\tnba@obs@topicslabeli \thetopics)}
\def \topicslabelii {\tnba@obs@topicslabelii ---}
\def \printlegend {\tnba@obs@printlegend \printlegendbox}
\def \printplace {\tnba@obs@printlegend \printplacebox}
\def \printsrc {\tnba@obs@printlegend \printsrcbox}

%. \end{code}

% Mensagens de erro para comandos removidos:

% \begin{code}
\def\tnba@removed#1#2{\tnba@error{O comando "\string#1" foi removido. #2}}
\def\tnba@rem#1{\tnba@removed#1{}}

\protected\def \tnba@removed@advancecount {\tnba@rem\advancecount}
\protected\def \tnba@removed@advcount {\tnba@rem\advcount}
\protected\def \tnba@removed@fonts {\tnba@rem\fonts}
\protected\def \tnba@removed@setfontsize {\tnba@rem\setfontsize}
\protected\def \tnba@removed@papersizedef {\tnba@rem\papersizedef}
\protected\def \tnba@removed@definepapersize {\tnba@rem\definepapersize}
\protected\def \tnba@removed@paper {\tnba@rem\paper}
\protected\def \tnba@removed@tocifont {\tnba@removed\tocifont
    {Use "\detokenize{\def\tocsectionfont{<fonte>}}" ao invés}}
\protected\def \tnba@removed@tociifont {\tnba@removed\tociifont
    {Use "\detokenize{\def\tocsubsectionfont{<fonte>}}" ao invés}}
\protected\def \tnba@removed@tociiifont {\tnba@removed\tociiifont
    {Use "\detokenize{\def\tocsubsubsectionfont{<fonte>}}" ao invés}}
\protected\def \tnba@removed@tocivfont {\tnba@removed\tocivfont
    {Use "\detokenize{\def\tocparagraphfont{<fonte>}}" ao invés}}
\protected\def \tnba@removed@tocvfont {\tnba@removed\tocvfont
    {Use "\detokenize{\def\tocsubparagraphfont{<fonte>}}" ao invés}}
\protected\def \tnba@removed@usetocifont {\tnba@rem\usetocifont}
\protected\def \tnba@removed@usetociifont {\tnba@rem\usetociifont}
\protected\def \tnba@removed@usetociiifont {\tnba@rem\usetociiifont}
\protected\def \tnba@removed@usetocivfont {\tnba@rem\usetocivfont}
\protected\def \tnba@removed@usetocvfont {\tnba@rem\usetocvfont}
\protected\def \tnba@removed@recountseci {\tnba@rem\recountseci}
\protected\def \tnba@removed@recountsecii {\tnba@rem\recountsecii}
\protected\def \tnba@removed@recountseciii {\tnba@rem\recountseciii}
\protected\def \tnba@removed@recountseciv {\tnba@rem\recountseciv}
\protected\def \tnba@removed@startsection {\tnba@removed\startsection
    {Use "\string\printsection" ao invés}}
\protected\def \tnba@removed@startsubsection {\tnba@removed\startsubsection
    {Use "\string\printsubsection" ao invés}}
\protected\def \tnba@removed@startsubsubsection {\tnba@removed\startsubsubsection
    {Use "\string\printsubsubsection" ao invés}}
\protected\def \tnba@removed@startparagraph {\tnba@removed\startparagraph
    {Use "\string\printparagraph" ao invés}}
\protected\def \tnba@removed@startsubparagraph {\tnba@removed\startsubparagraph
    {Use "\string\printsubparagraph" ao invés}}
\protected\def \tnba@removed@setcurrlabel {\tnba@rem\setcurrlabel}
\protected\def \tnba@removed@identifysection {\tnba@rem\identifysection}
\protected\def \tnba@removed@identifysubsection {\tnba@rem\identifysubsection}
\protected\def \tnba@removed@identifysubsubsection {\tnba@rem\identifysubsubsection}
\protected\def \tnba@removed@identifyparagraph {\tnba@rem\identifyparagraph}
\protected\def \tnba@removed@identifysubparagraph {\tnba@rem\identifysubparagraph}
\protected\def \tnba@removed@noindentfirst {\tnba@rem\noindentfirst}
\protected\def \tnba@removed@smartaboveskip {\tnba@rem\smartaboveskip}
\protected\def \tnba@removed@smartbelowskip {\tnba@rem\smartbelowskip}
\protected\def \tnba@removed@heading {\tnba@removed\heading
    {Use "\detokenize{\nonum\notoc\section}" ou
     "\detokenize{\nonum\notoc\chapter}" ao invés}}
\protected\def \tnba@removed@tociuppercase {\tnba@removed\tociuppercase
    {Use "\detokenize{\def\tocsectionfont{\MakeUppercase}}" ao invés}}
\protected\def \tnba@removed@tocilowercase {\tnba@removed\tocilowercase
    {Use "\detokenize{\def\tocsectionfont{\MakeLowercase}}" ao invés}}
\protected\def \tnba@removed@sectionuppercase {\tnba@removed\sectionuppercase
    {Use "\detokenize{\def\sectionfont{\MakeUppercase}}" ao invés}}
\protected\def \tnba@removed@sectionlowercase {\tnba@removed\sectionlowercase
    {Use "\detokenize{\def\sectionfont{\MakeLowercase}}" ao invés}}
\protected\def \tnba@removed@sectionspaces {\tnba@removed\sectionspaces
    {Use "\detokenize{\def\abovesection{<valor>}}" e
     "\detokenize{\def\belowsection{<valor>}}" ao invés}}
\protected\def \tnba@removed@subsectionspaces {\tnba@removed\subsectionspaces
    {Use "\detokenize{\def\abovesubsection{<valor>}}" e
     "\detokenize{\def\belowsubsection{<valor>}}" ao invés}}
\protected\def \tnba@removed@subsubsectionspaces {\tnba@removed\subsubsectionspaces
    {Use "\detokenize{\def\abovesubsubsection{<valor>}}" e
     "\detokenize{\def\belowsubsubsection{<valor>}}" ao invés}}
\protected\def \tnba@removed@paragraphspaces {\tnba@removed\paragraphspaces
    {Use "\detokenize{\def\aboveparagraph{<valor>}}" e
     "\detokenize{\def\belowparagraph{<valor>}}" ao invés}}
\protected\def \tnba@removed@subparagraphspaces {\tnba@removed\subparagraphspaces
    {Use "\detokenize{\def\abovesubparagraph{<valor>}}" e
     "\detokenize{\def\belowsubparagraph{<valor>}}" ao invés}}
\protected\def \tnba@removed@qt {\tnba@removed\qt{Use "\string\enquote" ao invés}}
\protected\def \tnba@removed@quote {\tnba@removed\quote{Use "\string\Enquote" ao invés}}
\protected\def \tnba@removed@placespaces {\tnba@removed\placespaces
    {Use "\detokenize{\def\aboveplace{<valor>}}" e
     "\detokenize{\def\belowplace{<valor>}}" ao invés}}
\protected\def \tnba@removed@sizedpar {\tnba@rem\sizedpar}
%. \end{code}

% Os comandos a seguir foram removidos desta classe.

% \begin{code}
\def \advancecount #1{\tnba@removed@advancecount}
\def \advcount #1{\tnba@removed@advcount}
\def \fonts #1{\tnba@removed@fonts}
\def \fontsizedef #1#2{\tnba@removed@fontsizedef}
\def \papersizedef #1(#2,#3){\tnba@removed@papersizedef}
\def \definepapersize #1#2#3{\tnba@removed@definepapersize}
\def \paper #1{\tnba@removed@paper}
\def \tocifont #1{\tnba@removed@tocifont}
\def \tociifont #1{\tnba@removed@tociifont}
\def \tociiifont #1{\tnba@removed@tociiifont}
\def \tocivfont #1{\tnba@removed@tocivfont}
\def \tocvfont #1{\tnba@removed@tocvfont}
\def \recountseci {\tnba@removed@recountseci}
\def \recountsecii {\tnba@removed@recountsecii}
\def \recountseciii {\tnba@removed@recountseciii}
\def \recountseciv {\tnba@removed@recountseciv}
\def \setcurrlabel #1{\tnba@removed@setcurrlabel}
\def \identifysection {\tnba@removed@identifysection}
\def \identifysubsection {\tnba@removed@identifysubsection}
\def \identifysubsubsection {\tnba@removed@identifysubsubsection}
\def \identifyparagraph {\tnba@removed@identifyparagraph}
\def \identifysubparagraph {\tnba@removed@identifysubparagraph}
\def \noindentfirst {\tnba@removed@noindentfirst}
\def \smartaboveskip {\tnba@removed@smartaboveskip}
\def \smartbelowskip {\tnba@removed@smartbelowskip}
\def \heading {\tnba@removed@heading}
\def \tociuppercase {\tnba@removed@tociuppercase}
\def \tocilowercase {\tnba@removed@tocilowercase}
\def \sectionuppercase {\tnba@removed@sectionuppercase}
\def \sectionlowercase {\tnba@removed@sectionlowercase}
\def \sectionspaces {\tnba@removed@sectionspaces}
\def \subsectionspaces {\tnba@removed@subsectionspaces}
\def \subsubsectionspaces {\tnba@removed@subsubsectionspaces}
\def \paragraphspaces {\tnba@removed@paragraphspaces}
\def \subparagraphspaces {\tnba@removed@subparagraphspaces}
\def \qt {\tnba@removed@qt}
\def \quote {\tnba@removed@quote}
\def \placespaces {\tnba@removed@placespaces}
\def \sizedpar {\tnba@removed@sizedpar}
%. \end{code}

% \codesection{OPÇÕES DA CLASSE}

% As opções da classe `article` foram reafirmadas aqui.

% \begin{code}
\DeclareOption{a4paper}{}% Já é o padrão.
\DeclareOption{a5paper}{\geometry{a5paper}}
\DeclareOption{b5paper}{\geometry{b5paper}}
\DeclareOption{letterpaper}{\geometry{letterpaper}}
\DeclareOption{legalpaper}{\geometry{legalpaper}}
\DeclareOption{executivepaper}{\geometry{executivepaper}}
\DeclareOption{landscape}{\geometry{landscape}}
\DeclareOption{10pt}{\input{size10.clo}%
    \definesize\normalsize{10bp}{11.5bp}{}% 11.5 = 10 * 1.15
    \definesize\abntsmall{9bp}{10.35bp}{}% 10.35 = 9 * 1.15
}
\DeclareOption{11pt}{\input{size11.clo}%
    \definesize\normalsize{11bp}{12.65bp}{}% 12.65 = 11 * 1.15
    \definesize\abntsmall{10bp}{11.15bp}{}% 11.15 = 10 * 1.15
}
\DeclareOption{12pt}{}% Já é o padrão.
\DeclareOption{oneside}{\tnba@warning{Opção "oneside" inexistente em
                                      \string\documentclass. Prefira redefinir
                                      "\string\onesidelayout", "\string\twosidelayout"
                                      ou ambos}}
\DeclareOption{twoside}{\tnba@warning{Opção "twoside" inexistente em
                                      \string\documentclass. Prefira redefinir
                                      "\string\onesidelayout", "\string\twosidelayout"
                                      ou ambos}}
\DeclareOption{draft}{\overfullrule=5pt}
\DeclareOption{final}{\overfullrule=0pt}
%. \end{code}

% As linhas abaixo foram comentadas, porque o principal objetivo do ambiente `titlepage`, definido em `article.cls`, é configurar `\thispagestyle{empty}` e zerar o contador de página. Tais mudanças devem ser feitas em `\pretextual`, se necessário.

% \begin{code}
% \DeclareOption{titlepage}{\@titlepagetrue}
% \DeclareOption{notitlepage}{\@titlepagefalse}
%. \end{code}

% A opção `twocolumn` está disponível, mas o `abntexto.cls` não foi criado pensando nela, portando problemas de \emph{layout} são esperados caso ativada.

% \begin{code}
\DeclareOption{onecolumn}{}% Já é o padrão.
\DeclareOption{twocolumn}{\geometry{twocolumn}}
\DeclareOption{leqno}{\input{leqno.clo}}
\DeclareOption{fleqn}{\input{fleqn.clo}}
%. \end{code}

% A próxima opção também é oriunda da classe `article` e fornece uma estilização alternativa para o ambiente `thebibliography`.

% \begin{code}
\DeclareOption{openbib}{%
    \AtEndOfPackage{%
        \renewcommand\@openbib@code{%
            \advance\leftmargin\bibindent
            \itemindent -\bibindent
            \listparindent \itemindent
            \parsep \z@
        }%
    \renewcommand\newblock{\par}}%
}

\ProcessOptions

\endinput
%. \end{code}