Robitex's Blog

Ideas in the web

Da una lista un elenco puntato


Programmare il sistema TeX richiede conoscenze prodotte da molte sessioni di lavoro ed una dose notevole di pazienza e passione per scoprirne i meccanismi ideati dal nostro Donald Knuth. Per fortuna su CTAN il repository internazionale della community, si trovano alcuni pacchetti che forniscono un interfaccia di più alto livello verso TeX, da utilizzare in LaTeX.

Il pacchetto etextools

Questo pacchetto di Florent Chervet tuttora in fase di evoluzione, inspirato da un lavoro di Philipp Lehman, contiene in particolare alcune macro per gestire le liste, ovvero stringhe di testo separate da un carattere particolare come la virgola o il punto e virgola, come per esempio il seguente: {one,two,three,four,five,six and seven,etc}.

Bene, ecco come si può iterare in LaTeX una lista, per esempio per stamparne semplicemente ciascun item su una singola riga. Innanzi tutto occorre dichiarare un list parser con tanto di carattere separatore:

\DeclareCmdListParser{\mylistparser}{,}

e poi definire un comando che elabora l’elemento della lista uno dopo l’altro:

\newcommand{\dowithelem}[1]{\noindent#1\\}

infine richiamare la lista fornendo il nostro comando come opzione:

\mylistparser[\dowithelem]{one,two,three,four,five,six and seven}

Il risultato lo potete tranquillamente controllare in questo file pdf scaricabile (23 KB).

Da una lista ad un elenco puntato

Ed eccoci al titolo del post: vogliamo un comando che accetti una lista in input e restituisca l’elenco puntato dei suoi elementi. Il comando si chiamerà \doitemize e la sua implementazione sarà simile a quella vista precedentemente. Questa volta il comando di elaborazione inserirà un token \item prima dell’elemento, naturalmente all’interno di un ambiente itemize standard.

% nuovo list parser e cmd di elaborazione elemento
\DeclareCmdListParser{\mylistparser}{;}
\newcommand{\dowithelem}[1]{\item #1}

%
\newcommand{\doitemize}[1]{%
\begin{itemize}
\mylistparser[\dowithelem]{#1}
\end{itemize}}

abbiamo cambiato il carattere separatore in un punto e virgola perché la virgola è più frequente che sia un normale carattere del singolo elemento d’elenco. Per il resto il codice si spiega abbastanza bene da solo. Occorre solo fare un po’ di conoscenza con una sintassi forse un po’ troppo implicita, riguardante i list parser del pacchetto citato.

Come al solito ecco il pdf da consultare con calma (dimensione 24 KB).

Ma se volessimo…

Se volessimo che fosse aggiunto un punto e virgola alla fine di ogni elemento dell’elenco ed un punto alla fine dell’ultimo elemento come potremo adattare il codice già scritto?
La risposta non è facilissima, occorre pensarci un po’ su.

La mia soluzione è questa: creare una macro inizialmente vuota ed inserirla prima del comando \item, poi ridefinirla all’interno del loop in un punto e virgola: ecco il codice.

\usepackage{etextools}

\DeclareCmdListParser{\mylistparser}{;}
\newcommand{\sep}{}
\newcommand{\dowithelem}[1]{%
\sep\item #1%
\renewcommand{\sep}{;}}

\newcommand{\doitemize}[1]{
\begin{itemize}
\mylistparser[\dowithelem]{#1}.
\end{itemize}
}

Nel documento il comando si userà così:

\doitemize{uno;due;tre;quattro;cinque;sei;sette;otto}

Il trucco sta nel sistemare un punto al termine del ciclo di elaborazione della lista fatto da \mylistparser, ed unire un punto e virgola prima del \item successivo, carattere che si unirà quindi all’item precedente.
La cosa un po’ meno elegante è che se la lista è più lunga di due elementi avverrà una ridefinizione del comando \sep inutilmente.
Questo è il risultato finale da scaricare (30KB).

Ciao ed alla prossima (Please, if you want, leave a comment on coding issues. Thanks ).

Lascia un commento

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...

%d blogger cliccano Mi Piace per questo: