codici sorgente in documenti latex

6
 DEV DEV eloping Softw are Solutions — n. 120 — luglio-agosto 2004 Codici sorgente in documenti LaTeX di Gianluca Pigna lberi La nostra documentaz ione ha bisogno di porzion i di codice sorgen- te, e la nostra ssazione nell’usare LaTeX ci permette di farlo in maniera rapida, automatizzata, elegante e con soluzioni grache spesso vincenti. Gianluca Pignalberi ` E laureato in Scienze dell’Informazione presso l’Universit ` a La Sapienza di Roma. Si occupa, per passione, di Algoritmi Genetici applicati all’e- laborazione delle imma- gini, ma  ` e stato a lungo occupato, per profes- sione, in problematiche legate all’elaborazione di testi: riconosci mento della lingua, compres- sione, retrie val. Il tutto sempre per sistemi Unix.

Upload: infomedia-editori-coop

Post on 12-Jul-2015

675 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: Codici sorgente in documenti LaTeX

5/11/2018 Codici sorgente in documenti LaTeX - slidepdf.com

http://slidepdf.com/reader/full/codici-sorgente-in-documenti-latex 1/6

DEV DEVeloping Software Solutions — n. 120 — luglio-agosto 2004

Codici sorgente in documenti

LaTeXdi Gianluca Pignalberi

La nostra documentazione ha bisogno di porzioni di codice sorgen-te, e la nostra fissazione nell’usare LaTeX ci permette di farlo in manierarapida, automatizzata, elegante e con soluzioni grafiche spesso vincenti.

Gianluca Pignalberi

E laureato in Scienzedell’Informazione pressol’Universita La Sapienzadi Roma. Si occupa, perpassione, di AlgoritmiGenetici applicati all’e-laborazione delle imma-gini, ma e stato a lungooccupato, per profes-sione, in problematichelegate all’elaborazionedi testi: riconoscimentodella lingua, compres-sione, retrieval. Il tuttosempre per sistemi Unix.

Page 2: Codici sorgente in documenti LaTeX

5/11/2018 Codici sorgente in documenti LaTeX - slidepdf.com

http://slidepdf.com/reader/full/codici-sorgente-in-documenti-latex 2/6

pubblicato su

WWW.INFOMEDIA.IT

stampa digitale da

Lulu Enterprises Inc.

stores.lulu.com / infomedia

Infomedia

Infomedia e l’impresa editoriale che da quasi venti an-

ni ha raccolto la voce dei programmatori, dei sistemi-

sti, dei professionisti, degli studenti, dei ricercatori e dei

professori d’informatica italiani.

Sono piu di 800 gli autori che hanno realizzato per le te-

state Computer Programming, Dev, Login, Visual Basic

Journal e Java Journal, molte migliaia di articoli tecnici,

presentazioni di prodotti, tecnologie, protocolli, strumen-ti di lavoro, tecniche di sviluppo e semplici trucchi e stra-

tagemmi. Oltre 6 milioni di copie distribuite, trentamila

pagine stampate, fanno di questa impresa la piu grande ed

influente realta dell’editoria specializzata nel campo della

programmazione e della sistemistica.

In tutti questi anni le riviste Infomedia hanno vissuto del-

la passione di quanti vedono nella programmazione non

solo la propria professione ma un’attivita vitale e un vero

divertimento.

Nel 2009, Infomedia e cambiata radicalmente adottando

un nuovo modello aziendale ed editoriale e si e organiz-

zata attorno ad una idea di Impresa Sociale di Comunita,

partecipata da programmatori e sistemisti, separando le

attivita di gestione dell’informazione gestite da un board

comunitario professionale e quelle di produzione gesti-

te da una impresa strumentale. Questo assetto e in linea

con le migliori esperienze internazionali e rende Infome-

dia ancora di piu parte della Comunita nazionale degli

sviluppatori di software.

Infomedia e media-partner di manifestazioni ed eventi in

ambito informatico, collabora con molti dei pi u impor-tanti editori informatici italiani come partner editoriale e

fornitore di servizi di localizzazione in italiano di testi in

lingua inglese.

L’impaginazione automatica di questa rivista e realizzata al

100% con strumenti Open Source usando OpenOffice,

Emacs, BHL, LaTeX, Gimp, Inkscape e i linguaggi Lisp,

Python e BASH

For copyright information about the contents of DEV, please see the section “Copyright” at the end of each ar-

ticle if exists, otherwise ask authors. Infomedia contents

is© 2004 Infomedia and released as Creative Commons

2.5 BY-NC-ND. Turing Club content is © 2004 Turing

Club released as Creative Commons 2.5 BY-ND.

  Le informazioni di copyright sul contenuto di DEV so-

no riportate nella sezione “Copyright” alla fine di cia-

scun articolo o vanno richieste direttamente agli autori.

 Il contenuto Infomedia e© 2004 Infomedia e rilasciato

con Licenza Creative Commons 2.5 BY-NC-ND. Il con-

tenuto Turing Club e © 2004 Turing Club e rilasciato

con Licenza Creative Commons 2.5 BY-ND. Si applicano

tutte le norme di tutela dei marchi e dei segni distintivi.

` E in ogni caso ammessa la riproduzione parziale o tota-

le dei testi e delle immagini per scopo didattico purch´ e

vengano integralmente citati gli autori e la completa

identificazione della testata.

 Manoscritti e foto originali, anche se non pubblicati, non

si restituiscono.

Contenuto pubblicitario inferiore al 45%.

  La biografia dell’autore riportata nell’articolo e sul

sito www.infomedia.it e di norma quella disponibi-

le nella stampa dell’articolo o aggiornata a cu-

ra dell’autore stesso. Per aggiornarla scrivere a

[email protected] o farlo in autonomia all’indirizzo

http: // mags.programmers.net  / moduli / biografia

Page 3: Codici sorgente in documenti LaTeX

5/11/2018 Codici sorgente in documenti LaTeX - slidepdf.com

http://slidepdf.com/reader/full/codici-sorgente-in-documenti-latex 3/6

Trovandoci nella necessità di

dover documentare i nostri pro-

grammi, avremo verosimilmente

bisogno di includere porzioni di

codice sorgente nei nostri

manuali, libri, relazioni.

Leslie Lamport, che aveva ben presente

questa necessità, pensò bene di dotare il

suo LaTeX [3] di un ambiente in grado di

formattare un testo come un codice sor-

gente. Pur coprendo parte delle esigenze

dell’utenza, questo ambiente offre funzio-

nalità piuttosto spartane. Per ovviare a ciò,

altri TeX-nici (come vengono chiamati in

gergo i programmatori TeX) hanno fornito

dei package in grado di espandere le capa-

cità di siffatta funzione.In questo articolo vedremo come sfruttare

al meglio questi ausili.

L’ambiente verbatimIl set base di macro offerto da LaTeX com-

prende l’ambiente verbatim per inserire dei

codici sorgente all’interno di un documento.

La prima modalità per comporre un codice

all’interno di un documento è la seguente:

\begin{verbatim}

<codice sorgente>

\end{verbatim}

Il codice sorgente verrà composto con un

carattere di tipo typewriter (quindi equispa-

ziato), allo stesso modo di come è stato

scritto nel sorgente del documento; i carat-

teri “tab” saranno però sostituiti con lo spa-

zio semplice. Come molti ambienti, anche

verbatim ha una versione starred . Scrivere

\begin{verbatim*}

<codice sorgente>

\end{verbatim*}

equivale ad ottenere il codice sorgente for-

mattato come appena detto, ma con glispazi evidenziati. Un esempio delle due

modalità è mostrato in Figura 1.

In caso volessimo scrivere dei pezzi di sor-

gente, o evidenziare dei comandi da ese-

guire, all’interno di un paragrafo, non

dovremmo faticare molto: LaTeX ci fornisce

il comando \verb , e il corrispondente star- 

red . Il loro uso è molto semplice, e consiste

nel far seguire al comando il testo da ren-

dere, racchiuso da un carattere delimitato-

re. Ad esempio

\verb+printf(const char *format, ...);+

compone il testo racchiuso entro i caratteri

“+” come visibile in Figura 1. Questo è quan-

to: LaTeX non è in grado di fare altro per trat-

tare i nostri sorgenti. Purtroppo a noi docu-

mentatori folli (e incontentabili) questo non

basta: vorremmo, ad esempio, numerare le

righe dei sorgenti per riferirci ad esse piùfacilmente, o includere i sorgenti senza

doverli scrivere fisicamente nel documento

(un po’ come le direttive al precompilatore

del C o il comando \input di LaTeX).

Compito: più funzionalità.Voto: D+Per estendere le possibilità offerte dall’am-

biente verbatim, è stato implementato il

package omonimo [5]. Vediamone alcune

caratteristiche.

Mentre l’ambiente originale non permette di

scrivere \end {verbatim}  (con lo spazio in

mezzo) e deve leggere tutto il testo com-preso tra \begin{verbatim} e \end{verbatim} 

prima di poterlo comporre (eventualmente

eccedendo i limiti di memoria di TeX), il

nuovo package supera questi limiti (di mino-

re entità il primo, più serio il secondo).

Introduce però un’incompatibilità: se in

LaTeX base scrivessimo del testo dopo il

comando \end{verbatim}  e sulla stessa

riga, questo verrebbe riconosciuto come

testo e composto correttamente; il package

verbatim invece scarterebbe questo testo,

avvertendo che ogni carattere compreso tra

il comando e la fine della riga è stato scar-

tato (è il prezzo da pagare per poter inseri-re degli spazi tra \end e {verbatim} !).

Viene anche fornito l’ambiente comment ,

che fa ignorare al compilatore il testo com-

preso tra l’inizio e la fine dell’ambiente.

La nostra

documentazione habisogno di porzionidi codice sorgente,

e la nostrafissazione

nell’usare LaTeX cipermette di farlo in

maniera rapida,automatizzata,elegante e con

soluzioni grafichespesso vincenti

94 DEV > n. 120 luglio/agosto 2004>>

Codici sorgente indocumenti LaTeX

di Gianluca Pignalberi > [email protected]

Page 4: Codici sorgente in documenti LaTeX

5/11/2018 Codici sorgente in documenti LaTeX - slidepdf.com

http://slidepdf.com/reader/full/codici-sorgente-in-documenti-latex 4/6

I due ambienti non possono essere annidati. Naturalmente,

dell’ambiente verbatim viene fornita anche la versione star- 

red , con la stessa caratteristica dell’originale.

Pur potendo ricorrere al cut and paste , inserire dei sorgen-

ti in un documento può essere scomodo e tedioso. Per evi-

tare ciò c’è il comando \verbatiminput{<nome file>} .

Questo inserisce il sorgente nel punto voluto, formattando-

lo propriamente. La versione starred  di questo comando,

come intuibile, evidenzia gli spazi.

Notiamo una cosa: senza il package verbatim avremmo

potuto ottenere la stessa cosa aggiungendo nel sorgente le

righe di inizio e fine ambiente, usando il comando

\input{<nome sorgente>} ; ma a questo punto il sorgente

non sarebbe più compilabile, a meno di non averne fatto

una copia. Come vediamo, anche se il nostro lavoro di

documentatori è stato semplificato, questo non ci basta: ad

esempio, vorremmo poter contrassegnare le righe del

nostro codice con dei numeri per riferirci più velocemente

ad esse, al fine di documentare determinate funzionalità.

Per poter espletare quest’altra funzione ricorreremo al pac-

kage moreverb [1]. Questo fornisce un insieme di ambien-

ti riconducibili a quello cosiddetto listing .

L’ambiente principale, per l’appunto listing , si apre con laseguente sintassi:

\begin{listing}[<intervallo>]{<riga iniziale>}

Il parametro riga iniziale indica da quale numero si inizia a

numerare le righe (numero assunto dalla prima riga), men-

tre il parametro opzionale intervallo indica quali righe avran-

no il numero scritto accanto (quelle il cui numero mod inter- 

vallo = 0).

Ovviamente può capitare di voler suddividere il sorgente da

mostrare in varie parti all’interno del documento, e di voler

continuare la numerazione da dove l’avevamo lasciata.

L’ambiente che per noi riprende tale numerazione è listing- 

cont .

Entrambi i comandi visti hanno la versione starred (Figura

2). Purtroppo hanno il “difetto” di volere la hard copy del

codice all’interno del documento. Per ovviare a questo

inconveniente c’è l’ambiente listinginput , che non dispone

della versione starred . La sintassi di inclusione è:

\listinginput[<intervallo>]{<riga iniziale>}{<nome file>}

Tutti questi ambienti non sfruttano una capacità del packa-

ge: non espandono i “tab”. Il package moreverb permette

di definire la dimensione dei caratteri di tabulazione, per

comporli correttamente. I due ambienti che permettono ciò

sono verbatimtab e verbatimtabinput . Entrambi prendono

come parametro opzionale la dimensione della tabulazione;

il secondo prende un ulteriore parametro, obbligatorio, che

è il nome del file da includere nel documento. Non dando la

dimensione del “tab”, il package assume che sia 8 carat-

teri; possiamo variare in tutto il documento questo valore di

default ridefinendo \verbatimtabsize come segue:

\renewcommand\verbatimtabsize{<valore>\relax}

A detta dell’autore, il comando TeX \relax è fondamentale

per la corretta esecuzione della composizione.

Altri due ambienti sono forniti da questo package: verba- 

timwrite  e boxedverbatim. Il primo scrive nel file di cui

abbiamo fornito il nome come parametro tutto ciò che c’è

scritto nel suo corpo; il secondo ci mostra il contenuto del

suo corpo circondato da un rettangolo di dimensioni corret-

te, e comunque migliori di come verrebbe se volessimo

farlo in modo “casereccio”.

Un altro package di notevole aiuto alla nostra funzione di

documentatori è sverb [6].

Parte delle sue caratteristiche sono state ricreate in altri

package, ma alcune sono molto interessanti (l’autore ha

creato questo package per comporre dei programmi scrittiin un particolare assembly).

L’ambiente listing compone il codice come verbatim, ma il

margine sinistro sarà più interno rispetto a quello del testo

DEV > n. 120 luglio/agosto 2004 95 <<

Intermediate

LISTATO 1Sorgente LaTeX che genera un documentoin cui il comando di chiusura dell’ambiente

può essere inserito nel codice sorgente damostrare

\documentclass[12pt]{article}

\usepackage{sverb}

\usepackage{multicol}

\begin{document}

Prima di inserire un sorgente scriviamo un po’ di testo,

tanto per vedere dove diavolo sar\`a schiaffato il

codice\ldots

\begin{listing*}{<fine-lista>}

\begin{listing}

#include <stdio.h>

main() {

printf(“Hello, world!\n”);

}

\end{listing}

<fine-lista>

\end{document}

FIGURA 1Codice sorgente inserito nel documentoe all’interno di un paragrafo,sia in versione normale che starred

FIGURA 3

Risultato di testo verbatim così comecomposto dall’ambiente listing* di sverb.Questo ambiente ci permette di definirela stringa che funge da terminatoredell’ambiente stesso

FIGURA 2 Pezzi di codice sorgente inseritinel documento e con le righe numerate

Page 5: Codici sorgente in documenti LaTeX

5/11/2018 Codici sorgente in documenti LaTeX - slidepdf.com

http://slidepdf.com/reader/full/codici-sorgente-in-documenti-latex 5/6

(per default 1 em, cioè la larghezza approssimativa del

carattere ‘M’ reso nel corpo considerato). Di questo

ambiente esiste la versione starred , che però non funziona

come gli ambienti visti finora. All’apertura dell’ambiente

daremo un parametro, che contiene la stringa che indica la

terminazione dell’ambiente stesso. In questo modo pos-

siamo includere il comando di chiusura dell’ambiente

listing  all’interno del codice da comporre. Vediamo un

esempio in Figura 1, che è generata dal codice mostrato

nel Listato 1. Tralasciamo di vedere gli ambienti per scri-

vere un file su disco e per leggerlo da disco per la compo-

sizione, concentrandoci sull’ambiente demo . Questo per-

mette di visualizzare, uno a fianco all’altro o uno sull’altro,

il testo originale e il suo output. La sintassi è la seguente:

\begin{demo}[<forma>]{<titolo>}...\end{demo}

dove la forma può essere n (narrow ) o w (wide ): per default

la scelta è narrow , che posiziona le due sezioni affiancate.

Il seguente testo:

\begin{demo}{Formula}

\[n! = n \cdot (n - 1)!

= \prod_{i = 1}^n i\]

\end{demo}

genera il testo mostrato in Figura 4.

Voglio il meglioPer aumentare le funzionalità fin qui viste sono stati scritti

altri due package: fancyvrb [7] e fvrb-ex [2], scritto intorno

al primo. Il package fancyvrb aggiunge al “capostipite” alcu-

ne funzionalità: la prima è che i comandi verbatim possono

essere usati nelle note a pié di pagina, cosa impossibile

originariamente. Per abilitare tale funzione ricorreremo al

comando

\VerbatimFootnote

Possiamo inoltre definire un’abbreviazione per il verbatim

inline , in sostituzione del comando \verb . Ad esempio

\DefineShortVerb{\|}

ci permette di ottenere l’effetto visibile in Figura 5, cioè

possiamo comporre un testo verbatim con l’apposito

comando o con la sua abbreviazione. Il package fancyvrb 

ridefinisce anche l’ambiente verbatim, chiamandolo

Verbatim. Questo ambiente è ampiamente personalizzabile;

tra le varie opzioni, che qui non vedremo, ci sono la defini-

zione di un carattere per commentare delle porzioni di

testo; l’opzione in questione è commentchar . Ovviamente

l’effetto di commentare una riga di testo del codice è quel-lo di non far comporre la riga in oggetto, e quindi non farla

comparire nel codice accluso al documento finale.

Possiamo anche eseguire un comando prima della format-

tazione del testo verbatim (opzione formatcom) o scegliere

il font con cui scrivere il testo del codice (opzione fontfa- 

mily ) e la sua dimensione (opzione fontsize ). Abbiamo

anche la possibilità di far circondare il codice da una corni-

ce (frame ) di cui possiamo specificare la posizione, lo spes-

sore e il colore delle linee, il colore di riempimento, la

dimensione dello spazio vuoto tra cornice e testo e l’eti-

chetta della cornice stessa (come fatto con l’ambiente

demo poc’anzi visto, e visibile in Figura 4).

Altre possibilità offerte sono: numerazione delle righe,

automaticamente o arbitrariamente; scelta delle parti di

codice da includere nel documento; evidenziazione degli

spazi (per cui è offerto il solito ambiente starred ).

La sola descrizione di tutte le opzioni di fancyvrb giustifi-

cherebbe la stesura di un articolo a sé stante; il lettore

volenteroso potrà trovare in [7] tutto ciò che serve sapere.

Il package fvrb-ex è stato scritto per incrementare la quan-

tità di ambienti di esempio, la maggior parte dei quali è

devoto all’inserimento di elementi grafici. L’autore ci mette

in guardia sul fatto che il suo uso non è garanzia di risulta-

to su tutti i sistemi a causa della gestione dei caratteri a 8

bit di alcune versioni di TeX. La cosa più utile è la definizio-

ne degli stili di evidenziazione di codice, da cui desumiamo

dei comandi speciali per “colorare” il codice sia nella ver-

sione bianco e nero che a colori (opzioni baw e color ).

Presentazioni ancora più belleIn [4] abbiamo visto come creare delle presentazioni “ani-

mate” tramite il package pdfscreen. Tra le sue opzioni ricor-

diamo esserci code , che fornisce i comandi per la format-

tazione del codice, allo stesso modo dell’ambiente verba- 

tim. Le “parentesi angolari” saranno trattate in maniera

speciale, quando vengono trattate entro l’ambiente verba- 

tim. Infatti, tutto ciò che verrà da esse delimitato viene trat-

tato come se fosse un’opzione di un comando, e quindi for-

mattato in modo da evidenziare questa particolarità (lo

stesso effetto che desideriamo formattando regole gram-

maticali, a cui riserveremo un articolo a sé).

Se invece vogliamo inserire dei singoli caratteri di maggio-

re e minore, dobbiamo aggiungere un carattere di escape (raddoppiando il carattere), pena un errore in compilazione.

Inserendo il seguente codice otteniamo quanto mostrato in

basso in Figura 6:

96 DEV > n. 120 luglio/agosto 2004>>

Intermediate

FIGURA 4L’ambiente demo mostra il testosorgente e l’output da esso risultanteuno accanto all’altro

FIGURA 5La possibilità di abbreviare il comandoper il verbatim inline ci permetteuna sintassi compatta

FIGURA 6 Testo e codice formattati quandosi usa il package pdfscreen

Page 6: Codici sorgente in documenti LaTeX

5/11/2018 Codici sorgente in documenti LaTeX - slidepdf.com

http://slidepdf.com/reader/full/codici-sorgente-in-documenti-latex 6/6

\begin{verbatim}

\usepackage[<options>]{<package>}

#include <<stdio.h>>

\end{verbatim}

Nel package in oggetto è stato definito l’ambiente decl , chevisualizza il testo racchiudendolo in un riquadro. Siccome il

testo al suo interno non è trattato come un codice, dobbia-

mo usare alcuni accorgimenti (ad esempio circondare i

comandi con ‘|’), ma potremo trattare molto facilmente i

parametri di funzioni, grazie a due comandi introdotti appo-

sitamente: \arg e \oarg .Il seguente codice genera il testo visibile in alto in Figura 6:

\begin{decl}

|\usepackage|\oarg{options}\arg{package}

\end{decl}

ConclusioniLe possibilità che LaTeX offre di base per inserire del codice,

formattandolo come un sorgente, non sono moltissime.

L’opera di scrittura di package in TeX ha fatto sì che queste

possibilità fossero aumentate grandemente.

Nel corso del presente articolo abbiamo visto alcuni di que-

sti package (senz’altro i più diffusi) e buona parte delle loro

capacità. I lettori interessati potranno partire da qui per ren-

dere i propri documenti visivamente professionali e coerenti.

Maggiori competenze potranno essere acquisite riferendosi

sempre ai manuali di ogni package, ed eventualmente pren-

dendo dai siti appropriati altri strumenti adatti ai propri scopi.

Bibliografia[1] R. Fairbairns, The moreverb package, www.ctan.org,

1997.

[2] D. Girou, The ‘fvrb-ex’ package, www.ctan.org, 1998.

[3] L. Lamport, LaTeX: A Document Preparation System,

Addison Wesley, Reading, MA., 2a edizione, 1994.[4] G. Pignalberi, Presentazioni e manuali integrati conpdfLaTeX, Dev , n. 117, Gruppo Editoriale Infomedia,

Apr. 2004.

[5] R. Schöpf, B. Raichle, and C. Rowley, A New Implementation of LaTeX’s verbatim and verbatim*Environments, www.ctan.org, 2001.

[6] M. Wooding, The sverb package, www.ctan.org, 1996.

[7] T. Van Zandt, The ‘fancyvrb’ package, www.ctan.org,

1998.

È laureato in Scienze dell’Informazione presso l’Università La Sapienza di Roma. Si occupa, per passione, di Algoritmi Genetici applicati all’elaborazione delle immagini, ma è stato a lungo occupato, per professione, in problematiche legate all’elaborazione di testi: riconoscimento della lingua,compressione, retrieval. Il tutto sempre per sistemi Unix.

Intermediate

Gianluca Pignalberi

Download del progetto

Scarica il progetto completo di questo articolo all’indirizzo:

ftp://ftp.infomedia.it/pub/DEV./Listati/Dev118/ls-latex.zip