::
Bellissima idea. In effetti da avvocato non ho mai pensato alla parte redazionale delle norme, che attiene alla sfera del legislatore, preoccupandomi solo della redazione degli atti. La questione mi ha incuriosito e ho provato a lavorarci, partendo dal codice iniziale postato qui.
L’ho commentato in inglese/italiano perchè, notoriamente, gli avocati non sono tra le categorie più “poliglotte” della nostra società 🙄
Le principali differenze rispetto alla versione iniziale sono queste:
– trasformazione del progetto da semplice documento di test a vera classe .cls, basata su book;
– separazione tra logica interna e interfaccia utente, così da poter richiamare la struttura normativa con comandi dedicati;
– introduzione di una gerarchia semantica completa:
\libro
\titolo
\capo
\sezione
\articolo
\comma
– gestione uniforme della numerazione automatica e manuale;
– centralizzazione dei nomi strutturali (“Libro”, “Titolo”, “Articolo”, ecc.) per facilitarne eventuali modifiche future;
– miglior controllo dei contatori e delle dipendenze tra livelli;
– separazione più pulita tra valore del contatore e rappresentazione tipografica;
– introduzione di comandi dedicati ai riferimenti incrociati (articolo, comma, articolo+comma);
– aggiunta di ambienti accessori come preambolo e relazione illustrativa;
– definizione di liste normative dedicate (lettere, numeri);
– organizzazione interna del codice in blocchi commentati per facilitarne la manutenzione.
Uno degli obiettivi che ho cercato di seguire è stato evitare duplicazioni di codice, così da mantenere la classe più compatta e facilmente estendibile.
Avrei pensato a diverse implementazioni che potrebbero essere inserite, tipiche della tecnica legislativa:
- gestione dei metadati dell’atto (tipo, titolo, numero, data, autorità emanante) con generazione automatica del frontespizio;
- disposizioni finali tipizzate, tramite comandi dedicati per entrata in vigore, abrogazioni e norme transitorie;
- sistema di riferimenti normativi più raffinato, con richiamo automatico di articoli e commi in forma abbreviata o estesa;
- miglioramento degli elenchi multilivello, per riprodurre più fedelmente la struttura normativa;
- articoli senza rubrica e commi non numerati, utili in particolari contesti redazionali;
- ambiente dedicato agli allegati, con numerazione autonoma e riferimenti interni;
- possibile indice separato dei soli articoli;
- modalità “bozza”, con note redazionali e strumenti utili in fase di drafting;
- modalità “testo coordinato”, per distinguere testo vigente, abrogato e novellato tramite output differenti.
Ecco il codice che finora funziona:
[code]% attinormativi.cls
%
% LaTeX class for Italian normative acts.
% Classe LaTeX per atti normativi italiani.
%
% Version: 0.2
\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{attinormativi}[2026/04/26 v0.2 Classe per atti normativi italiani]
% ————————————————————————–
% Class options / Opzioni della classe
% ————————————————————————–
% Forward unknown options to book.
% Inoltra le opzioni non riconosciute a book.
\DeclareOption*{\PassOptionsToClass{\CurrentOption}{book}}
\ProcessOptions\relax
\LoadClass{book}
% ————————————————————————–
% Required packages / Pacchetti richiesti
% ————————————————————————–
\RequirePackage[T1]{fontenc}
\RequirePackage[utf8]{inputenc}
\RequirePackage[italian]{babel}
\RequirePackage{microtype}
\RequirePackage{xparse}
\RequirePackage{titlesec}
\RequirePackage{chngcntr}
\RequirePackage{enumitem}
\RequirePackage{hyperref}
% ————————————————————————–
% Numbering depth / Profondità di numerazione
% ————————————————————————–
\setcounter{secnumdepth}{6}
\setcounter{tocdepth}{6}
% ————————————————————————–
% Hyperlinks / Collegamenti
% ————————————————————————–
% Keep links active but visually neutral.
% Mantiene i link attivi ma graficamente neutri.
\hypersetup{
colorlinks=true,
linkcolor=black,
citecolor=black,
urlcolor=black,
pdfborder={0 0 0}
}
% ————————————————————————–
% Structural names / Nomi strutturali
% ————————————————————————–
\newcommand*{\ANLibroName}{Libro}
\newcommand*{\ANTitoloName}{Titolo}
\newcommand*{\ANCapoName}{Capo}
\newcommand*{\ANSezioneName}{Sezione}
\newcommand*{\ANArticoloName}{Articolo}
\newcommand*{\ANCommaName}{Comma}
% Map book captions to normative terminology.
% Adatta le denominazioni di book alla terminologia normativa.
\addto\captionsitalian{%
\renewcommand*{\partname}{\ANLibroName}%
\renewcommand*{\chaptername}{\ANTitoloName}%
}
% ————————————————————————–
% Counters / Contatori
% ————————————————————————–
% Main structural levels use Roman numerals.
% I livelli strutturali principali usano numeri romani.
\renewcommand*{\thepart}{\Roman{part}}
\renewcommand*{\thechapter}{\Roman{chapter}}
\renewcommand*{\thesection}{\Roman{section}}
\renewcommand*{\thesubsection}{\Roman{subsection}}
% Articles are numbered independently from sections.
% Gli articoli sono numerati indipendentemente dalle sezioni.
\counterwithout{subsubsection}{subsection}
\renewcommand*{\thesubsubsection}{\arabic{subsubsection}}
% Paragraphs implement commi and reset at each article.
% I paragraph implementano i commi e si azzerano a ogni articolo.
\counterwithin*{paragraph}{subsubsection}
\renewcommand*{\theparagraph}{\arabic{paragraph}}
% Auxiliary counter for article+comma references.
% Contatore ausiliario per i riferimenti articolo+comma.
\newcounter{articoloecomma}
\renewcommand*{\thearticoloecomma}{art.~\thesubsubsection, c.~\theparagraph}
% ————————————————————————–
% Heading formats / 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}
\titleformat{\paragraph}[runin]
{\normalfont\normalsize}
{\theparagraph.}
{0.75em}
{}
% ————————————————————————–
% Heading spacing / Spaziature dei titoli
% ————————————————————————–
\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}
% ————————————————————————–
% Cross references / Riferimenti incrociati
% ————————————————————————–
\newcommand*{\artref}[1]{art.~\ref{#1}}
\newcommand*{\commaref}[1]{comma~\ref{#1}}
\newcommand*{\artcommaref}[1]{\ref{a+c:#1}}
% ————————————————————————–
% Internal helpers / Comandi interni
% ————————————————————————–
% Automatic sectioning dispatcher.
% Dispatcher per sezioni a numerazione automatica.
\NewDocumentCommand{\ANsectionauto}{m m o}{%
#1{#2}%
\IfNoValueF{#3}{\label{#3}}%
}
% Manual-number sectioning dispatcher.
% Dispatcher per sezioni a numerazione manuale.
\NewDocumentCommand{\ANsectionmanual}{m m m m o}{%
\begingroup
\expandafter\renewcommand\csname the#2\endcsname{#3}%
#1{#4}%
\IfNoValueF{#5}{\label{#5}}%
\endgroup
}
% ————————————————————————–
% Public structural commands / Comandi strutturali pubblici
% ————————————————————————–
\NewDocumentCommand{\libro}{o m o}{%
\IfNoValueTF{#1}
{\ANsectionauto{\part}{#2}[#3]}
{\ANsectionmanual{\part}{part}{#1}{#2}[#3]}%
}
\NewDocumentCommand{\titolo}{o m o}{%
\IfNoValueTF{#1}
{\ANsectionauto{\chapter}{#2}[#3]}
{\ANsectionmanual{\chapter}{chapter}{#1}{#2}[#3]}%
}
\NewDocumentCommand{\capo}{o m o}{%
\IfNoValueTF{#1}
{\ANsectionauto{\section}{#2}[#3]}
{\ANsectionmanual{\section}{section}{#1}{#2}[#3]}%
}
\NewDocumentCommand{\sezione}{o m o}{%
\IfNoValueTF{#1}
{\ANsectionauto{\subsection}{#2}[#3]}
{\ANsectionmanual{\subsection}{subsection}{#1}{#2}[#3]}%
}
\NewDocumentCommand{\articolo}{o m o}{%
\IfNoValueTF{#1}
{\ANsectionauto{\subsubsection}{#2}[#3]}
{\ANsectionmanual{\subsubsection}{subsubsection}{#1}{#2}[#3]}%
}
% ————————————————————————–
% Commi / Commi
% ————————————————————————–
% A comma is implemented as a run-in paragraph.
% Il comma è implementato come paragraph run-in.
\NewDocumentCommand{\comma}{o +m o}{%
\IfNoValueTF{#1}
{%
\paragraph{}#2\par
\IfNoValueF{#3}{%
\label{#3}%
\refstepcounter{articoloecomma}%
\label{a+c:#3}%
}%
}
{%
\begingroup
\renewcommand*{\theparagraph}{#1}%
\paragraph{}#2\par
\IfNoValueF{#3}{%
\label{#3}%
\refstepcounter{articoloecomma}%
\label{a+c:#3}%
}%
\endgroup
}%
}
% ————————————————————————–
% Lists / 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
}
% ————————————————————————–
% Support environments / Ambienti di servizio
% ————————————————————————–
\NewDocumentEnvironment{preambolo}{+b}
{\chapter*{Preambolo}\addcontentsline{toc}{chapter}{Preambolo}#1}
{}
\NewDocumentEnvironment{relazione}{+b}
{\chapter*{Relazione illustrativa}\addcontentsline{toc}{chapter}{Relazione illustrativa}#1}
{}
\endinput[/code]