LaTeX senza preamboli

Niente di pornografico, non è questo il luogo.

Come tutti sappiamo, LATEX è un linguaggio a marcatori per la preparazione di testi basato sul programma di composizione tipografica TEX.

Io trovo molto comodo il suo approccio WYSIWYM (What You See Is What You Mean, “ciò che vedi è ciò che intendi”) per pubblicazioni complesse e strutturate, e comodissimo il fatto che dalla compilazione di un unico documento .tex si possano ottenere prodotti dvi, ps, pdf, (x)html, docbook o persino odt, con piccoli accorgimenti nella composizione del preambolo.

Quello che trovo scomodo è invece la scrittura stessa del preambolo, che mi obbliga a ricordare una serie di comandi che non sono “What I Mean”. Per questo mi viene in aiuto LATEX stesso, perchè permette l’inclusione di file esterni nel file sorgente principale. Allora ho scritto una piccola libreria di comandi che permette di costruire di volta in volta il preambolo adatto al tipo di output che desidero.

La libreria (che ho chiamato preamble) è costituita da pochi file:

  • default.tex: un preambolo semplice, che definisce solo il tipo di documento, il titolo, l’autore e la data;
  • dvi.tex: permette la creazione di un dvi (e quindi un ps) con immagini; pensato per la compilazione mediante il comando:

    latex miodocumento.tex

  • pdf.tex: permette la creazione di un pdf ipertestuale; pensato per la compilazione mediante il comando:

    pdflatex miodocumento.tex

  • xml.tex: permette la creazione di documenti basati su xml, quali ad esempio:
    • html: htlatex miodocumento.tex
    • docbook: dblatex miodocumento.tex
    • odt: ooflatex miodocumento.tex

Il preambolo dei miei nuovi documenti diventerà semplicemente:

\input{preamble/pdf}
\makepreamble{article}{a4paper,12pt}{titolo}{autore}{oggi}
\setabstract{Una libreria per facilitare la scrittura del preambolo}
\setkeywords{LaTeX preambolo pdf html dvi odt}

La prima riga del preambolo imposta l’uso di ./preamble/pdf.tex.

Questo preambolo serve per produrre un pdf. Per cambiare il tipo di output, è sufficiente modificare la prima riga in
\input{preamble/dvi} oppure \input{preamble/xml}.

Il comando \makepreamble costruisce il preambolo per un articolo su foglio A4 con caratteri da 12 punti (i primi due parametri sono identici a quelli del comando \documentclass di LATEX), e imposta il titolo, l’autore e la data.

I comandi \setabstract e \setkeywords impostano rispettivamente le proprietà del pdf oggetto e parole chiave; anche se servono solo per il pdf, si possono lasciare nel sorgente senza danni perchè i file della libreria preamble rispettano tutti la stessa interfaccia, che definisce anche questi comandi.

Ecco come sono i sorgenti:

pdf.tex

\newcommand{\makepreamble}[5]{
 \RequirePackage{ifpdf}
 \ifpdf
   \documentclass[#2]{#1}
   \RequirePackage[hyperindex]{hyperref}
   \hypersetup{
     pdftitle={#3},
     pdfauthor={#4},
     pdfcreator={wordml2latex (Ruggero Dambra, http://www.mondorux.com)},
     colorlinks=true,
     linkcolor=red,
     anchorcolor=black,
     citecolor=green,
     filecolor=magenta,
     menucolor=black,
     urlcolor=blue,
     breaklinks=true,
     pdfstartview=FitH,
     pdfpagemode=UseOutlines
   }
   \usepackage[pdftex]{graphicx}
   \DeclareGraphicsExtensions{.pdf,.png,.jpg}
 \else
   \documentclass[#2]{#1}
   \usepackage{hyperref}
   \usepackage{graphicx}
   \DeclareGraphicsExtensions{.eps,.ps}
 \fi

 \usepackage[]{fontenc}
 \usepackage[latin1]{inputenc}
 \usepackage[italian]{babel}
 \frenchspacing
 \title{#3}
 \author{#4}
 \date{#5}
}

\newcommand{\setabstract}[1]{
 \RequirePackage{hyperref}
 \hypersetup{pdfsubject={#1}}
}

\newcommand{\setkeywords}[1]{
 \RequirePackage{hyperref}
 \hypersetup{pdfkeywords={#1}}
}

ht.tex

\newcommand{\makepreamble}[5]{
 \documentclass{#1}
 \usepackage[T1]{fontenc}
 \usepackage{hyperref}
 \usepackage{graphicx}
 \DeclareGraphicsExtensions{.gif,.png,.jpg}
 \usepackage[latin1]{inputenc}
 \usepackage[italian]{babel}
 \frenchspacing
 \title{#3}
 \author{#4}
 \date{#5}
}

\newcommand{\setabstract}[1]{}
\newcommand{\setkeywords}[1]{}

\newcommand{\href}[2]{\Link[#1]{}{} #2 \EndLink}
\newcommand{\hypertarget}[2]{\Link[]{}{#1} #2 \EndLink}
\newcommand{\hyperlink}[2]{\Link[]{#1}{} #2 \EndLink}

dvi.tex

\newcommand{\makepreamble}[5]{
 \documentclass[#2]{#1}
 \usepackage[T1]{fontenc}
 \usepackage{hyperref}
 \usepackage{graphicx}
 \DeclareGraphicsExtensions{.eps,.ps}
 \usepackage[latin1]{inputenc}
 \usepackage[italian]{babel}
 \frenchspacing
 \title{#3}
 \author{#4}
 \date{#5}
}

\newcommand{\setabstract}[1]{}
\newcommand{\setkeywords}[1]{}

default.tex

\newcommand{\makepreamble}[5]{
 \documentclass[#2]{#1}
 \title{#3}
 \author{#4}
 \date{#5}
}

\newcommand{\setabstract}[1]{}
\newcommand{\setkeywords}[1]{}

In realtà, la finalità di questa libreria non è di evitare la scrittura del preambolo, perchè prima di \begin{document} si potranno scrivere tutte le ulteriori direttive che servono al nostro documento; il vero pregio è la possibilità di modificare “al volo” quelle parti del preambolo che ottimizzano la produzione di un particolare tipo di output.

RFC: tutti i suggerimenti per migliorare sono benvenuti.