% -*- coding: utf-8 -*-
% !TEX program = lualatex

% tabularray-abnt.sty
%----------------------------------------------------------------------
% copyright 2025 (C) by Sadao Massago
% autor:
%    Sadao Massago
%    e-mail: sadao@ufscar.br
%
% Licença: LaTeX Project Public License versão 1.3c or (se for a sua escolha) qualquer versão posterior.
% https://www.latex-project.org/lppl/
%----------------------------------------------------------------------

\documentclass[12pt,a4paper,oneside]{book}

\usepackage{iftex} % Para detectar o motor de TeX utilizado
% Fontes, de acordo com o motor do TeX

\ifPDFTeX % PDFLaTeX
  \usepackage[T1]{fontenc} % codificação da fonte em 8-bits
  \usepackage{mlmodern} % fontes MLModern que é mais escura que Computer Modern tradicional (espessura de letra de Book)
  %\usepackage{lmodern} % fontes Latin Modern: espessura tradicional do Computer Modern
  \usepackage[utf8]{inputenc} % acentuação direta em UTF-8
\else % XeLaTeX/LuaLaTeX
  % \usepackage{fontspec} % pacote para configurar fontes
  % \defaultfontfeatures{Ligatures=TeX}
  % seleção das fontes desejadas pode ser colocados aqui
  \usepackage{fontsetup} % New Cmputer Modern com espessura da letra de Book
  % \usepackage[olddefault]{fontsetup} % espessura tradicional do Computer Modern
\fi

% pacotes matemáticas de acordo com o motor TeX
\ifPDFTeX % PDFLaTeX
  \usepackage{amsmath,amssymb} % para matematica
\else % XeLaTeX/LuaLaTeX
  % para matemática: MikTeX pode precisar instlaçao manual de lm-math
  \usepackage{unicode-math}
  \ifLuaTeX
    \usepackage{lualatex-math}
  \fi
\fi

\usepackage[brazil]{babel}

% Para linhas horizontais com espaçamento melhorado: \toprule, \midrule, \bottomrule, \cmidrule
\usepackage{booktabs}
\usepackage{siunitx} % medidas internacionais e numeros
% para tabela longa que quebra entre páginas
\usepackage{tabularray} % tabelas configuráveis
\UseTblrLibrary{booktabs,siunitx} % para compatibilidade com booktabs e siunitx
% Configuração do tabularray para abnt
\usepackage{tabularray-abnt}

%% Para cores
\usepackage[table]{xcolor} % pacote extendido de color (ativando opção de carregar colortbl paa colorir tabelas, se desejar)

% Para inserir código de LaTeX;
\usepackage{codehigh} % https://ctan.org/pkg/codehigh
\colorlet{highbackcolor}{yellow!50}
\CodeHigh{language=latex/table,style/main=highbackcolor,style/code=highbackcolor}
% \CodeHigh{language=latex/table,style/main=yellow9,style/code=red9,style/demo=azure9}

\usepackage[
  backend=biber,
  language=auto,
  % bibencoding=utf8,
  style=abnt %authoryear,
]{biblatex}
\addbibresource{tabularray-abnt.bib} % arquivo bib

\sloppy % preferência a underfull (muito espaço entre palavras)

\usepackage{hyperref} % Para link automatico

%\SetAbntTblrFont{\footnotesize}

\title{Tabularray-abnt: tema abnt para tabularray}
\author{Sadao Massago}
\date{2025/03/14}

%%%%%%%%%%%%%%%%%%%%%
% INÍCIO DO DOCUMENTO
%%%%%%%%%%%%%%%%%%%%%
\pagestyle{empty} % inicia sem paginação
\begin{document}

\maketitle

%%%%%%%%%%%%%%%%%%%%%
% SUMARIO E SIMILARES
%%%%%%%%%%%%%%%%%%%%%

% LISTA DE QUADROS
%\clearpage\phantomsection\pdfbookmark[chapter]{\listquadroname}{lot}
%\listadequadros % Na classe memoir (ou ABNTeX2), use a versão * para não constar no sumário


% LISTA DE TABELAS
%\clearpage\phantomsection\pdfbookmark[chapter]{\listtablename}{lot}
%\listoftables %  % Na classe memoir (ou ABNTeX2), use a versão * para não constar no sumário

% SUMÁRIO
\clearpage\phantomsection\pdfbookmark{\contentsname}{toc}
\tableofcontents % No ABNTeX2 ou memoir, * para não constar ele mesmo
% para ABNTexto

%%%%%%%%%%%%%%%%%%%%
% CONTEÚDO PRINCIPAL
%%%%%%%%%%%%%%%%%%%%
\chapter{Apresentação}
 O arquivo de estilo \texttt{tabularray.sty} implementa o tema \texttt{abnt} e \texttt{quadro} para \texttt{tblr}, \texttt{talltblr} e \texttt{longtblr} para que eles produzam tabelas e quadros de acordo com a norma \texttt{ABNT}.

O ambiente \texttt{tblr} (com opção \texttt{tall}) e \texttt{talltblr} podem ser usados para produzir tabelas dentro do ambiente de tabelas flutuante e   
O ambiente \texttt{tblr} (com opção \texttt{long}) e \texttt{longtblr} produzem tabelas e quadros longos. Ao escolher tema \texttt{abnt} ou \texttt{quadro} para estes ambientes, poderá configurar para produzir tabela ou quadro compatível com a norma ABNT, com poucos ajustes.

Para a comodidade, foram implementados ambientes \texttt{abnttblr}, \texttt{tallabnttblr} e \texttt{longabnttblr} que aplicam o tema \texttt{abnt} por padrão, além de permitir configurar a fonte usada pelo comando \verb+\SetAbntTblrFont+. Por exemplo, \verb+\SetAbntTblrFont{\footnotesize}+ configurará para que as fontes usadas nestas tabelas e quadros sejam no tamanho \verb+\footnotsize+.

Note que, para classe exceto o \texttt{abntexto}, será providenciado o ambiente \texttt{quadro} que funciona similarmente para tabelas, e para a classe \texttt{abntexto}, será criada a entrada de legenda ``quadro'' em vez do ambiente que funcionará devidamente como quadro.

\chapter{Alguns Comentários e Exemplos}
Note que a norma \texttt{ABNT} adota o padrão \texttt{IBGE} para tabelas.
Além disso, separa em duas categorias.
O primeiro delas é quando é uma tabela para finalidade de apresentar dados numéricos, denominado de \emph{tabela}.
O segundo delas é quando o conteúdo é texto ou similar na qual não tem pretensão de apresentar dados numéricos, denominados de \emph{quadro}.

As tabelas, não podem ter fechamento nos laterais (esquerda e direita), além de não usar linhas horizontais no corpo da tabela.
Tabelas devem ter uma linha de títulos das colunas (que descreve o que são cada colunas), separado do corpo de tabelas pela linha horizontal. A parte de cima e de baixo deve apresentar linha horizontal para fechamento.
Por outro lado, quadro deve ser fechado nos latarias, parte de cima e de baixo e ter grade de divisão.

O \texttt{ABNTeX2} e \texttt{ABNTexto} implementam as tabelas curtas no padrão \texttt{ABNT}, mas ainda não tem suporte as tabelas longas (2004) que ocupam mais de uma página. O objetivo desta estilo é dar suporte a tabela e quadros curtos e longos no padrão \texttt{ABNT} através do ambientes fornecidos pelo \texttt{tabularray}.

Para diagramar uma tabela curta, basta usar o ambiente \texttt{abnttblr} com opção \texttt{tall} ou o ambiente \texttt{tallabnttblr} de forma similar a \texttt{tblr} com opção \texttt{tall} ou \texttt{talltblr}. 
No ABNT, tabelas e figuras devem ser centralizados no texto.

\begin{codehigh}[boxsep=4mm]
A Tabela~\ref{abnttblr:curta} é tabela que auto posiciona.
\begin{table}[hbp!]
\center
\begin{tallabnttblr}
[
  caption={Tabela curta},
  label={abnttblr:curta},
  remark{Fonte} = {Elaboração do autor.},  
  remark{Nota} = {Testando o estilo ABNT. 
    A nota é opcional no ABNT},
]
{
  rowspec={lr}, % l=left, r=right
  row{1}={\bfseries}, % primeira linha
  row{Z}={\bfseries}, % última linha
}
\toprule
   produto & preço \\
\midrule
   cenouras  (500g)          & R\$0,50  \\
   cogumelos (vidro de 500g) & R\$5,00  \\
   batata    (1Kg)           & R\$1,20  \\
\midrule
   total & R\$6,70 \\
\bottomrule   
\end{tallabnttblr}
\end{table}
\end{codehigh}

Lembrando que toda tabela deve ser referenciada no texto e deve conter a fonte (no exemplo, criado pelo \texttt{remark}). O parâmetro \texttt{note} não vai funcionar como \texttt{ABNT}.

\begin{codehigh}[boxsep=4mm]
\begin{table}[hbp!]
\begin{talltblr}
[
  theme=abnt,
  caption={Tabela curta simples},
  label={tab:talltblr:simples},
  remark{Fonte}={Elaboração do autor},
]
{
  colspec = {XX}, % largura automatica das colunas
}
\toprule
  nome & valor \\
\midrule
  Nome 1 & 1 \\ 
  Nome 2 & 2 \\ 
  Nome 3 & 3 \\
\bottomrule
\end{talltblr}
\end{table}
\end{codehigh}

A Tabela~\ref{tab:longa} é uma tabela que ocupa várias páginas.
Tal tabela pode ser criado pelo ambiente \texttt{longabnttblr}. Devido ao código implementado no \texttt{tabularray-abnt.sty}, precisa de duas compilações para que o cabeçalho seja ajustado devidamente.

A Tabela~\ref{tab:longa} usa o pacote \texttt{siunitx} para converter os  decimais em virgula, além de lidar com o seu alinhamento no decimal. Nesta tabela, foi usado a coloração de linhas em zebra (branco e cinza alternada) para facilitar o acompanhamento das linhas.

Configuração foi como segue.

\begin{codehigh}[boxsep=4mm]
\sisetup{
  locale=DE, % Alemão: virgula como decimal
  table-format=4.2, % 4 digitos, 2 digitos decimais
  table-number-alignment=center % alinhar no decimal
}
\begin{longabnttblr}
[
  caption = {Tabela longa}, % titulo
  label={tab:longa}, % rotulo para referências cruzadas
  remark{Fonte}={Elaboração do autor},  
]
{ 
  colspec = {XX[r,si]}, % X é largura automatica. Segundo X tem como parâmetro opcional r (direita) e si (número usando pacote siunitx)
  rowhead = 1, % primeira linha será repatida em todas páginas
  row{1} = {font=\bfseries}, % linha de título
  row{even} = {gray!15}, % linhas par em cinza
  % row{Z} = {font=\bfseries,white}, % última linha  
}
...
\end{longabnttblr}
\end{codehigh}

% alinhamento no decimal:
%https://tex.stackexchange.com/questions/303395/align-numbers-based-on-their-decimal-point
% configurando o siunitx
\sisetup{
  locale=DE, % Alemão: virgula como decimal
  table-format=4.2, % 4 digitos, 2 digitos decimais
  table-number-alignment=center % alinhar no decimal
}  

%\makeatletter
%\global\let\if@tablularray@abnt@mark@spanpages\iftrue
%\makeatother
%\typeout{DEBUG: inicio de longtabntblr: page=\thepage}

\begin{longabnttblr}
[
  %theme=abnt,
  caption = {Tabela longa}, % titulo
  label={tab:longa}, % rotulo para referências cruzadas
  remark{Fonte}={Elaboração do autor},  
]
{ 
  colspec = {XX[r,si]}, % X é largura automatica. Segundo X tem como parâmetro opcional r (direita) e si (número usando pacote siunitx)
  rowhead = 1, % primeira linha será repatida em todas páginas
  row{1} = {font=\bfseries}, % linha de título
  row{even} = {gray!15}, % linhas par em cinza
  % row{Z} = {font=\bfseries,white}, % última linha  
}
\toprule
 texto & \text{número} \\ \midrule
 linha 1 & 1.1 \\ % \midrule
 linha 2 & 2.2 \\ % \midrule
 linha 3 & 3.3 \\ % \midrule
 linha 4 & 4.4 \\ % \midrule
 linha 5 & 5.5 \\ % \midrule
 linha 6 & 6.6 \\ % \midrule
 linha 7 & 7.7 \\ % \midrule
 linha 8 & 8.8 \\ % \midrule
 linha 9 & 9.9 \\ % \midrule
 linha 10 & 10.10 \\ % \midrule
 %\linebreak % para teste
 linha 11 & 11.11 \\
 linha 12 & 12.12 \\
 linha 13 & 13.13 \\
 linha 14 & 14.14 \\
 linha 15 & 15.15 \\  
 \bottomrule
 \end{longabnttblr}

%\typeout{DEBUG: final de longtabntblr: page=\thepage}
%\makeatletter
%\global\let\if@tablularray@abnt@mark@spanpages\iffalse
%\makeatother

Quadro flutuante poderá ser produzido pelo ambiente \texttt{quadro}, exceto para classe \texttt{abntexto} (na qual deverá usar \texttt{table}, caso queira que seja flutuante), como no Quadro~\ref{quadro:flutuante}. 
Para produzir o quadro, use o tema \texttt{quadro} fornecido pelo \texttt{tabularray-abnt.sty}, como em

\begin{codehigh}[boxsep=4mm]
\begin{quadro}[hbp!]
\begin{tallabnttblr}
[
  theme=quadro,
  caption={Quadro flutuante simples},
  label={quadro:flutuante},
  remark{Fonte}={Elaboração do autor},  
]
{
  colspec = {XX},
  vlines,hlines, % grades, necessários para quadro.
}
...
\end{tallabnttblr}
\end{quadro}
\end{codehigh}

Note o uso de grade, o que é necesário para quadros.

\begin{quadro}[hbp!]
\begin{tallabnttblr}
[
  theme=quadro,
  caption={Quadro flutuante simples},
  label={quadro:flutuante},
  remark{Fonte}={Elaboração do autor},  
]
{
  colspec = {XX},
  vlines,hlines, % grades, necessários para quadro.
}
Nome 1 & Sobrenome 1 \\
Nome 2 & Sobrenome 2 \\
\end{tallabnttblr}
\end{quadro}

O quadro longo pode ser produzido pelo tema \texttt{quadro} fornecido pelo \texttt{tabularray-abnt.sty}, sobre \texttt{longanbttblr} como no Exemplo~\ref{quadro:longo}.

% Problema conhecida: Quando o inicio de uma tabela ficar no final de uma página, numa compilação, ficará em duas páginas sem a indicação de continuação da tabela e na próxima compilação, ficará tudo na próxima página, indicando que tem continuação. Isto repete. A causa disso é que o tamanho do título da tabela aumenta em uma linha quando tem a indicação de continuação (assim, não cabendo no final da página, ficará tudo na próxima página). Quando esta tudo na proxima página, agora o titulo nõ tem indicação de continuação, reduzindo em uma linha (logo, o inicio da tabela pode ser colocado no final da página anterior). Para resolver este problema, coloque a quebra de linha (\verb+\newpage+ antes da tabela para assegurar que o início da tabela não veha a ocorrer no final da página anterior.

% \enlargethispage{1.3cm} % espaçamento exato faltando para ocorrer o roblema descrito anteriormente
% \newpage % para contornar o problema

\begin{longabnttblr}
[
  theme={quadro},
  caption={Um quadro longo simples},
  label={quadro:longo},
  remark{Fonte}={Elaboração do autor},  
  remark{Nota}={Usando o tema quadro para produzir quadro},    
]
{
  colspec = {XX}, % largura automatica das colunas
  vlines,hlines, % fazer grade
}
linha 1 & texto 1 \\
linha 2 & texto 2 \\
linha 3 & texto 3 \\
linha 4 & texto 4 \\
linha 5 & texto 5 \\
%\pagebreak % quebrando página para teste
linha 6 & texto 6 \\
linha 7 & texto 7 \\
linha 8 & texto 8 \\
linha 9 & texto 9 \\
linha 10 & texto 10 \\
linha 11 & texto 11 \\
linha 12 & texto 12 \\
linha 13 & texto 13 \\
linha 14 & texto 14 \\
linha 15 & texto 15 \\
\end{longabnttblr}

Para configurar a fonte usado em \texttt{abnttblr}, \texttt{tallabnttblr} e \texttt{longabnttblr}, usa-se o comando \verb+\SetAbntTblrFont+. Por exemplo, \verb+\SetAbntTblrFont{\footnotesize}+ configura o corpo de tabelas em \texttt{footnotesize} até que tenha nova chamada de \verb+\SetAbntTblrFont+.
Os ambientes \texttt{tallabnttblr}/\texttt{longabnttblr} é mesmo que \texttt{talltblr}/\texttt{longtblr} com a opção \texttt{theme=abnt} no parâmetro opcional, exceto pela possibilidade de ajuste da fonte pelo comando \verb+\SetAbntTblrFont+.

Note que \texttt{tblr}, \texttt{talltblr} e \texttt{longtblr} do \texttt{tabularray} funciona também no modo matemático. Assim, \texttt{abnttblr}, \texttt{tallabnttblr} e \texttt{longabnttblr} também funcionarão no modo matemático.

\textbf{Observação sobre lista de quadros}
A lista de quadros pode ser produzido pelo \verb+\listadequadros+. Note que na classe \texttt{ABNTeX2} acrescenta no sumário por padrão e para evitar isso, basta usar a versão ``*''. Para classe \texttt{abntexto}, terá o comando \verb+\makeloq+ que funcionará da mesma forma que \verb+makelot+.

Para \texttt{tabularray}, veja o \textcite{book:tabularray:lyu}. Sobre \texttt{ABNTeX2} e \texttt{ABNText}, vejam \textcite{book:abnt2:araujo} e \textcite{book:abntexto:abreu}.

\chapter{Problema conhecida}
Quando o inicio de uma tabela ficar no final de uma página, numa compilação, ficará em duas páginas sem a indicação de continuação da tabela e na próxima compilação, ficará tudo na próxima página, indicando que tem continuação. Isto repete. A causa disso é que o tamanho do título da tabela aumenta em uma linha quando tem a indicação de continuação (assim, não cabendo no final da página, ficará tudo na próxima página). Quando esta tudo na próxima página, agora o título não tem indicação de continuação, reduzindo em uma linha (logo, o inicio da tabela pode ser colocado no final da página anterior). Como a informação de continuação é referente à compilação anterior, a indicação de compilação ficará inconsistente.
Para resolver este problema, coloque a quebra de linha (\verb+\newpage+ antes da tabela para assegurar que o início da tabela não venha a ocorrer no final da página anterior.

\chapter{Código}

%\CodeHigh{lite}
\dochighinput[language=latex/latex3]{tabularray-abnt.sty}

\phantomsection
\printbibliography[heading=bibintoc]

\end{document}

%%%%%%%%%%%%%%%%%%%
% FIM DO DOCUMENTO
%%%%%%%%%%%%%%%%%%%
