Premessa
Può essere necessario, lavorando con LaTeX o LyX inserire all'interno del testo del documento alcune parti nelle quali si vuole mantenere la formattazione originale senza alcun intervento del motore LaTeX.
Un classico esempio è l'inserimento di codice di programmazione dentro un documento LaTeX.
Questo può presentare spazi o tabulazioni che verrebbero ignorati oppure simboli come le parentesi graffe, per fare un esempio, che sarebbero male interpretate dal motore generando errori.
Prima soluzione
Per risolvere questo problema, in prima istanza, si può utilizzare l'ambiente
verbatim.
Questo ambiente consente di inserire del codice o qualsiasi testo mantenendo la formattazione originale.
Un esempio banale può essere:
\begin{verbatim}int i=0;int c=0;for(i=0;i<=33;i++){ print "Prova di valore su I": $i;}\end{verbatim}In questo modo tutto ciò che sta dentro l'ambiente
verbatim non viene analizzato dal motore che lo riproporrà così come lo abbiamo scritto.
Questo ambiente va benissimo in svariate occasioni ma di seguito vedremo una soluzione più accattivante.
Soluzione più elegante
Recentemente, su
forum del
Gruppo italiano utilizzatori LaTeX, ho scoperto l'esistenza del ambiente
lstlisting che ha proprio lo scopo di permettere l'inserimento di codice dentro un documento.
Premetto che consiglio la lettura del documento per altro molto scorrevole.
Potete trovarlo
cliccando quiIl pacchetto va scaricato opportunamente ma non si ritiene questa la sede per spiegare il metodo dato che cambia a seconda della distribuzione LaTeX e dal sistema operativo.
La prima cosa da fare è aggiungere il pacchetto nel preambolo:
\usepackage{listings} %Per inserire codice\usepackage[usenames]{color} %Per permettere la colorazione dei caratteri A questo punto possiamo procedere come segue nel testo:
\begin{lstlisting}[caption={Programma Blink, "Hello World!"}]CODICE PROGRAMMA...\end{lstlisting}Il pacchetto, però, se utilizzato semplicemente in questo modo non darebbe molto valore aggiunto se confrontato con
verbatim.
Al contrario da a mio avviso tre grossi vantaggi:
- Permette di evidenziare le parole chiave all'interno del listato
- Permette la creazione di nuovi ambienti ad hoc
- Permette la creazione di codice all'interno di oggetti mobili
Nel esempio che segue, creiamo grazie al pacchetto, un nuovo ambiente e nel testo si andrà ad utilizzare tutte le volte necessarie.
\lstnewenvironment{codice_arduino}[1][]{\lstset{basicstyle=\small\ttfamily, columns=fullflexible, keywordstyle=\color{red}\bfseries, commentstyle=\color{blue}, language=C++, basicstyle=\small, numbers=left, numberstyle=\tiny, stepnumber=2, numbersep=5pt, frame=shadowbox, float=*, #1}}{}Questo codice può essere inserito nel preambolo e permette di creare un ambiente nel quale:
- il carattere è più piccolo del resto del corpo e con carattere appartenente alla famiglia ttf \lstset{basicstyle=\small\ttfamily;
- con le colonne allineate a sinistra e non giustificate in modo da mantenere l'allineamento del codice rispetto tabulazioni o spazi columns=fullflexible;
- le parole chiave siano di colore rosso e grassetto keywordstyle=\color{red}\bfseries;
- i commenti siano colore blue commentstyle=\color{blue};
- il linguaggio sia il C++ language=C++,
- che ci siano i numeri sulla sinistra del listato più piccoli rispetto al listato numbers=left, numberstyle=\tiny, stepnumber=2, numbersep=5pt,
- che ci sia una cornice tutto intorno al listato frame=shadowbox,
- che il listato sia flottante rispetto al testo float=*,
- dove l'utente possa eventualmente specificare altre opzioni come, ad esempio, la didascalia #1
Il codice che seguirà nel testo permette di utilizzare questo nuovo ambiente che ho chiamato
codice_arduino in maniera trasparente ed eventualmente posso aggiungere valori opzionali.
Segue codice esplicativo:
\begin{codice_arduino}[caption={Programma Blink, "Hello World!"}]/* Blinking LED* ------------*/int ledPin = 13; // LED connected to digital pin 13void setup(){pinMode(ledPin, OUTPUT); // sets the digital pin as output}void loop(){digitalWrite(ledPin, HIGH); // sets the LED ondelay(1000); // waits for a seconddigitalWrite(ledPin, LOW); // sets the LED offdelay(1000); // waits for a second}\end{codice_arduino}Il risultato è il seguente: