% \iffalse meta-comment
%
% attinormativi.dtx
%
% Documented source for the `attinormativi' LaTeX class.
% Sorgente documentato per la classe LaTeX `attinormativi'.
%
% Copyright (C) 2026 Federico Gallo <gallofede75@gmail.com>
%
% This work may be distributed and/or modified under the conditions of
% the LaTeX Project Public License, either version 1.3c of this license
% or (at your option) any later version.
% The latest version of this license is at:
%   https://www.latex-project.org/lppl.txt
% This work has the LPPL maintenance status `maintained'.
% The Current Maintainer of this work is Federico Gallo.
%
% This work consists of the files:
%   attinormativi.dtx   (this file)
%   attinormativi.ins
% and the derived files:
%   attinormativi.cls
%
% \fi
%
% \iffalse
%<*driver>
\ProvidesFile{attinormativi.dtx}
  [2026/05/25 v1.2 Documented source for attinormativi class]
\documentclass[11pt,a4paper]{ltxdoc}
\usepackage{iftex}
\ifPDFTeX
  \usepackage[utf8]{inputenc}
  \usepackage[T1]{fontenc}
  \usepackage{tgtermes}
  \usepackage[scale=0.92]{tgheros}
  \usepackage{tgcursor}
\else
  \usepackage{fontspec}
  \setmainfont{TeX Gyre Termes}
  \setsansfont{TeX Gyre Heros}
  \setmonofont{TeX Gyre Cursor}
\fi
\usepackage[italian]{babel}
\addto\captionsitalian{\renewcommand{\abstractname}{Abstract}}
\usepackage[
  a4paper,
  top=25mm, bottom=25mm,
  inner=38mm, outer=24mm,
  marginparwidth=33mm,
  marginparsep=3mm,
  headheight=14pt
]{geometry}
\usepackage[dvipsnames,svgnames]{xcolor}
\definecolor{accentcolor}{HTML}{2B4D8E}
\definecolor{codebg}     {HTML}{F5F5F5}
\definecolor{notabg}  {HTML}{FFF8DC}
\definecolor{warnbg}  {HTML}{FFF0E0}
\definecolor{warnframe}{HTML}{C0602A}
\definecolor{rulecolor}  {HTML}{CCCCCC}
\usepackage{hologo}
\usepackage{booktabs}
\usepackage{array}
\usepackage{longtable}
\usepackage{enumitem}
\usepackage{ragged2e}
\newcolumntype{L}[1]{>{\RaggedRight\arraybackslash}p{#1}}
\setlist[itemize] {noitemsep, topsep=0.4ex, leftmargin=1.8em}
\setlist[enumerate]{noitemsep, topsep=0.4ex, leftmargin=1.8em}
\usepackage{tcolorbox}
\tcbuselibrary{skins,breakable}
\newtcolorbox{notabox}[1][Nota]{%
  enhanced, breakable,
  colback=notabg, colframe=accentcolor,
  fonttitle=\bfseries\small, title={#1},
  left=4pt, right=4pt, top=3pt, bottom=3pt, boxrule=0.5pt,
  before=\smallskip, after=\smallskip
}
\newtcolorbox{warnbox}[1][Attenzione]{%
  enhanced, breakable,
  colback=warnbg, colframe=warnframe,
  fonttitle=\bfseries\small, title={#1},
  left=4pt, right=4pt, top=3pt, bottom=3pt, boxrule=0.5pt,
  before=\smallskip, after=\smallskip
}

\newcommand*{\pkg}[1]{\textsf{#1}}
\newcommand*{\cls}[1]{\textsf{#1}}
\newcommand*{\opt}[1]{\texttt{#1}}
\providecommand*{\meta}[1]{\textlangle\textit{#1}\textrangle}
\newenvironment{cmdtable}[1][Comando]{%
  \vspace{0.4ex}\small\sloppy
  \begin{longtable}{L{0.46\linewidth} L{0.48\linewidth}}
  \toprule
  \textbf{#1} & \textbf{Descrizione} \\
  \midrule\endhead
  \bottomrule\endlastfoot
}{%
  \end{longtable}\vspace{0.2ex}
}
\newcommand*{\cmdrow}[2]{\texttt{#1} & #2 \\[0.15ex]}
\EnableCrossrefs
\CodelineIndex
\RecordChanges

\usepackage{hyperref}
\hypersetup{%
  colorlinks=true,
  linkcolor=accentcolor,
  citecolor=accentcolor,
  urlcolor=accentcolor,
  pdfborder={0 0 0},
  pdftitle={attinormativi --- Sorgente documentato},
  pdfsubject={Classe LaTeX per atti normativi italiani},
  pdfkeywords={LaTeX, atti normativi, diritto, italiano, CTAN}
}

\begin{document}
  \DocInput{attinormativi.dtx}
  \PrintChanges
  \PrintIndex
\end{document}
%</driver>
% \fi
%
% \changes{v1.1}{2026/05/17}{Versione stabile.}
% \changes{v1.2}{2026/05/25}{Migrazione font a TeX Gyre (Termes, Heros,
%   Cursor). Con pdf\LaTeX{} vengono caricati \pkg{tgtermes},
%   \pkg{tgheros} e \pkg{tgcursor}; con \hologo{XeLaTeX} e
%   \hologo{LuaLaTeX} i corrispondenti font OpenType tramite
%   \pkg{fontspec}. Aggiunta opzione \opt{accessible}: supporto
%   PDF/UA-1 tramite \pkg{tagpdf} e kernel tagging. Tagging strutturato
%   del frontespizio, del comma, dell'ambiente definizioni (sezioni~6,
%   9, 14, 16). Mappatura ruoli \texttt{H1}--\texttt{H5} per la gerarchia
%   strutturale (sezione~11). Registrazione liste \texttt{lettere} e
%   \texttt{numeri} come \texttt{OL} in \pkg{tagpdf} (sezione~15).
%   Tagging \texttt{Sect}/\texttt{Caption} per ambienti \texttt{preambolo},
%   \texttt{relazione} e allegati (sezioni~17, 19). Tagging \texttt{TOC}
%   per gli indici secondari (sezioni~16, 19, 20).}

% \GetFileInfo{attinormativi.dtx}
%
% \DoNotIndex{\newcommand,\renewcommand,\NewDocumentCommand}
% \DoNotIndex{\begin,\end,\par,\vspace,\hspace,\noindent}
% \DoNotIndex{\textbf,\textit,\textrm,\texttt,\emph}
% \DoNotIndex{\small,\large,\Large,\huge,\Huge,\normalsize,\normalfont}
% \DoNotIndex{\centering,\clearpage,\phantomsection}
% \DoNotIndex{\label,\ref,\nameref,\addcontentsline}
% \DoNotIndex{\setcounter,\the,\value,\refstepcounter,\stepcounter}
% \DoNotIndex{\ifx,\empty,\else,\fi,\begingroup,\endgroup}
% \DoNotIndex{\RequirePackage,\LoadClass,\ProvidesClass,\NeedsTeXFormat}
% \DoNotIndex{\DeclareOption,\ProcessOptions,\CurrentOption}
% \DoNotIndex{\newif,\newcounter,\newlist,\newenvironment}
% \DoNotIndex{\AtBeginDocument,\@ifpackageloaded,\@starttoc}
% \DoNotIndex{\protected@edef,\@currentlabelname,\@dottedtocline}
%
% \title{La classe \textsf{attinormativi}\\[0.3ex]
%        \large Sorgente documentato --- Versione \fileversion}
% \author{Federico Gallo\\\texttt{gallofede75@gmail.com}}
% \date{\filedate}
%
% \maketitle
%
% \begin{abstract}
% \smallskip
% The class \cls{attinormativi} provides a complete typographic framework
% for drafting Italian normative acts: laws, decrees, regulations,
% statutes, resolutions, and similar documents. It manages the six-level
% hierarchical structure typical of the Italian legislative tradition
% (\emph{Book}, \emph{Title}, \emph{Chapter}, \emph{Section},
% \emph{Article}, \emph{Paragraph}), the institutional title page,
% dedicated indexes (articles, annexes, definitions), draft mode with
% editorial notes, optional integration with the \pkg{cleveref}
% package for Italian-language cross-references, and --- from v1.2 ---
% full PDF/UA-1 accessibility tagging via the \opt{accessible} class
% option, in compliance with Directive~(EU)~2016/2102.
%
% \bigskip
% \smallskip
% La classe \cls{attinormativi} fornisce un framework tipografico completo
% per la composizione di atti normativi italiani: leggi, decreti, regolamenti,
% statuti, delibere e documenti assimilabili. Gestisce la struttura gerarchica
% a sei livelli tipica della tradizione legislativa italiana (\emph{Libro},
% \emph{Titolo}, \emph{Capo}, \emph{Sezione}, \emph{Articolo}, \emph{Comma}),
% il frontespizio istituzionale, gli indici dedicati (articoli, allegati,
% definizioni), la modalità bozza con note redazionali, l'integrazione
% opzionale con il pacchetto \pkg{cleveref} per i riferimenti incrociati
% in italiano e --- dalla v1.2 --- il tagging strutturale PDF/UA-1
% tramite l'opzione \opt{accessible}, in conformità alla
% Direttiva~(UE)~2016/2102 recepita con D.Lgs.\ 106/2018.
%
% \end{abstract}
%
% \tableofcontents
%
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% \section{Introduzione}
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% La classe \cls{attinormativi} è costruita sopra la classe standard
% \cls{book} ed è compatibile con pdf\LaTeX{}, \hologo{XeLaTeX} e
% \hologo{LuaLaTeX}.
%
% La classe introduce:
% \begin{itemize}
%   \item una gerarchia strutturale a sei livelli corrispondente alla
%         tradizione legislativa italiana;
%   \item comandi per i metadati dell'atto e generazione automatica
%         del frontespizio;
%   \item numerazione automatica e manuale, con isolamento del numero
%         manuale in un gruppo \TeX{} per non alterare il contatore interno;
%   \item riferimenti incrociati tra articoli e commi, con supporto
%         nativo per il pacchetto \pkg{cleveref};
%   \item un glossario delle definizioni con indice separato;
%   \item liste tipizzate per le enumerazioni normative
%         (\emph{lettere} e \emph{numeri});
%   \item tre comandi tipizzati per le clausole finali ricorrenti;
%   \item allegati con numerazione automatica alfabetica e indice;
%   \item un indice specifico degli articoli;
%   \item modalità bozza con note redazionali a blocco e in linea;
%   \item opzioni di classe per la famiglia tipografica, i margini
%         e l'impaginazione fronte/retro;
%   \item tagging strutturale PDF/UA-1 tramite l'opzione \opt{accessible},
%         in conformità alla Direttiva~(UE)~2016/2102.
% \end{itemize}
%
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% \section{Requisiti e installazione}
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% \subsection{Motori di composizione}
%
% Tutte le funzionalità della classe sono disponibili con
% pdf\LaTeX{}, \hologo{XeLaTeX} e \hologo{LuaLaTeX}.
% Si raccomanda \TeX{} Live 2020 o successivo oppure MiK\TeX{} 21
% o successivo.
%
% \begin{notabox}[Eccezione: opzione \opt{accessible}]
% L'unica funzionalità che richiede un motore specifico è il tagging
% PDF/UA-1, attivato dall'opzione \opt{accessible}. Questa opzione
% è disponibile \textbf{esclusivamente con \hologo{LuaLaTeX}} e
% \TeX{} Live 2023 o successivo. Per i dettagli vedere
% §~\ref{subsec:accessible}.
% \end{notabox}
%
% \subsection{Pacchetti richiesti}
%
% Tutti i pacchetti elencati sono inclusi in una installazione standard
% di \TeX{} Live o MiK\TeX{}:
%
% \begin{cmdtable}[Pacchetto]
%   \cmdrow{iftex}    {Rilevamento del motore}
%   \cmdrow{inputenc} {Codifica input UTF-8 (solo pdf\LaTeX{})}
%   \cmdrow{fontenc}  {Codifica font T1 (solo pdf\LaTeX{})}
%   \cmdrow{tgtermes} {TeX Gyre Termes --- serif (solo pdf\LaTeX{})}
%   \cmdrow{tgheros}  {TeX Gyre Heros --- sansserif (solo pdf\LaTeX{})}
%   \cmdrow{tgcursor} {TeX Gyre Cursor --- monospaced (solo pdf\LaTeX{})}
%   \cmdrow{fontspec} {Font OpenType per \hologo{XeLaTeX}/\hologo{LuaLaTeX}}
%   \cmdrow{geometry} {Impostazione dei margini}
%   \cmdrow{babel}    {Localizzazione italiana}
%   \cmdrow{microtype}{Ottimizzazione microtypografica}
%   \cmdrow{xcolor}   {Colori per le note redazionali}
%   \cmdrow{xparse}   {Sintassi avanzata per i comandi (solo kernel < 2020-10-01)}
%   \cmdrow{titlesec} {Formattazione dei titoli di sezione}
%   \cmdrow{chngcntr} {Gestione dei contatori}
%   \cmdrow{enumitem} {Liste personalizzate}
%   \cmdrow{hyperref} {Riferimenti ipertestuali e metadati PDF}
%   \cmdrow{tagpdf}   {Tagging PDF/UA-1 --- solo con l'opzione \opt{accessible}
%                      (\hologo{LuaLaTeX} + \TeX{} Live 2023+ richiesti)}
% \end{cmdtable}
%
% \subsection{Installazione}
%
% \subsubsection*{TeX Live e MiKTeX (caso normale)}
%
% La classe è distribuita tramite CTAN ed è inclusa in \textbf{\TeX{} Live}
% e \textbf{MiK\TeX{}}. Se si usa una di queste distribuzioni non è
% necessario copiare alcun file manualmente: è sufficiente aggiornare
% i pacchetti con il gestore della propria distribuzione.
%
% Con \TeX{} Live (da terminale):
% \begin{verbatim}
%   tlmgr update attinormativi
% \end{verbatim}
%
% Con MiK\TeX{}: avviare il \textbf{MiK\TeX{} Console}, selezionare
% «Updates» e aggiornare il pacchetto \texttt{attinormativi}, oppure
% eseguire da terminale:
% \begin{verbatim}
%   miktex packages update attinormativi
% \end{verbatim}
%
% \subsubsection*{Installazione locale a un singolo progetto}
%
% Per un uso occasionale è sufficiente copiare \texttt{attinormativi.cls}
% nella stessa cartella del file \texttt{.tex} da compilare.
%
% Per rigenerare \texttt{attinormativi.cls} dal sorgente documentato
% \texttt{attinormativi.dtx} sarà sufficiente compilare il file
% \texttt{attinormativi.ins}.
%
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% \section{Opzioni della classe}
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% \subsection{Opzione \opt{bozza}}
%
% L'opzione \opt{bozza} attiva la modalità bozza: le note redazionali
% inserite con |\notaredaz| e |\notaredazinline| diventano
% visibili nel documento compilato. In assenza di tale opzione le note
% non compaiono nel PDF.
%
% \begin{cmdtable}[Opzione]
%   \cmdrow{bozza}{Attiva le note redazionali e il banner di bozza}
% \end{cmdtable}
%
% \subsection{Opzione \opt{accessible}}
% \label{subsec:accessible}
%
% L'opzione \opt{accessible} attiva il supporto alla produzione di
% PDF conformi allo standard \textbf{PDF/UA-1} (ISO~14289-1), come
% richiesto dalla Direttiva (UE)~2016/2102 recepita in Italia con
% D.Lgs.\ 106/2018.
%
% \begin{cmdtable}[Opzione]
%   \cmdrow{accessible}{Attiva il tagging strutturale PDF/UA-1
%                       (solo \hologo{LuaLaTeX} + \TeX{} Live 2023+)}
% \end{cmdtable}
%
% \begin{warnbox}[Requisiti dell'opzione \opt{accessible}]
% L'opzione \opt{accessible} richiede \textbf{tutti e tre} i seguenti
% prerequisiti:
% \begin{itemize}
%   \item \textbf{Motore \hologo{LuaLaTeX}.}
%         Il tagging PDF/UA non è supportato da pdf\LaTeX{} né da
%         \hologo{XeLaTeX} nella forma completa con il kernel attuale.
%         Se si usa un motore diverso, la classe emette un
%         \cs{ClassWarning} e disattiva automaticamente il tagging;
%         la compilazione prosegue senza errori fatali ma il PDF
%         prodotto non è taggato.
%   \item \textbf{\TeX{} Live 2023 o successivo}
%         (kernel \LaTeX{}~$\geq$ 2023-06-01), che include il
%         framework di tagging automatico e il pacchetto \pkg{tagpdf}.
%   \item \textbf{La dichiarazione \cs{DocumentMetadata}} inserita
%         \emph{prima} di \cs{documentclass} nel file \texttt{.tex}
%         dell'utente (vedere l'esempio al §~\ref{sec:esempio-accessible}).
%         Se \cs{DocumentMetadata} è assente, la classe emette un
%         \cs{ClassWarning} e disattiva automaticamente il tagging;
%         anche in questo caso la compilazione prosegue senza errori
%         fatali ma il PDF prodotto non è taggato.
% \end{itemize}
% In entrambi i casi di fallback il booleano pubblico
% \cs{ifANaccessible} vale \texttt{false} e può essere interrogato
% nel documento per codice condizionale.
% \end{warnbox}
%
% \subsubsection{Utilizzo}
%
% Il documento utente deve anteporre a |\documentclass| la dichiarazione:
%
% \begin{verbatim}
%   \DocumentMetadata{
%     pdfversion  = 1.7,
%     pdfstandard = UA-1,
%     lang        = it-IT,
%   }
%   \documentclass[accessible]{attinormativi}
% \end{verbatim}
%
% \label{sec:esempio-accessible}
% La dichiarazione |\DocumentMetadata| inizializza il motore di tagging
% del kernel LaTeX e specifica la lingua del documento. L'opzione
% \opt{accessible} della classe attiva quindi il caricamento di \pkg{tagpdf}
% e le strutture di tagging specifiche per gli elementi non gestiti
% automaticamente dal kernel.
%
% \begin{notabox}[Compatibilità con \opt{bozza}]
% Le opzioni \opt{accessible} e \opt{bozza} sono compatibili.
% In modalità bozza, le note redazionali (\cs{notaredaz} e
% \cs{notaredazinline}) vengono marcate come \texttt{Artifact} nel
% PDF taggato, in modo che i lettori di schermo non le trattino
% come contenuto normativo.
% \end{notabox}
%
% \subsection{Opzione \opt{serif} / \opt{sansserif}}
%
% Controlla la famiglia tipografica del documento.
%
% \begin{cmdtable}[Opzione]
%   \cmdrow{serif (default)}
%         {TeX Gyre Termes --- tutti i motori}
%   \cmdrow{sansserif}
%         {TeX Gyre Heros --- tutti i motori}
% \end{cmdtable}
%
% In entrambe le modalità la sillabazione italiana e la giustificazione
% rimangono pienamente attive.
%
% \subsection{Opzione \opt{simplex} / \opt{duplex}}
%
% Controlla l'impaginazione fronte/retro.
%
% \begin{cmdtable}[Opzione]
%   \cmdrow{simplex (default)}
%         {Impaginazione solo fronte; alias: \opt{oneside}}
%   \cmdrow{duplex}
%         {Impaginazione fronte/retro; alias: \opt{twoside}}
% \end{cmdtable}
%
% \begin{warnbox}[Nota implementativa --- duplex e keyval/geometry]
% La classe inietta le stringhe \texttt{twoside}/\texttt{oneside}
% nell'argomento esplicito di \cs{LoadClass}, non tramite
% \cs{PassOptionsToClass}. Questo evita il conflitto con
% \pkg{keyval}/\pkg{geometry} che si verifica quando quelle stringhe
% raggiungono \pkg{keyval} dopo la sua inizializzazione.
% \end{warnbox}
%
% \subsection{Opzioni di margine}
%
% Le opzioni \opt{left=}, \opt{right=}, \opt{top=}, \opt{bottom=}
% consentono di sovrascrivere i margini predefiniti direttamente nella
% dichiarazione della classe.
%
% \begin{cmdtable}[Margine]
%   \cmdrow{left}   {35\,mm (default)}
%   \cmdrow{right}  {30\,mm (default)}
%   \cmdrow{top}    {25\,mm (default)}
%   \cmdrow{bottom} {25\,mm (default)}
% \end{cmdtable}
%
% Esempio:
% \begin{verbatim}
%   \documentclass[left=40mm, right=25mm, top=30mm]{attinormativi}
% \end{verbatim}
%
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% \section{Comandi e ambienti}
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% \subsection{Metadati dell'atto}
%
% \DescribeMacro{\autoritaatto}
% \DescribeMacro{\tipoatto}
% \DescribeMacro{\numeroatto}
% \DescribeMacro{\dataatto}
% \DescribeMacro{\titoloatto}
% \DescribeMacro{\oggettoatto}
% I sei comandi di metadato si dichiarano nel preambolo del documento,
% prima di |\begin{document}|. Tutti sono opzionali: le voci non
% impostate non compaiono nel frontespizio.
%
% \begin{cmdtable}
%   \cmdrow{\textbackslash autoritaatto\{testo\}}{Ente o autorità emanante}
%   \cmdrow{\textbackslash tipoatto\{testo\}}    {Tipo dell'atto}
%   \cmdrow{\textbackslash numeroatto\{testo\}}  {Numero identificativo}
%   \cmdrow{\textbackslash dataatto\{testo\}}    {Data in forma libera}
%   \cmdrow{\textbackslash titoloatto\{testo\}}  {Titolo ufficiale}
%   \cmdrow{\textbackslash oggettoatto\{testo\}} {Oggetto sintetico o rubrica}
% \end{cmdtable}
%
% \subsection{Frontespizio}
%
% \DescribeMacro{\frontespizioatto}
% Il comando |\frontespizioatto| genera una pagina titolo (\texttt{titlepage})
% con i metadati impostati, centrata e priva di numero di pagina.
% Va inserito immediatamente dopo |\begin{document}|.
%
% \DescribeMacro{\maketitle}
% La classe definisce |\maketitle| come alias di |\frontespizioatto|
% per compatibilità con editor visivi, template engine e script Pandoc.
%
% \subsection{Struttura gerarchica}
%
% \DescribeMacro{\libro}
% \DescribeMacro{\titolo}
% \DescribeMacro{\capo}
% \DescribeMacro{\sezione}
% \DescribeMacro{\articolo}
% \DescribeMacro{\comma}
% La classe fornisce sei comandi strutturali, tutti con la stessa
% sintassi:
% \begin{verbatim}
%   \comando[numero-manuale]{testo del titolo}[label]
% \end{verbatim}
%
% \begin{cmdtable}
%   \cmdrow{\textbackslash libro[n]\{t\}[l]}
%         {Libro --- livello 1, \texttt{\textbackslash part}; numerazione romana}
%   \cmdrow{\textbackslash titolo[n]\{t\}[l]}
%         {Titolo --- livello 2, \texttt{\textbackslash chapter}; numerazione romana}
%   \cmdrow{\textbackslash capo[n]\{t\}[l]}
%         {Capo --- livello 3, \texttt{\textbackslash section}; numerazione romana}
%   \cmdrow{\textbackslash sezione[n]\{t\}[l]}
%         {Sezione --- livello 4, \texttt{\textbackslash subsection}; numerazione romana}
%   \cmdrow{\textbackslash articolo[n]\{t\}[l]}
%         {Articolo --- livello 5, \texttt{\textbackslash subsubsection}; numerazione araba}
%   \cmdrow{\textbackslash comma[n]\{testo\}[l]}
%         {Comma --- livello 6, \texttt{\textbackslash paragraph}; numerazione araba}
% \end{cmdtable}
%
% Il primo argomento opzionale \meta{n} forza un numero specifico
% \emph{senza} alterare il contatore interno: l'elemento successivo
% con numerazione automatica riprende dalla progressione corretta.
%
% \begin{warnbox}[Nota implementativa --- ripristino del contatore]
% I comandi strutturali con numero manuale isolano la modifica del contatore
% in un gruppo \TeX{} (\cs{begingroup}/\cs{endgroup}). Poiché i contatori
% \LaTeX{} sono globali, l'incremento automatico eseguito dal comando
% strutturale (\cs{part}, \cs{chapter} ecc.) avviene \emph{prima} del ripristino
% esplicito tramite \cs{setcounter}. Il valore salvato in \cs{AN@saved@counter}
% è il valore \emph{antecedente} all'incremento, cosicché il ripristino
% rimette il contatore allo stato precedente all'intera emissione,
% garantendo la corretta progressione automatica successiva.
% \end{warnbox}
%
% \subsection{Ambienti di corredo}
%
% \DescribeEnv{preambolo}
% \DescribeEnv{relazione}
% Gli ambienti \texttt{preambolo} e \texttt{relazione} generano
% capitoli non numerati con voce nell'indice generale.
%
% \subsection{Disposizioni finali tipizzate}
%
% \DescribeMacro{\entrataInVigore}
% \DescribeMacro{\abrogazioni}
% \DescribeMacro{\normatransitoria}
% I tre comandi generano automaticamente un articolo con titolo fisso
% e un comma con il testo fornito.
%
% \begin{cmdtable}
%   \cmdrow{\textbackslash entrataInVigore[n]\{t\}[l]}
%         {Articolo «Entrata in vigore»}
%   \cmdrow{\textbackslash abrogazioni[n]\{t\}[l]}
%         {Articolo «Abrogazioni»}
%   \cmdrow{\textbackslash normatransitoria[n]\{t\}[l]}
%         {Articolo «Norma transitoria»}
% \end{cmdtable}
%
% \subsection{Riferimenti incrociati}
%
% \DescribeMacro{\artref}
% \DescribeMacro{\articoloeref}
% \DescribeMacro{\commaref}
% \DescribeMacro{\artcomma}
% \DescribeMacro{\articolocomma}
% \DescribeMacro{\artcommaref}
%
% \begin{cmdtable}
%   \cmdrow{\textbackslash artref\{l\}}              {«art.~N»}
%   \cmdrow{\textbackslash articoloeref\{l\}}         {«articolo~N»}
%   \cmdrow{\textbackslash commaref\{l\}}             {«comma~N»}
%   \cmdrow{\textbackslash artcomma\{l1\}\{l2\}}      {«art.~N, comma~M»}
%   \cmdrow{\textbackslash articolocomma\{l1\}\{l2\}} {«articolo~N, comma~M»}
%   \cmdrow{\textbackslash artcommaref\{l\}}          {Riferimento combinato tramite label unica}
% \end{cmdtable}
%
% La classe supporta inoltre il pacchetto \pkg{cleveref} con nomi
% italiani per tutti i livelli strutturali. Se \pkg{cleveref} è stato
% caricato dall'utente prima di |\begin{document}|, le definizioni
% vengono attivate automaticamente in |\AtBeginDocument|.
%
% \subsection{Glossario delle definizioni}
%
% \DescribeEnv{definizioni}
% \DescribeMacro{\definizione}
% \DescribeMacro{\definizioneref}
% \DescribeMacro{\defref}
% \DescribeMacro{\indicedefinizioni}
%
% L'ambiente \texttt{definizioni} fornisce un elenco tipograficamente
% formattato di termini con la rispettiva definizione; le voci sono
% numerate con lettere minuscole a), b), c)\ldots{} e il termine viene
% composto in grassetto. Ciascuna voce viene indicizzata automaticamente.
%
% \begin{cmdtable}
%   \cmdrow{definizioni}                               {Ambiente elenco definizioni}
%   \cmdrow{\textbackslash definizione\{nome\}\{t\}[l]}{Voce con indicizzazione automatica}
%   \cmdrow{\textbackslash definizioneref\{l\}}        {Citazione del termine in corsivo}
%   \cmdrow{\textbackslash defref\{l\}}                {Alias di \texttt{\textbackslash definizioneref}}
%   \cmdrow{\textbackslash indicedefinizioni}           {Indice delle definizioni}
% \end{cmdtable}
%
% \subsection{Liste normative}
%
% \DescribeEnv{lettere}
% \DescribeEnv{numeri}
% Due ambienti di lista predefiniti adeguati alla struttura degli
% atti normativi:
%
% \begin{cmdtable}[Ambiente]
%   \cmdrow{lettere}{Lista alfabetica: a), b), c)\ldots}
%   \cmdrow{numeri} {Lista numerica: 1), 2), 3)\ldots}
% \end{cmdtable}
%
% \subsection{Allegati}
%
% \DescribeMacro{\allegato}
% \DescribeMacro{\allegatoref}
% \DescribeMacro{\indiceallegati}
%
% \begin{cmdtable}
%   \cmdrow{\textbackslash allegato[id]\{t\}[l]}
%         {Allegato con numerazione automatica (A, B\ldots) o manuale}
%   \cmdrow{\textbackslash allegatoref\{l\}}
%         {«Allegato X»}
%   \cmdrow{\textbackslash indiceallegati}
%         {Indice degli allegati}
% \end{cmdtable}
%
% \begin{notabox}[Nota --- larghezza della colonna numerica nell'indice degli allegati]
% La voce \cs{l@ANallegato} usa una larghezza fissa di \texttt{10.5em} per
% la colonna del numero. Titoli di allegato eccezionalmente lunghi possono
% sforare il margine destro. In tal caso è sufficiente ridefinire il comando
% nel preambolo del documento:
% \begin{verbatim}
%   \renewcommand*{\l@ANallegato}{\@dottedtocline{1}{0pt}{12em}}
% \end{verbatim}
% \end{notabox}
%
% \subsection{Indice degli articoli}
%
% \DescribeMacro{\indicearticoli}
% Il comando |\indicearticoli| genera un capitolo separato con l'elenco
% di tutti gli articoli e rimando alla pagina.
%
% \subsection{Modalità bozza}
%
% \DescribeMacro{\bozzainfo}
% \DescribeMacro{\notaredaz}
% \DescribeMacro{\notaredazinline}
%
% \begin{cmdtable}
%   \cmdrow{\textbackslash bozzainfo}
%         {Banner «VERSIONE DI BOZZA» con data di compilazione}
%   \cmdrow{\textbackslash notaredaz\{t\}}
%         {Nota a blocco con riquadro e numerazione progressiva}
%   \cmdrow{\textbackslash notaredazinline\{t\}}
%         {Nota breve in linea, evidenziata in rosso}
%   \cmdrow{\textbackslash ifANbozza}
%         {Booleano pubblico per codice condizionale}
% \end{cmdtable}
%
% \subsection{Nomi strutturali ridefinibili}
%
% \DescribeMacro{\ANLibroName}
% \DescribeMacro{\ANTitoloName}
% \DescribeMacro{\ANCapoName}
% \DescribeMacro{\ANSezioneName}
% \DescribeMacro{\ANArticoloName}
% \DescribeMacro{\ANCommaName}
% \DescribeMacro{\ANAllegatoName}
%
% I nomi stampati nei titoli e negli indici possono essere ridefiniti
% nel preambolo del documento, ad esempio per adattare la classe a
% ordinamenti diversi da quello italiano:
%
% \begin{verbatim}
%   \renewcommand*{\ANCapoName}{Sezione}
% \end{verbatim}
%
% \subsection{Diagnostica}
%
% \DescribeMacro{\ANclassversion}
% La macro |\ANclassversion| espone la stringa di versione della classe
% (ad es.\ \texttt{v1.2 (2026/05/25)}) per uso nei documenti o negli
% script di verifica.
%
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% \section{Esempio minimo}
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% L'esempio seguente illustra il flusso completo di un atto normativo
% minimo, comprensivo di indici, definizioni e allegato.
%
% \begin{verbatim}
% \documentclass[bozza, serif, simplex, 12pt]{attinormativi}
%
% \autoritaatto{Comune di Esempiopoli}
% \tipoatto{Regolamento}
% \numeroatto{3}
% \dataatto{17 maggio 2026}
% \titoloatto{Regolamento per la gestione degli spazi pubblici}
% \oggettoatto{Disciplina delle modalità di utilizzo e concessione
%              degli spazi pubblici comunali}
%
% \begin{document}
% \frontespizioatto
% \bozzainfo
% \tableofcontents
% \indicearticoli
%
% \titolo{Disposizioni generali}
%
% \articolo{Definizioni}[art:definizioni]
% \comma{Ai fini del presente regolamento si intende per:}
% \begin{definizioni}
%   \definizione{Spazio pubblico}{qualsiasi area di proprietà comunale
%     aperta al pubblico accesso}[def:spaziopubblico]
%   \definizione{Concessionario}{il soggetto titolare di concessione
%     rilasciata ai sensi del presente regolamento}[def:concessionario]
% \end{definizioni}
%
% \articolo{Finalità e ambito di applicazione}[art:finalita]
% \comma{Il presente regolamento disciplina le modalità di utilizzo
% e di concessione temporanea degli \defref{def:spaziopubblico}
% di proprietà del Comune di Esempiopoli.}[c:finalita:1]
% \comma{Le disposizioni del presente regolamento si applicano a
% tutti i soggetti, pubblici e privati, che intendano utilizzare
% gli spazi di cui al comma precedente.}
%
% \titolo{Procedimento concessorio}
%
% \articolo{Domanda di concessione}[art:domanda]
% \comma{La domanda di concessione è presentata al Comune mediante
% apposito modulo, allegando la documentazione indicata
% nell'\allegatoref{all:modello}.}
%
% \entrataInVigore{Il presente regolamento entra in vigore il giorno
% successivo alla sua pubblicazione all'albo pretorio online.}
%
% \indiceallegati
% \indicedefinizioni
%
% \allegato{Modello di domanda di concessione}[all:modello]
% Testo del modello allegato.
%
% \end{document}
% \end{verbatim}
%
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% \section{Flusso di compilazione}
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% Per ottenere tutti gli indici correttamente popolati sono necessarie
% almeno due passate del motore di composizione.
%
% \subsection*{Flusso standard (tutti i motori)}
%
% La classe è compilabile con pdf\LaTeX{}, \hologo{XeLaTeX} e
% \hologo{LuaLaTeX}. In tutti e tre i casi il flusso raccomandato è:
%
% \begin{verbatim}
%   pdflatex documento.tex   % oppure: xelatex  documento.tex
%   makeindex -s gind.ist documento.idx
%   makeindex -s gglo.ist -o documento.gls documento.glo
%   pdflatex documento.tex   %          xelatex  documento.tex
%   pdflatex documento.tex   %          xelatex  documento.tex
% \end{verbatim}
%
% Con \hologo{LuaLaTeX}:
%
% \begin{verbatim}
%   lualatex documento.tex
%   makeindex -s gind.ist documento.idx
%   makeindex -s gglo.ist -o documento.gls documento.glo
%   lualatex documento.tex
%   lualatex documento.tex
% \end{verbatim}
%
% Con \texttt{latexmk} è sufficiente aggiungere nella directory di lavoro
% un file \texttt{latexmkrc}. Esempio per \hologo{LuaLaTeX}:
%
% \begin{verbatim}
%   @default_files = ('documento.tex');
%   $pdf_mode = 4;   # LuaLaTeX  (usare 1 per pdfLaTeX, 5 per XeLaTeX)
%   add_cus_dep('glo','gls',0,'run_makeglossaries');
%   add_cus_dep('idx','ind',0,'run_makeindex');
%   sub run_makeglossaries {
%       system("makeindex -s gglo.ist -o '$_[0].gls' '$_[0].glo'");
%   }
%   sub run_makeindex {
%       system("makeindex -s gind.ist '$_[0].idx'");
%   }
% \end{verbatim}
%
% \subsection*{Flusso con opzione \opt{accessible} (solo \hologo{LuaLaTeX})}
%
% L'opzione \opt{accessible} richiede \textbf{esclusivamente
% \hologo{LuaLaTeX}} (pdf\LaTeX{} e \hologo{XeLaTeX} non sono
% supportati per questa funzionalità; vedere §~\ref{subsec:accessible}).
%
% Il file \texttt{.tex} deve iniziare con la dichiarazione
% |\DocumentMetadata| \emph{prima} di |\documentclass|:
%
% \begin{verbatim}
%   \DocumentMetadata{
%     pdfversion  = 1.7,
%     pdfstandard = UA-1,
%     lang        = it-IT,
%   }
%   \documentclass[accessible]{attinormativi}
% \end{verbatim}
%
% Il flusso di compilazione diventa:
%
% \begin{verbatim}
%   lualatex documento.tex
%   lualatex documento.tex
%   lualatex documento.tex
% \end{verbatim}
%
% Tre passate sono necessarie affinché \pkg{tagpdf} completi la
% struttura dell'albero dei tag e \pkg{hyperref} scriva correttamente
% i metadati PDF/UA nel dizionario del documento. Non occorre eseguire
% \texttt{makeindex} per gli indici \texttt{.art}, \texttt{.alg},
% \texttt{.dfn}: sono gestiti da |\@starttoc| e si aggiornano
% automaticamente ad ogni passata.
%
% La conformità PDF/UA-1 del documento prodotto può essere verificata con:
% \begin{itemize}
%   \item \textbf{PAC~2024} (PDF Accessibility Checker, gratuito, Windows);
%   \item \textbf{Adobe Acrobat Pro}: Strumenti $\to$ Accessibilità $\to$
%         Verifica completa;
%   \item \textbf{axessPDF} o \textbf{CommonLook} per verifiche più granulari.
% \end{itemize}
%
% \begin{warnbox}[File ausiliari corrotti]
% Se la compilazione si interrompe in modo anomalo, il file \texttt{.aux}
% può risultare troncato. La compilazione successiva produce l'errore
% \texttt{File ended while scanning use of \textbackslash @writefile}.
% La soluzione è eliminare tutti i file ausiliari
% (\texttt{.aux}, \texttt{.toc}, \texttt{.idx}, \texttt{.glo},
% \texttt{.art}, \texttt{.alg}, \texttt{.dfn}, \texttt{.out})
% e ripartire da capo.
% \end{warnbox}
%
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% \section{Cronologia delle versioni}
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% \begin{description}[leftmargin=5em, labelwidth=4.5em]
%
%   \item[v1.0] \textit{Prima versione stabile (2026/05/08).}
%
%   \item[v1.1] \textit{Versione stabile (2026/05/17).}
%     Correzione del refuso nella tabella delle note redazionali
%     (\cs{notaredazinline} era descritto erroneamente come \cs{notaredaz}).
%     Aggiunta di \cs{markboth} negli indici secondari per la corretta
%     generazione delle intestazioni. Sostituzione di \cs{clearpage} con
%     \cs{newpage} in \cs{bozzainfo}. Soppressione dello spazio spurio
%     generato da \cs{paragraph\{\}} nel comando \cs{comma}.
%     Condizionamento del caricamento di \pkg{xparse} al kernel \LaTeX{}
%     (superfluo da 2020-10-01). Nota documentativa sul meccanismo di
%     ripristino del contatore in \cs{AN@emit}. Nota sulla larghezza
%     variabile di \cs{l@ANallegato}. Esempio minimo esteso con definizioni
%     e allegato. Sezione dedicata al flusso di compilazione.
%
%   \item[v1.2] \textit{Migrazione font a TeX Gyre; supporto accessibilità
%     PDF/UA-1 (2026/05/25).}
%     Sostituzione della famiglia \emph{Latin Modern} con \emph{TeX Gyre
%     Termes} (serif), \emph{TeX Gyre Heros} (sansserif) e \emph{TeX Gyre
%     Cursor} (monospaced). Con pdf\LaTeX{} vengono caricati i pacchetti
%     \pkg{tgtermes}, \pkg{tgheros} e \pkg{tgcursor}; con
%     \hologo{XeLaTeX} e \hologo{LuaLaTeX} i corrispondenti font OpenType
%     tramite \pkg{fontspec}.
%     Aggiunta opzione \opt{accessible}: attiva il caricamento
%     condizionato di \pkg{tagpdf} (sezione~1a-bis), il controllo del
%     motore di composizione con avvertimento se non si usa
%     \hologo{LuaLaTeX} (sezione~2), e il controllo della presenza di
%     |\DocumentMetadata| con avvertimento se assente (sezione~2).
%     Tagging strutturato del frontespizio (\cs{frontespizioatto},
%     sezione~9): ciascun campo metadato è racchiuso in una struttura
%     \pkg{tagpdf} con ruolo semantico appropriato (\texttt{Title},
%     \texttt{P}). Tagging del comma (sezione~14): il contenuto testuale
%     è emesso in una struttura \texttt{P} esplicita quando l'opzione è
%     attiva. Tagging dell'ambiente \texttt{definizioni} (sezione~16):
%     sostituzione del \texttt{list} grezzo con strutture
%     \texttt{DL}/\texttt{DT}/\texttt{DD} di \pkg{tagpdf}. Tagging delle
%     note redazionali come \texttt{Artifact} (sezione~6).
%     Mappatura ruoli \texttt{H1}--\texttt{H5} per la gerarchia
%     strutturale \cs{libro}--\cs{articolo} tramite |\tagpdfsetup|
%     in |\AtBeginDocument| (sezione~11); il livello |\paragraph| non
%     riceve \texttt{H6} perché il comma è taggato come \texttt{P}.
%     Registrazione delle liste \texttt{lettere} e \texttt{numeri}
%     come \texttt{OL} in \pkg{tagpdf} tramite |\SetEnumitemValue|
%     (sezione~15). Tagging \texttt{Sect} per gli ambienti
%     \texttt{preambolo} e \texttt{relazione} (sezione~17); sezione~18
%     non richiede modifiche (delega a \cs{articolo}/\cs{comma} già
%     taggati). Tagging \texttt{Sect}/\texttt{Caption} per
%     |\ANallegatoheading| e |\allegato| (sezione~19). Tagging
%     \texttt{TOC} per |\indiceallegati|, |\indicedefinizioni| e
%     |\indicearticoli| (sezioni~16, 19, 20).
%     Aggiornamento del flusso di compilazione raccomandato.
%
% \end{description}
%
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% \StopEventually{\PrintChanges\PrintIndex}
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% \section{Implementazione}
%
% Il codice che segue è estratto direttamente da \texttt{attinormativi.cls}
% e annotato con commenti che spiegano le scelte implementative.
%
%    \begin{macrocode}
%<*class>
% attinormativi.cls
%
% LaTeX class for Italian normative acts.
% Classe LaTeX per atti normativi italiani.
%
% Version: 1.2  --  2026/05/25
%
% Modifiche rispetto a v1.1:
%   [font]        Migrazione da Latin Modern a TeX Gyre:
%                 - serif:      TeX Gyre Termes (tgtermes / fontspec)
%                 - sansserif:  TeX Gyre Heros  (tgheros  / fontspec)
%                 - monospaced: TeX Gyre Cursor  (tgcursor / fontspec)
%   [accessible]  Nuova opzione: attiva il tagging PDF/UA-1 tramite
%                 tagpdf e il framework di tagging del kernel LaTeX.
%                 Richiede LuaLaTeX e TeX Live 2023+.
%                 Controllo del motore e di \DocumentMetadata con
%                 ClassWarning in caso di violazione.
%   [sez.6]       Note redazionali marcate come Artifact in modalita'
%                 accessible (bozzainfo, notaredaz, notaredazinline).
%   [sez.9]       Frontespizio con strutture tagpdf per ciascun campo:
%                 Title per il titolo ufficiale, P per gli altri campi.
%   [sez.11]      AtBeginDocument: mappatura H1-H5 per la gerarchia
%                 strutturale tramite \tagpdfsetup{add-new-tag=...}.
%                 Il livello paragraph non riceve H6 (il comma e' P).
%   [sez.14]      Comma: testo racchiuso in struttura P (paragrafo)
%                 anziché lasciato come heading H6 implicito.
%   [sez.15]      Liste lettere/numeri registrate come OL in tagpdf
%                 tramite \SetEnumitemValue in AtBeginDocument.
%   [sez.16]      Ambiente definizioni: strutture DL/DT/DD in modalita'
%                 accessible. Indice definizioni: struttura TOC.
%   [sez.17]      Ambienti preambolo/relazione racchiusi in Sect.
%   [sez.18]      Nessuna modifica: delega ad articolo/comma gia' taggati.
%   [sez.19]      ANallegatoheading: Sect+Caption. allegato: chiusura
%                 Sect. indiceallegati: struttura TOC.
%   [sez.20]      indicearticoli: struttura TOC.

\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{attinormativi}[2026/05/25 v1.2 Classe per atti normativi italiani]

% Macro di versione accessibile ai documenti per diagnostica
\def\ANclassversion{v1.2 (2026/05/25)}
%    \end{macrocode}
%
% \subsection{Sezione 1 --- Dichiarazione delle opzioni}
%
% \subsubsection{1a. Modalità bozza}
%
% Il booleano interno |\ifAN@bozza| è usato dalla classe.
% Il booleano pubblico |\ifANbozza| è accessibile ai documenti utente
% senza richiedere |\makeatletter|/|\makeatother|.
%
%    \begin{macrocode}
% ==========================================================================
% SEZIONE 1 — Dichiarazione delle opzioni
% ==========================================================================

% ── 1a. Bozza ──────────────────────────────────────────────────────────────

\newif\ifAN@bozza
\AN@bozzafalse
\newif\ifANbozza
\ANbozzafalse
\DeclareOption{bozza}{\AN@bozzatrue\ANbozzatrue}
%    \end{macrocode}
%
% \subsubsection{1a-bis. Accessibilità PDF/UA}
%
% Il booleano interno |\ifAN@accessible| governa il caricamento di
% \pkg{tagpdf} e l'attivazione di tutte le strutture di tagging della
% classe. Il booleano pubblico |\ifANaccessible| è esposto ai documenti
% utente per eventuale codice condizionale.
%
%    \begin{macrocode}
% ── 1a-bis. Accessibilità PDF/UA ───────────────────────────────────────────

\newif\ifAN@accessible
\AN@accessiblefalse
\newif\ifANaccessible
\ANaccessiblefalse
\DeclareOption{accessible}{\AN@accessibletrue\ANaccessibletrue}
%    \end{macrocode}
%
% \subsubsection{1b. Famiglia tipografica}
%
% L'alias \opt{sanserif} (con un solo~\texttt{s}) è accettato per
% tolleranza tipografica.
%
%    \begin{macrocode}
% ── 1b. Famiglia tipografica ───────────────────────────────────────────────

\newif\ifAN@sansserif
\AN@sansseriffalse
\DeclareOption{sansserif}{\AN@sansseriftrue}
\DeclareOption{sanserif}{\AN@sansseriftrue}  % alias tollerante (un solo 's')
\DeclareOption{serif}{}
%    \end{macrocode}
%
% \subsubsection{1c. Fronte/retro vs solo fronte}
%
% Solo booleano: nessun |\PassOptionsToClass| qui.
% L'opzione concreta viene iniettata in |\LoadClass| (§~1e).
%
%    \begin{macrocode}
% ── 1c. Fronte/retro vs solo fronte ────────────────────────────────────────

\newif\ifAN@duplex
\AN@duplexfalse
\DeclareOption{duplex} {\AN@duplextrue}
\DeclareOption{simplex}{\AN@duplexfalse}
\DeclareOption{twoside}{\AN@duplextrue}
\DeclareOption{oneside}{\AN@duplexfalse}
%    \end{macrocode}
%
% \subsubsection{1d. Margini personalizzabili}
%
% Il parser |\AN@parseMarginOption| separa la chiave dal valore con
% il delimitatore \texttt{=}. Le opzioni non riconosciute vengono
% passate a \cls{book} tramite |\PassOptionsToClass|.
%
%    \begin{macrocode}
% ── 1d. Margini personalizzabili ───────────────────────────────────────────

\def\AN@margin@left  {35mm}
\def\AN@margin@right {30mm}
\def\AN@margin@top   {25mm}
\def\AN@margin@bottom{25mm}

\def\AN@str@left  {left}
\def\AN@str@right {right}
\def\AN@str@top   {top}
\def\AN@str@bottom{bottom}

\def\AN@parseMarginOption#1=#2\relax{%
  \def\AN@optkey{#1}%
  \def\AN@optval{#2}%
  \ifx\AN@optval\empty
    \PassOptionsToClass{\AN@currentopt}{book}%
  \else
    \ifx\AN@optkey\AN@str@left   \edef\AN@margin@left  {\AN@optval}\else
    \ifx\AN@optkey\AN@str@right  \edef\AN@margin@right {\AN@optval}\else
    \ifx\AN@optkey\AN@str@top    \edef\AN@margin@top   {\AN@optval}\else
    \ifx\AN@optkey\AN@str@bottom \edef\AN@margin@bottom{\AN@optval}\else
      \PassOptionsToClass{\AN@currentopt}{book}%
    \fi\fi\fi\fi
  \fi
}

\DeclareOption*{%
  \edef\AN@currentopt{\CurrentOption}%
  \expandafter\AN@parseMarginOption\AN@currentopt=\relax\relax
}
%    \end{macrocode}
%
% \subsubsection{1e. ProcessOptions e LoadClass}
%
% L'iniezione dell'opzione di layout nell'argomento esplicito di
% |\LoadClass| garantisce che le stringhe \texttt{twoside}/\texttt{oneside}
% arrivino esclusivamente a \cls{book} e non transitino per
% \pkg{keyval}/\pkg{geometry}.
%
%    \begin{macrocode}
% ── 1e. ProcessOptions e LoadClass ─────────────────────────────────────────

\ProcessOptions\relax

\ifAN@duplex
  \LoadClass[twoside,openright]{book}
\else
  \LoadClass[oneside,openany]{book}
\fi
%    \end{macrocode}
%
% \subsection{Sezione 2 --- Pacchetti richiesti}
%
% La classe utilizza la famiglia \emph{TeX Gyre} in tutte le modalità
% e su tutti i motori: \emph{TeX Gyre Termes} (serif), \emph{TeX Gyre
% Heros} (sansserif) e \emph{TeX Gyre Cursor} (monospaced). Con
% pdf\LaTeX{} vengono caricati i pacchetti \pkg{tgtermes},
% \pkg{tgheros} e \pkg{tgcursor}; con \hologo{XeLaTeX} e
% \hologo{LuaLaTeX} i corrispondenti font OpenType sono selezionati
% tramite \pkg{fontspec}. Tutti i pacchetti sono inclusi in ogni
% installazione standard di \TeX{} Live e MiK\TeX{} senza dipendenze
% aggiuntive.
%
% Il caricamento di \pkg{xparse} è condizionato alla versione del kernel:
% dalla release 2020-10-01 i comandi |\NewDocumentCommand| e affini
% sono nativi in \LaTeX{} e il pacchetto risulterebbe superfluo.
%
%    \begin{macrocode}
% ==========================================================================
% SEZIONE 2 — Pacchetti richiesti
% ==========================================================================

\RequirePackage{iftex}

% ── Font ───────────────────────────────────────────────────────────────────
%
% Serif:      TeX Gyre Termes (clone di Times New Roman)
% Sansserif:  TeX Gyre Heros  (clone di Helvetica); caricato in entrambe
%             le modalità come famiglia sans di corredo (scala 0.92).
% Monospaced: TeX Gyre Cursor (clone di Courier)

\ifPDFTeX
  \RequirePackage[utf8]{inputenc}
  \RequirePackage[T1]{fontenc}
  \ifAN@sansserif
    \RequirePackage{tgheros}
    \RequirePackage{tgcursor}
    \renewcommand{\familydefault}{\sfdefault}
  \else
    \RequirePackage{tgtermes}
    \RequirePackage[scale=0.92]{tgheros}
    \RequirePackage{tgcursor}
  \fi
\else
  \RequirePackage{fontspec}
  \ifAN@sansserif
    \setmainfont{TeX Gyre Heros}
    \setsansfont{TeX Gyre Heros}
    \setmonofont{TeX Gyre Cursor}
  \else
    \setmainfont{TeX Gyre Termes}
    \setsansfont[Scale=0.92]{TeX Gyre Heros}
    \setmonofont{TeX Gyre Cursor}
  \fi
\fi

% ── Geometry ───────────────────────────────────────────────────────────────

\RequirePackage{geometry}
\ifAN@duplex
  \geometry{
    a4paper,
    twoside,
    top    = \AN@margin@top,
    bottom = \AN@margin@bottom,
    inner  = \AN@margin@left,
    outer  = \AN@margin@right
  }
\else
  \geometry{
    a4paper,
    top    = \AN@margin@top,
    bottom = \AN@margin@bottom,
    left   = \AN@margin@left,
    right  = \AN@margin@right
  }
\fi

% ── Localizzazione e tipografia ────────────────────────────────────────────

\RequirePackage[italian]{babel}
\RequirePackage{microtype}

% ── Utility ────────────────────────────────────────────────────────────────

\RequirePackage{xcolor}

% xparse è nativo nel kernel LaTeX dalla release 2020-10-01.
% Lo carichiamo solo su installazioni più vecchie.
\@ifpackagelater{LaTeX}{2020/10/01}{}{%
  \RequirePackage{xparse}%
}

\RequirePackage{titlesec}
\RequirePackage{chngcntr}
\RequirePackage{enumitem}
\RequirePackage{hyperref}
%    \end{macrocode}
%
% \subsubsection{Caricamento condizionato di \pkg{tagpdf}}
%
% Quando l'opzione \opt{accessible} è attiva, la classe verifica che:
% \begin{enumerate}
%   \item il motore sia \hologo{LuaLaTeX} (unico motore che supporta il
%         tagging PDF/UA completo con il kernel attuale);
%   \item |\DocumentMetadata| sia stato dichiarato prima di |\documentclass|
%         (condizione necessaria per l'inizializzazione del framework di
%         tagging del kernel).
% \end{enumerate}
% In entrambi i casi di violazione viene emesso un |\ClassWarning|
% (non un errore fatale) per non interrompere la compilazione.
% Il tagging viene attivato solo se entrambe le condizioni sono soddisfatte.
%
%    \begin{macrocode}
% ── tagpdf (solo opzione accessible) ──────────────────────────────────────

\ifAN@accessible
  % Controllo 1: motore LuaLaTeX
  \ifLuaTeX\else
    \ClassWarning{attinormativi}{%
      L'opzione `accessible' richiede LuaLaTeX.\MessageBreak
      Con il motore corrente il tagging PDF/UA non verra' attivato.%
    }%
    \AN@accessiblefalse
    \ANaccessiblefalse
  \fi
\fi

\ifAN@accessible
  % Controllo 2: DocumentMetadata dichiarato
  \@ifundefined{document@metadata}{%
    \ClassWarning{attinormativi}{%
      L'opzione `accessible' richiede \string\DocumentMetadata\space
      prima di \string\documentclass.\MessageBreak
      Aggiungere nel file .tex, prima di \string\documentclass:\MessageBreak
      \space\space\string\DocumentMetadata\string{pdfstandard=UA-1,
      lang=it-IT\string}\MessageBreak
      Il tagging PDF/UA non verra' attivato.%
    }%
    \AN@accessiblefalse
    \ANaccessiblefalse
  }{}%
\fi

\ifAN@accessible
  \RequirePackage{tagpdf}%
\fi
%    \end{macrocode}
%
% \subsection{Sezione 3 --- Giustificazione di emergenza}
%
%    \begin{macrocode}
% ==========================================================================
% SEZIONE 3 — Giustificazione di emergenza
% ==========================================================================

\AtBeginDocument{\emergencystretch=2em}
%    \end{macrocode}
%
% \subsection{Sezione 4 --- Profondità di numerazione}
%
%    \begin{macrocode}
% ==========================================================================
% SEZIONE 4 — Profondità di numerazione
% ==========================================================================

\setcounter{secnumdepth}{6}
\setcounter{tocdepth}{3}
%    \end{macrocode}
%
% \subsection{Sezione 5 --- Hyperlink}
%
%    \begin{macrocode}
% ==========================================================================
% SEZIONE 5 — Hyperlink
% ==========================================================================

\hypersetup{
  colorlinks = true,
  linkcolor  = black,
  citecolor  = black,
  urlcolor   = black,
  pdfborder  = {0 0 0}
}
%    \end{macrocode}
%
% \subsection{Sezione 6 --- Modalità bozza e note redazionali}
%
% \begin{macro}{\notaredaz}
% Nota a blocco con riquadro, visibile solo in modalità bozza.
% Il contatore |\ANnotaredaz| fornisce la numerazione progressiva.
% Quando l'opzione \opt{accessible} è attiva, il blocco è racchiuso
% in una struttura \pkg{tagpdf} con ruolo \texttt{Artifact}, in modo
% che i lettori di schermo non lo trattino come contenuto normativo.
% \end{macro}
%
% \begin{macro}{\notaredazinline}
% Nota breve in linea, evidenziata in rosso, visibile solo in bozza.
% In modalità \opt{accessible} è anch'essa marcata come \texttt{Artifact}.
% \end{macro}
%
% \begin{macro}{\bozzainfo}
% Banner «VERSIONE DI BOZZA» inserito all'inizio del documento.
% Usa |\newpage| anziché |\clearpage| per evitare l'emissione di
% una pagina bianca vuota prima del banner stesso.
% In modalità \opt{accessible} il banner è marcato come \texttt{Artifact}.
% \end{macro}
%
%    \begin{macrocode}
% ==========================================================================
% SEZIONE 6 — Modalità bozza e note redazionali
% ==========================================================================

\newcounter{ANnotaredaz}

\NewDocumentCommand{\notaredaz}{+m}{%
  \ifAN@bozza
    \refstepcounter{ANnotaredaz}%
    \par\smallskip
    \noindent
    \ifAN@accessible
      \tagmcbegin{tag=Artifact}%
    \fi
    \fbox{%
      \begin{minipage}{0.96\linewidth}
        \small
        \textbf{Nota redazionale \theANnotaredaz.} #1
      \end{minipage}%
    }%
    \ifAN@accessible
      \tagmcend
    \fi
    \par\smallskip
  \fi
}

\NewDocumentCommand{\notaredazinline}{+m}{%
  \ifAN@bozza
    \ifAN@accessible
      \tagmcbegin{tag=Artifact}%
    \fi
    \textcolor{red}{[\textbf{Nota redazionale:} #1]}%
    \ifAN@accessible
      \tagmcend
    \fi
  \fi
}

\NewDocumentCommand{\bozzainfo}{}{%
  \ifAN@bozza
    \ifAN@accessible
      \tagmcbegin{tag=Artifact}%
    \fi
    \begin{center}
      \fbox{%
        \begin{minipage}{0.85\linewidth}
          \centering
          \textbf{VERSIONE DI BOZZA}\\
          Documento compilato il \today.\\
          Le note redazionali sono visibili solo in modalit\`a bozza.
        \end{minipage}%
      }
    \end{center}
    \ifAN@accessible
      \tagmcend
    \fi
    \newpage
  \fi
}
%    \end{macrocode}
%
% \subsection{Sezione 7 --- Nomi strutturali}
%
% I nomi dei livelli strutturali sono ridefinibili nel preambolo del
% documento. Il comando |\addto\captionsitalian| integra le ridefinizioni
% con il meccanismo di \pkg{babel}.
%
%    \begin{macrocode}
% ==========================================================================
% SEZIONE 7 — Nomi strutturali
% ==========================================================================

\newcommand*{\ANLibroName}{Libro}
\newcommand*{\ANTitoloName}{Titolo}
\newcommand*{\ANCapoName}{Capo}
\newcommand*{\ANSezioneName}{Sezione}
\newcommand*{\ANArticoloName}{Articolo}
\newcommand*{\ANCommaName}{Comma}

\addto\captionsitalian{%
  \renewcommand*{\partname}{\ANLibroName}%
  \renewcommand*{\chaptername}{\ANTitoloName}%
}
%    \end{macrocode}
%
% \subsection{Sezione 8 --- Metadati dell'atto}
%
% \begin{macro}{\tipoatto}
% \begin{macro}{\numeroatto}
% \begin{macro}{\dataatto}
% \begin{macro}{\autoritaatto}
% \begin{macro}{\titoloatto}
% \begin{macro}{\oggettoatto}
% I sei comandi di metadato memorizzano il valore in una macro interna
% tramite |\renewcommand|. Le macro interne sono inizializzate vuote
% in modo che il frontespizio possa testarne la presenza con |\ifx...\empty|.
% \end{macro}\end{macro}\end{macro}\end{macro}\end{macro}\end{macro}
%
%    \begin{macrocode}
% ==========================================================================
% SEZIONE 8 — Metadati dell'atto
% ==========================================================================

\newcommand*{\ANtipoatto}{}
\newcommand*{\ANnumeroatto}{}
\newcommand*{\ANdataatto}{}
\newcommand*{\ANautoritaatto}{}
\newcommand*{\ANtitoloatto}{}
\newcommand*{\ANoggettoatto}{}

\NewDocumentCommand{\tipoatto}    {m}{\renewcommand*{\ANtipoatto}{#1}}
\NewDocumentCommand{\numeroatto}  {m}{\renewcommand*{\ANnumeroatto}{#1}}
\NewDocumentCommand{\dataatto}    {m}{\renewcommand*{\ANdataatto}{#1}}
\NewDocumentCommand{\autoritaatto}{m}{\renewcommand*{\ANautoritaatto}{#1}}
\NewDocumentCommand{\titoloatto}  {m}{\renewcommand*{\ANtitoloatto}{#1}}
\NewDocumentCommand{\oggettoatto} {m}{\renewcommand*{\ANoggettoatto}{#1}}
%    \end{macrocode}
%
% \subsection{Sezione 9 --- Frontespizio e alias \texttt{\textbackslash maketitle}}
%
% \begin{macro}{\frontespizioatto}
% Il frontespizio condiziona la stampa di ciascun campo al test
% |\ifx...\empty|, così gli utenti che non impostano tutti i metadati
% ottengono un frontespizio coerente senza voci vuote.
%
% Quando l'opzione \opt{accessible} è attiva, ciascun campo è racchiuso
% in una struttura \pkg{tagpdf}. Il titolo dell'atto riceve il ruolo
% semantico \texttt{Title}; tutti gli altri campi ricevono il ruolo
% \texttt{P} (paragrafo). Questa struttura consente ai lettori di schermo
% di identificare correttamente il titolo del documento e di distinguerlo
% dagli altri metadati.
% \end{macro}
%
%    \begin{macrocode}
% ==========================================================================
% SEZIONE 9 — Frontespizio e alias \maketitle
% ==========================================================================

\NewDocumentCommand{\frontespizioatto}{}{%
  \begin{titlepage}
  \centering
  \vspace*{2cm}
  \ifx\ANautoritaatto\empty\else
    \ifAN@accessible
      \tagstructbegin{tag=P}%
      {\Large \ANautoritaatto\par}%
      \tagstructend
    \else
      {\Large \ANautoritaatto\par}%
    \fi
    \vspace{2cm}%
  \fi
  \ifx\ANtipoatto\empty\else
    \ifAN@accessible
      \tagstructbegin{tag=P}%
      {\huge\bfseries \ANtipoatto\par}%
      \tagstructend
    \else
      {\huge\bfseries \ANtipoatto\par}%
    \fi
    \vspace{0.5cm}%
  \fi
  \ifx\ANnumeroatto\empty\else
    \ifAN@accessible
      \tagstructbegin{tag=P}%
      {\Large n.~\ANnumeroatto\par}%
      \tagstructend
    \else
      {\Large n.~\ANnumeroatto\par}%
    \fi
    \vspace{0.5cm}%
  \fi
  \ifx\ANdataatto\empty\else
    \ifAN@accessible
      \tagstructbegin{tag=P}%
      {\large \ANdataatto\par}%
      \tagstructend
    \else
      {\large \ANdataatto\par}%
    \fi
    \vspace{2cm}%
  \fi
  \ifx\ANtitoloatto\empty\else
    \ifAN@accessible
      % Il titolo ufficiale dell'atto riceve ruolo Title in PDF/UA
      \tagstructbegin{tag=Title}%
      {\LARGE\bfseries \ANtitoloatto\par}%
      \tagstructend
    \else
      {\LARGE\bfseries \ANtitoloatto\par}%
    \fi
    \vspace{1.5cm}%
  \fi
  \ifx\ANoggettoatto\empty\else
    \begin{minipage}{0.82\textwidth}
      \centering
      \ifAN@accessible
        \tagstructbegin{tag=P}%
        {\large \ANoggettoatto}%
        \tagstructend
      \else
        {\large \ANoggettoatto}%
      \fi
    \end{minipage}%
  \fi
  \vfill
  \end{titlepage}
}

\let\maketitle\frontespizioatto
%    \end{macrocode}
%
% \subsection{Sezione 10 --- Contatori}
%
% Il contatore degli articoli (|\subsubsection|) è reso globale
% tramite |\counterwithout|: la progressione è unica per l'intero
% documento, indipendente dalla struttura dei capitoli e titoli.
%
% Il contatore |\articoloecomma| fornisce etichette combinate
% per i riferimenti articolo+comma tramite |\artcommaref|.
%
%    \begin{macrocode}
% ==========================================================================
% SEZIONE 10 — Contatori
% ==========================================================================

\renewcommand*{\thepart}{\Roman{part}}
\renewcommand*{\thechapter}{\Roman{chapter}}
\renewcommand*{\thesection}{\Roman{section}}
\renewcommand*{\thesubsection}{\Roman{subsection}}

\counterwithout{subsubsection}{subsection}
\renewcommand*{\thesubsubsection}{\arabic{subsubsection}}

\counterwithin*{paragraph}{subsubsection}
\renewcommand*{\theparagraph}{\arabic{paragraph}}

\newcounter{articoloecomma}
\renewcommand*{\thearticoloecomma}{art.~\thesubsubsection, c.~\theparagraph}
%    \end{macrocode}
%
% \subsection{Sezione 11 --- Formati dei titoli}
%
% I titoli strutturali sono composti in stile centrato con il nome
% del livello e il numero su una riga e il testo del titolo sulla
% riga successiva (\texttt{display} shape di \pkg{titlesec}).
% Il livello articolo aggiunge il testo in corsivo.
%
% Il livello comma usa lo stile \texttt{runin} con titolo vuoto.
% Per evitare lo spazio spurio che |\paragraph{}| genera prima del
% numero, il formato è configurato in modo che il separatore
% dopo il titolo non produca spazio orizzontale quando il titolo
% è assente.
%
% \subsubsection{Mappatura ruoli strutturali per PDF/UA}
%
% Quando l'opzione \opt{accessible} è attiva, il blocco
% |\AtBeginDocument| registra in \pkg{tagpdf} la corrispondenza
% tra i comandi \LaTeX{} di sezionamento e i ruoli PDF/UA (heading
% levels \texttt{H1}--\texttt{H5}).
%
% La mappatura utilizza |\tagpdfsetup{add-new-tag=...}| (interfaccia
% stabile di \pkg{tagpdf} da TeX Live 2023):
%
% \begin{cmdtable}[Livello]
%   \cmdrow{\textbackslash libro    → \texttt{\textbackslash part}}
%         {Ruolo PDF/UA: \texttt{H1}}
%   \cmdrow{\textbackslash titolo   → \texttt{\textbackslash chapter}}
%         {Ruolo PDF/UA: \texttt{H2}}
%   \cmdrow{\textbackslash capo     → \texttt{\textbackslash section}}
%         {Ruolo PDF/UA: \texttt{H3}}
%   \cmdrow{\textbackslash sezione  → \texttt{\textbackslash subsection}}
%         {Ruolo PDF/UA: \texttt{H4}}
%   \cmdrow{\textbackslash articolo → \texttt{\textbackslash subsubsection}}
%         {Ruolo PDF/UA: \texttt{H5}}
% \end{cmdtable}
%
% Il livello |\paragraph| (comma) \emph{non} riceve il ruolo \texttt{H6}:
% come illustrato nella sezione~14, il testo del comma viene racchiuso
% esplicitamente in una struttura \texttt{P} (paragrafo). Il |\paragraph|
% emette soltanto il numero di comma, che risulta quindi come \texttt{Artifact}
% decorativo, non come elemento strutturale navigabile.
%
% La mappatura è inserita in |\AtBeginDocument| per garantire che
% \pkg{tagpdf} e \pkg{hyperref} siano già inizializzati al momento
% della registrazione.
%
%    \begin{macrocode}
% ==========================================================================
% SEZIONE 11 — Formati dei titoli
% ==========================================================================

\titleformat{\part}[display]
  {\normalfont\Huge\bfseries\centering}
  {\ANLibroName~\thepart}{1ex}{}

\titleformat{\chapter}[display]
  {\normalfont\huge\bfseries\centering}
  {\ANTitoloName~\thechapter}{1ex}{}

\titleformat{\section}[display]
  {\normalfont\Large\bfseries\centering}
  {\ANCapoName~\thesection}{1ex}{}

\titleformat{\subsection}[display]
  {\normalfont\large\bfseries\centering}
  {\ANSezioneName~\thesubsection}{1ex}{}

\titleformat{\subsubsection}[display]
  {\normalfont\normalsize\bfseries\centering}
  {\ANArticoloName~\thesubsubsection}{0.5ex}{\itshape}

% Il separatore è impostato a 0pt per sopprimere lo spazio spurio
% prima del numero del comma quando il titolo è vuoto.
\titleformat{\paragraph}[runin]
  {\normalfont\normalsize}
  {\theparagraph.}{0pt}{}

\titlespacing*{\part}         {0pt}{0pt}{4ex}
\titlespacing*{\chapter}      {0pt}{2ex plus 1ex minus .2ex}{3ex}
\titlespacing*{\section}      {0pt}{2.5ex plus 1ex minus .2ex}{1.5ex}
\titlespacing*{\subsection}   {0pt}{2ex plus 1ex minus .2ex}{1ex}
\titlespacing*{\subsubsection}{0pt}{2ex plus 1ex minus .2ex}{1ex}
\titlespacing*{\paragraph}    {0pt}{0.6ex plus .2ex minus .1ex}{0.75em}

% ── Mappatura ruoli PDF/UA (solo opzione accessible) ───────────────────────
%
% La registrazione in AtBeginDocument garantisce che tagpdf e hyperref
% siano già inizializzati. I ruoli H1-H5 corrispondono alla gerarchia
% normativa italiana (Libro → Titolo → Capo → Sezione → Articolo).
% Il livello paragraph (Comma) non riceve H6: il suo contenuto testuale
% è taggato come P in \comma (§ 14), rendendo superflua la mappatura.
\AtBeginDocument{%
  \ifAN@accessible
    \tagpdfsetup{%
      add-new-tag = {part/H1},%
      add-new-tag = {chapter/H2},%
      add-new-tag = {section/H3},%
      add-new-tag = {subsection/H4},%
      add-new-tag = {subsubsection/H5},%
    }%
  \fi
}
%    \end{macrocode}
%
% \subsection{Sezione 12 --- Riferimenti avanzati e supporto cleveref}
%
% I comandi di riferimento in italiano sono forniti senza richiedere
% l'installazione di pacchetti aggiuntivi.
%
% Il blocco |\AtBeginDocument| attiva le definizioni \pkg{cleveref}
% solo se il pacchetto è stato effettivamente caricato dall'utente,
% attraverso il test |\@ifpackageloaded|. Questo evita errori in
% documenti che non usano \pkg{cleveref}.
%
%    \begin{macrocode}
% ==========================================================================
% SEZIONE 12 — Riferimenti avanzati e supporto cleveref
% ==========================================================================

\newcommand*{\artref}[1]{art.~\ref{#1}}
\newcommand*{\commaref}[1]{comma~\ref{#1}}
\newcommand*{\artcommaref}[1]{\ref{a+c:#1}}
\newcommand*{\articoloeref}[1]{articolo~\ref{#1}}
\newcommand*{\commaeref}[1]{comma~\ref{#1}}
\newcommand*{\artcomma}[2]{art.~\ref{#1}, comma~\ref{#2}}
\newcommand*{\articolocomma}[2]{articolo~\ref{#1}, comma~\ref{#2}}

\AtBeginDocument{%
  \@ifpackageloaded{cleveref}{%
    \crefname  {part}          {libro}      {libri}
    \Crefname  {part}          {Libro}      {Libri}
    \crefname  {chapter}       {titolo}     {titoli}
    \Crefname  {chapter}       {Titolo}     {Titoli}
    \crefname  {section}       {capo}       {capi}
    \Crefname  {section}       {Capo}       {Capi}
    \crefname  {subsection}    {sezione}    {sezioni}
    \Crefname  {subsection}    {Sezione}    {Sezioni}
    \crefname  {subsubsection} {articolo}   {articoli}
    \Crefname  {subsubsection} {Articolo}   {Articoli}
    \crefname  {paragraph}     {comma}      {commi}
    \Crefname  {paragraph}     {Comma}      {Commi}
    \crefname  {articoloecomma}{comma}      {commi}
    \Crefname  {articoloecomma}{Comma}      {Commi}
    \crefname  {ANdefinizione} {definizione}{definizioni}
    \Crefname  {ANdefinizione} {Definizione}{Definizioni}
    \crefname  {ANallegato}    {allegato}   {allegati}
    \Crefname  {ANallegato}    {Allegato}   {Allegati}
  }{}%
}
%    \end{macrocode}
%
% \subsection{Sezione 13 --- Macro interna \texttt{\textbackslash AN@emit}}
%
% \begin{macro}{\AN@emit}
% La macro |\AN@emit| è il motore comune a tutti i comandi strutturali.
% Riceve cinque argomenti:
% \begin{enumerate}
%   \item il comando \LaTeX{} da invocare (|\part|, |\chapter|, ecc.);
%   \item il nome del contatore corrispondente;
%   \item il numero manuale (può essere |\NoValue|);
%   \item il testo del titolo;
%   \item l'etichetta (può essere |\NoValue|).
% \end{enumerate}
%
% Quando è presente un numero manuale, la modifica al contatore è
% isolata in un gruppo \TeX{}. Poiché i contatori \LaTeX{} sono globali,
% l'incremento automatico eseguito dal comando strutturale avviene prima
% del ripristino esplicito: il valore salvato in |\AN@saved@counter| è
% quello \emph{antecedente} all'incremento, così il ripristino finale
% riporta il contatore allo stato precedente all'intera emissione,
% garantendo la corretta progressione automatica successiva.
% \end{macro}
%
%    \begin{macrocode}
% ==========================================================================
% SEZIONE 13 — Macro interna \AN@emit
% ==========================================================================
\NewDocumentCommand{\AN@emit}{m m m m m}{%
  \IfNoValueTF{#3}
    {%
      #1{#4}%
      \IfNoValueF{#5}{\label{#5}}%
    }
    {%
      \begingroup
        % Salva il valore del contatore PRIMA dell'incremento automatico
        % che il comando strutturale eseguirà globalmente.
        % Il ripristino finale riporta il contatore a questo valore,
        % garantendo la corretta progressione automatica successiva.
        \edef\AN@saved@counter{\the\value{#2}}%
        \expandafter\renewcommand\csname the#2\endcsname{#3}%
        #1{#4}%
        \IfNoValueF{#5}{\label{#5}}%
        \setcounter{#2}{\AN@saved@counter}%
      \endgroup
    }%
}
%    \end{macrocode}
%
% \subsection{Sezione 14 --- Comandi strutturali pubblici}
%
% \begin{macro}{\libro}
% \begin{macro}{\titolo}
% \begin{macro}{\capo}
% \begin{macro}{\sezione}
% \begin{macro}{\articolo}
% Tutti i comandi strutturali delegano a |\AN@emit|.
% Il comando |\articolo| aggiunge anche la registrazione nell'indice
% degli articoli tramite |\ANaddarticleindex|.
% \end{macro}\end{macro}\end{macro}\end{macro}\end{macro}
%
% \begin{macro}{\comma}
% Il comma gestisce autonomamente la numerazione manuale per
% compatibilità con il contatore |\articoloecomma| (riferimento
% combinato articolo+comma) e la doppia etichetta associata.
% Il separatore del formato \texttt{runin} è impostato a \texttt{0pt}
% (§~11) per sopprimere lo spazio spurio prima del testo del comma
% quando il titolo è vuoto.
%
% Quando l'opzione \opt{accessible} è attiva, il testo del comma è
% racchiuso in una struttura \pkg{tagpdf} con ruolo \texttt{P}
% (paragrafo). Questo è necessario perché il kernel LaTeX taggerebbe
% il contenuto di un |\paragraph| come heading (\texttt{H6}), mentre
% il comma è semanticamente un paragrafo normativo privo di titolo.
% La struttura \texttt{P} è aperta dopo l'emissione del numero e
% chiusa al termine del testo con |\par|.
% \end{macro}
%
%    \begin{macrocode}
% ==========================================================================
% SEZIONE 14 — Comandi strutturali pubblici
% ==========================================================================

\NewDocumentCommand{\libro}  {o m o}{\AN@emit{\part}       {part}       {#1}{#2}{#3}}
\NewDocumentCommand{\titolo} {o m o}{\AN@emit{\chapter}    {chapter}    {#1}{#2}{#3}}
\NewDocumentCommand{\capo}   {o m o}{\AN@emit{\section}    {section}    {#1}{#2}{#3}}
\NewDocumentCommand{\sezione}{o m o}{\AN@emit{\subsection} {subsection} {#1}{#2}{#3}}

\NewDocumentCommand{\articolo}{o m o}{%
  \AN@emit{\subsubsection}{subsubsection}{#1}{#2}{#3}%
  \IfNoValueTF{#1}
    {\ANaddarticleindex{\thesubsubsection}{#2}}
    {\ANaddarticleindex{#1}{#2}}%
}

\NewDocumentCommand{\comma}{o +m o}{%
  \IfNoValueTF{#1}
    {%
      \ifAN@accessible
        \paragraph{}%
        \tagstructbegin{tag=P}%
        #2%
        \tagstructend
        \par
      \else
        \paragraph{}#2\par
      \fi
      \IfNoValueF{#3}{%
        \label{#3}%
        \refstepcounter{articoloecomma}%
        \label{a+c:#3}%
      }%
    }
    {%
      \begingroup
        \edef\AN@saved@para{\the\value{paragraph}}%
        \renewcommand*{\theparagraph}{#1}%
        \ifAN@accessible
          \paragraph{}%
          \tagstructbegin{tag=P}%
          #2%
          \tagstructend
          \par
        \else
          \paragraph{}#2\par
        \fi
        \IfNoValueF{#3}{%
          \label{#3}%
          \refstepcounter{articoloecomma}%
          \label{a+c:#3}%
        }%
        \setcounter{paragraph}{\AN@saved@para}%
      \endgroup
    }%
}
%    \end{macrocode}
%
% \subsection{Sezione 15 --- Liste}
%
% La classe definisce due ambienti di lista adeguati alla struttura
% degli atti normativi: \texttt{lettere} (enumerazione alfabetica
% a), b), c)\ldots) e \texttt{numeri} (enumerazione numerica
% 1), 2), 3)\ldots). Entrambi sono costruiti tramite |\newlist|
% di \pkg{enumitem}.
%
% \subsubsection{Compatibilità con il tagging automatico del kernel}
%
% Il kernel LaTeX (da 2023-06-01) tagger automaticamente le liste
% \pkg{enumitem} come strutture \texttt{L}/\texttt{LI}/\texttt{LBody}
% conformi a PDF/UA. Tuttavia, le liste create con |\newlist|
% (liste personalizzate non standard) \emph{non} sono registrate
% automaticamente nel framework di tagging: il kernel riconosce
% soltanto i tipi \texttt{itemize}, \texttt{enumerate} e
% \texttt{description}.
%
% Per garantire il tagging corretto, il blocco |\AtBeginDocument|
% (attivo solo con l'opzione \opt{accessible}) registra esplicitamente
% i tipi \texttt{lettere} e \texttt{numeri} come liste ordinate
% tramite |\SetEnumitemValue| di \pkg{tagpdf}, associando loro la
% struttura \texttt{OL} (ordered list) conforme a PDF/UA.
%
% Il tag \texttt{OL} è corretto per entrambe le liste in quanto
% le enumerazioni normative sono sempre ordinate (la lettera o il
% numero identifica univocamente la voce nel testo dell'atto).
%
%    \begin{macrocode}
% ==========================================================================
% SEZIONE 15 — Liste
% ==========================================================================

\newlist{lettere}{enumerate}{1}
\setlist[lettere]{
  label      = \alph*),
  ref        = \alph*),
  leftmargin = 2.5em,
  itemsep    = 0.2ex,
  topsep     = 0.5ex
}

\newlist{numeri}{enumerate}{1}
\setlist[numeri]{
  label      = \arabic*),
  ref        = \arabic*),
  leftmargin = 2.5em,
  itemsep    = 0.2ex,
  topsep     = 0.5ex
}

% ── Registrazione tagpdf per liste personalizzate (solo accessible) ────────
%
% Il kernel LaTeX tagger automaticamente itemize/enumerate/description,
% ma non le liste create con \newlist. La registrazione esplicita
% tramite \SetEnumitemValue associa le liste normative alla struttura
% OL (ordered list) di PDF/UA, garantendo il tagging corretto di
% ogni voce (LI/LBody) senza intervento manuale nell'ambiente.
\AtBeginDocument{%
  \ifAN@accessible
    \@ifpackageloaded{tagpdf}{%
      \SetEnumitemValue{list-type}{lettere}{OL}%
      \SetEnumitemValue{list-type}{numeri} {OL}%
    }{}%
  \fi
}
%    \end{macrocode}
%
% \subsection{Sezione 16 --- Definizioni}
%
% \begin{environment}{definizioni}
% L'ambiente \texttt{definizioni} usa un ambiente \texttt{list} con
% parametri personalizzati. Il contatore |\ANdefinizione| si azzera
% all'inizio di ogni ambiente.
%
% Quando l'opzione \opt{accessible} è attiva, l'ambiente emette una
% struttura \pkg{tagpdf} di tipo \texttt{DL} (definition list) attorno
% all'intera lista. Questa struttura ha un corrispondente diretto nella
% specifica PDF/UA e consente ai lettori di schermo di interpretare
% correttamente l'elenco come una lista di definizioni.
% \end{environment}
%
% \begin{macro}{\definizione}
% Ogni voce incrementa |\ANdefinizione|, compone il termine in grassetto
% e aggiunge la voce all'indice delle definizioni.
%
% Quando l'opzione \opt{accessible} è attiva, ciascuna voce emette:
% \begin{itemize}
%   \item una struttura \texttt{DT} (definition term) attorno al termine
%         in grassetto;
%   \item una struttura \texttt{DD} (definition description) attorno al
%         testo della definizione.
% \end{itemize}
% Questa distinzione permette ai lettori di schermo di annunciare
% separatamente il termine e la sua definizione.
% \end{macro}
%
%    \begin{macrocode}
% ==========================================================================
% SEZIONE 16 — Definizioni
% ==========================================================================

\newcounter{ANdefinizione}
\renewcommand*{\theANdefinizione}{\alph{ANdefinizione}}
\newcommand*{\ANDefinizioneName}{Definizione}

\NewDocumentCommand{\indicedefinizioni}{}{%
  \chapter*{Indice delle definizioni}%
  \markboth{Indice delle definizioni}{Indice delle definizioni}%
  \addcontentsline{toc}{chapter}{Indice delle definizioni}%
  \ifAN@accessible
    \tagstructbegin{tag=TOC}%
    \@starttoc{dfn}%
    \tagstructend
  \else
    \@starttoc{dfn}%
  \fi
}

\newcommand*{\l@ANdefinizione}{\@dottedtocline{1}{0pt}{0em}}
\newcommand*{\ANadddefinitionindex}[1]{\addcontentsline{dfn}{ANdefinizione}{#1}}

\NewDocumentEnvironment{definizioni}{}
  {%
    \ifAN@accessible
      \tagstructbegin{tag=DL}%
    \fi
    \begin{list}{}{%
      \setlength{\leftmargin}{2.5em}%
      \setlength{\labelwidth}{2em}%
      \setlength{\labelsep}{0.75em}%
      \setlength{\itemsep}{0.4ex}%
      \setlength{\topsep}{0.6ex}%
    }%
    \setcounter{ANdefinizione}{0}%
  }
  {%
    \end{list}%
    \ifAN@accessible
      \tagstructend
    \fi
  }

\NewDocumentCommand{\definizione}{m +m o}{%
  \refstepcounter{ANdefinizione}%
  \protected@edef\@currentlabelname{#1}%
  \ifAN@accessible
    \item[%
      \tagstructbegin{tag=DT}%
      \textbf{\theANdefinizione)}%
      \tagstructend
    ]%
    \tagstructbegin{tag=DD}%
    \textbf{#1}: #2%
    \tagstructend
  \else
    \item[\textbf{\theANdefinizione)}]\textbf{#1}: #2%
  \fi
  \ANadddefinitionindex{#1}%
  \IfNoValueF{#3}{\label{#3}}%
}

\newcommand*{\definizioneref}[1]{\emph{\nameref{#1}}}
\newcommand*{\defref}[1]{\definizioneref{#1}}
%    \end{macrocode}
%
% \subsection{Sezione 17 --- Ambienti di servizio}
%
% \begin{environment}{preambolo}
% Genera un capitolo non numerato con voce nell'indice generale.
% Il preambolo introduce le premesse giuridiche e fattuali dell'atto
% (le clausole \emph{visto}, \emph{considerato}, \emph{ritenuto}
% degli atti amministrativi).
% \end{environment}
%
% \begin{environment}{relazione}
% Genera un capitolo non numerato con voce nell'indice generale.
% La relazione illustrativa accompagna gli atti di maggior complessità.
% \end{environment}
%
% \subsubsection{Tagging PDF/UA}
%
% In modalità \opt{accessible}, i due ambienti racchiudono il proprio
% contenuto in una struttura \pkg{tagpdf} con ruolo \texttt{Sect}
% (sezione generica), che è il tag appropriato in PDF/UA per blocchi
% di contenuto che non appartengono alla gerarchia heading-level
% numerata ma costituiscono comunque unità logiche distinte del documento.
%
% Il tag \texttt{Sect} è scelto in preferenza a \texttt{NonStruct}
% perché il preambolo e la relazione hanno un titolo (il \texttt{\textbackslash chapter*})
% e un contenuto coeso, caratteristiche che definiscono una sezione
% in PDF/UA-1 (ISO~14289-1, §~7.1).
%
%    \begin{macrocode}
% ==========================================================================
% SEZIONE 17 — Ambienti di servizio
% ==========================================================================

\NewDocumentEnvironment{preambolo}{+b}
  {%
    \ifAN@accessible\tagstructbegin{tag=Sect}\fi
    \chapter*{Preambolo}%
    \addcontentsline{toc}{chapter}{Preambolo}%
    #1%
  }
  {\ifAN@accessible\tagstructend\fi}

\NewDocumentEnvironment{relazione}{+b}
  {%
    \ifAN@accessible\tagstructbegin{tag=Sect}\fi
    \chapter*{Relazione illustrativa}%
    \addcontentsline{toc}{chapter}{Relazione illustrativa}%
    #1%
  }
  {\ifAN@accessible\tagstructend\fi}
%    \end{macrocode}
%
% \subsection{Sezione 18 --- Disposizioni finali tipizzate}
%
% \begin{macro}{\AN@articoloFisso}
% La macro interna |\AN@articoloFisso| fattorizza la logica comune ai
% tre comandi tipizzati. Gestisce le quattro combinazioni possibili di
% presenza/assenza del numero manuale e dell'etichetta.
% \end{macro}
%
% \subsubsection{Tagging PDF/UA}
%
% I tre comandi |\entrataInVigore|, |\abrogazioni| e |\normatransitoria|
% delegano interamente a |\articolo| e |\comma|, che in modalità
% \opt{accessible} producono già strutture \texttt{H5} e \texttt{P}
% corrette (rispettivamente, dalla mappatura di §~11 e dal codice
% di §~14). Non è quindi necessario alcun intervento aggiuntivo
% in questa sezione.
%
%    \begin{macrocode}
% ==========================================================================
% SEZIONE 18 — Disposizioni finali tipizzate
% ==========================================================================

\NewDocumentCommand{\AN@articoloFisso}{m m +m m}{%
  \IfNoValueTF{#2}
    {%
      \IfNoValueTF{#4}{\articolo{#1}}{\articolo{#1}[#4]}%
    }
    {%
      \IfNoValueTF{#4}{\articolo[#2]{#1}}{\articolo[#2]{#1}[#4]}%
    }%
  \comma{#3}%
}

\NewDocumentCommand{\entrataInVigore} {o +m o}{\AN@articoloFisso{Entrata in vigore}{#1}{#2}{#3}}
\NewDocumentCommand{\abrogazioni}     {o +m o}{\AN@articoloFisso{Abrogazioni}{#1}{#2}{#3}}
\NewDocumentCommand{\normatransitoria}{o +m o}{\AN@articoloFisso{Norma transitoria}{#1}{#2}{#3}}
%    \end{macrocode}
%
% \subsection{Sezione 19 --- Allegati}
%
% \begin{macro}{\allegato}
% Il comando |\allegato| gestisce la numerazione automatica alfabetica
% (A, B, C\ldots) e quella manuale. La macro interna
% |\ANallegatoheading| genera il titolo del capitolo non numerato,
% aggiunge la voce all'indice generale e all'indice degli allegati.
% \end{macro}
%
% \subsubsection{Tagging PDF/UA}
%
% In modalità \opt{accessible}, |\ANallegatoheading| racchiude l'intero
% blocco dell'allegato in una struttura \texttt{Sect} (sezione generica),
% e il titolo dell'allegato viene emesso con una struttura \texttt{Caption}
% all'interno di essa. Questa struttura è conforme alla specifica
% PDF/UA-1: \texttt{Sect} per delimitare l'unità logica dell'allegato,
% \texttt{Caption} per il titolo che lo identifica.
%
% Il tag \texttt{Caption} è preferibile a \texttt{H2} o \texttt{H1}
% perché l'allegato non partecipa alla gerarchia heading dell'atto
% normativo (non è un Libro, Titolo o Capo): è un documento
% accessorio, la cui intestazione ha funzione descrittiva e non
% strutturale rispetto alla gerarchia normativa.
%
% I comandi |\indiceallegati|, |\indicedefinizioni| e |\indicearticoli|
% (sezione~20) producono capitoli non numerati di natura navigazionale.
% In modalità \opt{accessible}, il loro contenuto (l'elenco puntato
% generato da |\@starttoc|) è racchiuso in una struttura \texttt{TOC}
% (table of contents), il tag PDF/UA dedicato agli indici.
%
%    \begin{macrocode}
% ==========================================================================
% SEZIONE 19 — Allegati
% ==========================================================================

\newcounter{ANallegato}
\renewcommand*{\theANallegato}{\Alph{ANallegato}}
\newcommand*{\ANAllegatoName}{Allegato}
\newcommand*{\allegatoref}[1]{\ANAllegatoName~\ref{#1}}

\NewDocumentCommand{\indiceallegati}{}{%
  \chapter*{Indice degli allegati}%
  \markboth{Indice degli allegati}{Indice degli allegati}%
  \addcontentsline{toc}{chapter}{Indice degli allegati}%
  \ifAN@accessible
    \tagstructbegin{tag=TOC}%
    \@starttoc{alg}%
    \tagstructend
  \else
    \@starttoc{alg}%
  \fi
}

% La larghezza di 10.5em è adeguata per identificatori standard (Allegato A).
% Per titoli molto lunghi ridefinire nel preambolo:
%   \renewcommand*{\l@ANallegato}{\@dottedtocline{1}{0pt}{12em}}
\newcommand*{\l@ANallegato}{\@dottedtocline{1}{0pt}{10.5em}}

\newcommand*{\ANaddattachmentindex}[2]{%
  \addcontentsline{alg}{ANallegato}{\protect\numberline{\ANAllegatoName~#1}#2}%
}

\NewDocumentCommand{\ANallegatoheading}{m m o}{%
  \clearpage\phantomsection
  \ifAN@accessible
    \tagstructbegin{tag=Sect}%
    \tagstructbegin{tag=Caption}%
    \chapter*{\ANAllegatoName~#1\\[0.5ex]\large #2}%
    \tagstructend
  \else
    \chapter*{\ANAllegatoName~#1\\[0.5ex]\large #2}%
  \fi
  \markboth{\ANAllegatoName~#1}{#2}%
  \addcontentsline{toc}{chapter}{\ANAllegatoName~#1 -- #2}%
  \ANaddattachmentindex{#1}{#2}%
  \IfNoValueF{#3}{\label{#3}}%
  \vspace{1em}%
}

\NewDocumentCommand{\allegato}{o m o}{%
  \IfNoValueTF{#1}
    {%
      \refstepcounter{ANallegato}%
      \IfNoValueTF{#3}
        {\ANallegatoheading{\theANallegato}{#2}}
        {\ANallegatoheading{\theANallegato}{#2}[#3]}%
    }
    {%
      \begingroup
        \renewcommand*{\theANallegato}{#1}%
        \refstepcounter{ANallegato}%
        \IfNoValueTF{#3}
          {\ANallegatoheading{#1}{#2}}
          {\ANallegatoheading{#1}{#2}[#3]}%
      \endgroup
    }%
  \ifAN@accessible\tagstructend\fi
}
%    \end{macrocode}
%
% \subsection{Sezione 20 --- Indice degli articoli}
%
%    \begin{macrocode}
% ==========================================================================
% SEZIONE 20 — Indice degli articoli
% ==========================================================================

\NewDocumentCommand{\indicearticoli}{}{%
  \chapter*{Indice degli articoli}%
  \markboth{Indice degli articoli}{Indice degli articoli}%
  \addcontentsline{toc}{chapter}{Indice degli articoli}%
  \ifAN@accessible
    \tagstructbegin{tag=TOC}%
    \@starttoc{art}%
    \tagstructend
  \else
    \@starttoc{art}%
  \fi
}

\newcommand*{\l@ANarticolo}{\@dottedtocline{1}{0pt}{8.5em}}

\newcommand*{\ANaddarticleindex}[2]{%
  \addcontentsline{art}{ANarticolo}{\protect\numberline{\ANArticoloName~#1}#2}%
}

\endinput
%</class>
%    \end{macrocode}
%
% \Finale
\endinput
