Le macro mm per groff

introduzione all'uso

Federico Lupi


1. Premessa

Nelle mie ricerche su Internet non sono mai riuscito a trovare una descrizione o un manuale utente per il pacchetto di macro mm per troff: tutte le ricerche terminavano inevitabilmente sulla pagina di manuale di groff_mm. Poiché non penso che una pagina di manuale costituisca l'introduzione ideale, ho deciso di scrivere questa piccola guida, anche se non mi si può sicuramente considerare un esperto né di troff/groff né dei suoi pacchetti di macro.

Ciò premesso, spero che questo articolo possa essere di utilità a chi vuole imparare l'uso delle macro mm.

2. Introduzione

Questo documento descrive il pacchetto di macro mm (memorandum macro) per troff, un pacchetto molto completo e ricco di possibilità che consente la facile generazione di intestazioni e pié pagina, intestazioni di capitoli e di paragrafi, elenchi e schemi.

Nota: uno schema è un blocco di materiale che può muoversi nel testo fino al punto in cui troff decide di inviarlo in uscita. Questa caratteristica può essere usata, per esempio, per posizionare tabelle e figure nelle pagine sinistre o all'inizio della pagina, oppure per occupare una pagina completa.

Per la comprensione del materiale presentato è necessario conoscere i fondamenti dell'utilizzo del programma troff (o groff). Chi è interessato può trovare molto materiale utile sulla pagina GNU Troff Info.

3. Scrittura del testo

Nello scrivere il testo per il pacchetto di macro mm (e per troff in generale) conviene seguire alcune regole base.

4. Scrittura dei comandi

Le linee che iniziano con un punto o un apostrofo sono considerate comandi di troff (i due caratteri hanno un significato leggermente diverso). Il carattere di controllo deve essere seguito da un comando costituito da una o due lettere (il "nome" del comando; groff consente di usare comandi composti da più di due lettere). Nel pacchetto di macro mm i comandi sono composti da una o due lettere maiuscole o da una lettera maiuscola seguita da un numero.

Alcuni comandi compaiono da soli sulla linea, altri possono essere seguiti da uno o più argomenti.

Ecco un esempio di file troff con il pacchetto di macro mm

  .AF "Federico Lupi"
  .TL
  Il pacchetto di macro mm
  .AU "Federico Lupi"
  .AS
  Introduzione all'uso del pacchetto mm di macro per troff.
  .AE
  .MT 4

5. I comandi di mm

Le sezioni seguenti descrivono i principali comandi di mm, raggruppati per tipo. Per una descrizione più completa si rimanda alla pagina di manuale di troff o groff (groff_mm).

5.1. Paragrafi

Il comando principale per iniziare un nuovo paragrafo è .P [tipo].

Se tipo è uguale a 0 o è assente, la prima linea del paragrafo viene allineata a sinistra, altrimenti viene indentata del numero di spazi specificato nel registro Pi.

Si può specificare il tipo di paragrafo di default utilizzando il registro Pt (paragraph type). Il valore di default (0) definisce paragrafi non indentati; con il valore 1 il comando .P definisce paragrafi indentati mentre con il valore 2 si ottengono paragrafi indentati fuorché dopo i comandi .H, .DE e .LE.

5.2. Spaziatura verticale

Per creare uno spazio vuoto verticale si utilizza il comando .SP [linee].

Al numero di linee può essere aggiunto anche un indicatore dell'unità di misura, come 3i (3 pollici) o 8v (8 V). Se il parametro linee è assente viene utilizzato il valore 1, ottenendo una linea vuota.

5.3. Salti pagina

Per iniziare una nuova pagina si usa il comando .SK [pagine]

Se il parametro pagine è 0 o viene omesso, verrà iniziata una nuova pagina, a meno che non ci si trovi già a inizio pagina; altrimenti verrà saltato un numero di pagine pari al valore del parametro.

5.4. Corpo dei caratteri

La macro .S [dimensione [spaziatura]] definisce il corpo dei caratteri e la spaziatura verticale delle linee. Il comando:

  .S 12 14

è equivalente ai comandi troff:

  .ps 12
  .vs 14

Nota: quando si utilizza un pacchetto di macro è bene evitare l'uso diretto di comandi di troff, salvo quando strettamente necessario.

Per i due argomenti vengono accettati anche i valori P, C e D; in questo caso, se si specifica il valore P per uno dei due argomenti, allora viene ripristinato il valore precedente per quell'argomento. C indica il valore corrente e D il valore di default. Specificando `+' o `-' prima dell'argomento si ottiene l'effetto di incrementare o decrementare il valore dello stesso.

5.5. Giustificazione

Si può selezionare la giustificazione a destra con .SA 1 (che è il valore di default). Con .SA 0 si ottengono invece paragrafi non giustificati.

5.6. Tipo di carattere

Per cambiare il tipo di carattere si possono usare vari comandi: .B (bold = neretto), .R (roman = tondo normale), .I (italic = corsivo), .CW (constant width = non proporzionale)

Nota: Il pacchetto mm di groff non definisce il comando .CW

e .P (previous = precedente).

La sintassi esatta di questi comandi è, per esempio: .B [arg.neretto [arg.font precedente [neretto [...]]]].

Inoltre esistono i comandi:

  .BI
  .BR
  .IB
  .IR
  .RB
  .RI

il cui significato è equivalente ai precedenti ma che alternano tra corsivo, tondo e neretto.

5.7. Intestazioni

Il pacchetto mm consente di formattare automaticamente vari tipi di intestazioni, quali titoli di capitoli, paragrafi e sezioni: le intestazioni possono essere numerate automaticamente. Inoltre è possibile stabilire le convenzioni da utilizzare per i tipi e le dimensioni dei caratteri per le intestazioni.

La macro per definire un'intestazione è .H livello [testo [suffisso]]. Il livello dell'intestazione può variare tra 1 (livello più alto) e 7. Il testo deve essere compreso tra doppi apici se contiene spazi. Il suffisso viene aggiunto al testo nell'intestazione ma non nell'indice; questa caratteristica viene generalmente usata per note a pié di pagina.

Nota: Purtroppo per il suffisso non si può utilizzare la macro \*F ma è necessario numerare manualmente la nota.

La macro .HU serve per creare un'intestazione non numerata. Alcuni esempi:

  .H 1 "Il linguaggio di comandi di troff"
  .H 2 "Comandi fondamentali"
  .H 3 "Paragrafi"
  .HU "Intestazione senza numero"

Si noti che un'eventuale .P dopo un comando .H viene ignorato, perché .H si prende già cura della formattazione e dell'indentazione.

I formati dei vari livelli di intestazione possono essere specificati con grande dettaglio utilizzando alcuni registri, descritti nel seguito.

5.7.1. Tipo di carattere

Il tipo di carattere da utilizzare per le intestazioni si definisce utilizzando il registro .HF, che contiene un numero o un nome per il tipo di carattere di ognuno dei livelli (7 in tutto). Per esempio:

  .ds HF 2 2 2 2 2 2 2

Il numero 1 indica il carattere tondo, 2 il carattere corsivo e 3 il carattere neretto.

Il registro .HP (heading points) stabilisce il corpo del carattere per ciascun livello di intestazione. Per esempio:

  .ds HP 14 12 10 10 0 0 0

Il valore 0 indica il corpo di default.

5.7.2. Altri registri per il controllo delle intestazioni

Un'interruzione di linea viene inserita dopo il titolo per le intestazioni il cui livello è minore o uguale al valore del registro Hb (default 2).

Viene inserita una linea vuota dopo il titolo per le intestazioni il cui livello è minore o uguale al valore del registro Hs (default 2).

Il registro Ej controlla l'inserimento di un salto pagina prima delle intestazioni. Se il valore del registro Ej è maggiore di 0, viene inserito un salto pagina prima dei titoli il cui livello è minore o uguale a Ej. Se Ej è 0, prima dei titoli di livello 1 vengono inserite due righe vuote, prima dei titoli degli altri livelli viene inserita una linea vuota.

I valori numerici dei livelli di intestazione sono contenuti nei registri da H1 a H7.

Tutte le intestazioni il cui livello è minore o uguale al valore del registro Cl vengono inserite nell'indice dei contenuti.

Per caratteristiche più avanzate relative alle intestazioni, in particolare per l'uso delle macro utente HX, HY e ZX si rimanda alla pagina di manuale di mm.

5.8. Elenchi

Il supporto per gli elenchi fornito dal pacchetto mm è eccellente. Tutte le liste iniziano con la macro .LB e terminano con la macro .LE. Gli elementi della lista vengono definiti con la macro .LI.

Si possono definire vari tipi di liste, utilizzando sette macro predefinite che richiamano LB con vari argomenti (probabilmente solo le prime tre fanno parte delle macro standard; le altre sono proprie di groff_mm).

  .AL   Lista a incremento automatico
  .BL   Lista con pallini
  .DL   Lista con trattini
  .ML
  .VL
  .RL
  .BVL

La macro .AL [tipo [indentazione [1]]], definisce l'inizio di una lista a incremento automatico. Il parametro tipo definisce il tipo di numero da utilizzare: 1 = numeri (default), A = lettere maiuscole, a = lettere minuscole, I = numeri romani in maiuscolo, i = numeri romani in minuscolo.

Anche la macro LI accetta un argomento, che viene utilizzato per sostituire il normale contrassegno.

Le liste possono essere annidate; per esempio:

  1.  Primo elemento

  +   Secondo elemento

       i.  Primo elemento annidato

      ii.  Secondo elemento annidato

  3.  Terzo elemento

La lista precedente è stata ottenuta con i seguenti comandi:

   .AL 1
   .LI
   Primo elemento.
   .LI +
   Secondo elemento
   .AL i
   .LI
   Primo elemento annidato.
   .LI
   Secondo elemento annidato.
   .LE
   .LI
   Terzo elemento.
   .LE

Il registro Li controlla l'indentazione delle liste. Il suo valore di default è 6.

5.9. Note, riferimenti e indice del contenuto

Quando nel corpo del testo compare una nota o un riferimento, mm lo memorizza in un registro, producendo le note alla fine della pagina stessa e i riferimenti alla fine del documento. Per reperire il numero della nota corrente si usa la macro \*F; il testo della nota deve essere inserito di seguito, racchiuso tra le macro .FS [etichetta] e .FE.

Nota: il testo della nota racchiuso tra le due macro deve seguire immediatamente l'etichetta o il numero della nota nel testo sorgente (dalla prima riga successiva), per garantire il corretto trattamento della nota, specie nel caso dovesse cadere vicino alla fine di una pagina del documento in uscita.

Per esempio:

   ... esempio di nota\*F.
   .FS
   Questo è il testo della nota che apparirà a pié
   di pagina.
   .FE
   Altro testo ...

Il parametro etichetta della macro FS indica l'etichetta da usare per la nota in sostituzione della numerazione automatica.

I riferimenti vengono trattati in modo simile, eccetto che vengono conservati fino alla fine del documento e, a quel punto, prodotti in uscita in un unico gruppo nell'ordine corretto.

I riferimenti vanno racchiusi tra le macro .RS [etichetta] e .RE. Il numero del riferimento corrente si trova nel registro \*Rf, che può essere usato nel testo in modo analogo a \*F. Se viene specificato il parametro etichetta nel testo che segue si può fare riferimento al numero del riferimento (sic) mediante la stringa \*[etichetta].

Nota: Questa è un'estensione di groff_mm.

Per il posizionamento dei riferimenti nel testo di input valgono le stesse considerazioni fatte per le note a pié di pagina.

5.9.1. Indice del contenuto

Se sulla linea di comando di troff è stata specificata l'opzione -rB1, allora le intestazioni sono state memorizzare ed è possibile richiedere la stampa dell'indice del contenuto includendo la macro .TC alla fine del documento.

Il registro Ci controlla i livelli di indentazione. Deve essere definito specificando le unità di misura, nel modo seguente. Per esempio:

  .ds Ci .25i .5i .75i 1i 1i

Se si genera l'indice del contenuto è importante tenere presente una caratteristica: nei titoli delle intestazioni non devono essere presenti stringhe la cui espansione contiene doppi apici. Pertanto, per esempio, non si possono inserire le stringhe relative alle lettere italiane accentate definite nella sezione sui testi in lingua italiana.

5.10. Intestazioni di inizio e fine pagina

Con le macro mm è molto semplice specificare le intestazioni di inizio e fine pagina. L'intestazione di inizio pagina è generata dalla macro .PH [testo], quella di fine pagina dalla macro .PF [testo]. Il testo deve essere specificato con il seguente formato:

  'parte-sinistra'parte-centrale'parte-destra'.

Le tre parti definiscono il contenuto delle tre sezioni dell'intestazione: la parte sinistra viene allineata a sinistra, la parte centrale viene centrata e la parte destra viene allineata a destra.

Sono disponibili anche altre quattro macro, che richiedono un argomento con lo stesso formato:

  .EH [testo]     even-page header
  .OH [testo]     odd-page header
  .EF [testo]     even-page footer
  .OF [testo]     odd-page footer

Nell'esempio seguente vengono sfruttati alcuni registri predefiniti per scrivere il numero del capitolo, la data e il numero di pagina.

  .EH 'Capitolo \n(H1'' YABU'
  .OH '\n(dy/\n(mo/\n(yr''Revisione 2'
  .PF '' - % - ''

6. Tipi di memorandum

È possibile ottenere diversi tipi di memo utilizzando la macro .MT [tipo]. Il parametro tipo può assumere i seguenti valori:

  0 - memorandum normale; il tipo non viene stampato
  1 - viene stampato "Memorandum for file".
  2 - viene stampato "Programmer's notes".
  3 - viene stampato "Engineer's notes".
  4 - memo in stile "documento in distribuzione".
  5 - documento nello stile di lettera esterna.

Se l'argomento è una stringa vuota il tipo di memo non viene stampato.

Nota: groff_mm ha un metodo molto flessibile per definire il formato del memo, utilizzando le macro .COVER e .COVEND. Vedere la pagina di manuale.

La seguenza di comandi da inserire nel file di input è:

  .TL
  .AU
  .MT

Se si utilizza questa sequenza di comandi all'inizio del documento, alla fine dello stesso si può inserire il comando .SG (signature), per la linea della firma; la macro può avere un argomento con la sigla abitualmente usata per indicare il dattilografo.

Come appena spiegato, l'argomento della macro .MT definisce il tipo di memo da stampare. Le informazioni utili per la stampa del memo vengono fornite usando altre macro, delle quali si sono già viste .TL, e .AU. Nella lista seguente viene data una descrizione più approfondita delle macro utilizzate, che sono:

.AST

Stringa da scrivere al posto di "Abstract" nel sommario.

.ND

Definisce la data; riceve come argomento una stringa compresa tra doppi apici che viene usata al posto della data corrente.

.TL

Titolo.

.AF

Ditta (author's firm).

.AU

Autore (può essere ripetuta più volte).

.AT

Author's title; deve comparire immediatamente dopo .AU. Viene usato solo con .COVER ms.

.AS

Inizio sommario.

.AE

Fine sommario.

.MT

Tipo di memo.

6.1. Tipi di memo 0, 1, 2 e 3

I tipi memo da 0 a 3 utilizzano i seguenti dati: ditta (.AF), titolo (.TL), data (eventualmente definita con .ND), autore/i, sommario (.AS, .AE) preceduto dalla stringa "Abstract", che può essere sostituita con una stringa a piacere definita mediante la macro .AST.

L'intestazione dei tre tipi di memo è identica; l'unica cosa che cambia è il titolo (tipo di memo) che viene stampato dopo il sommario, all'inizio del documento.

6.1.1. Elenco dei destinatari

Utilizzando la coppia di macro .NS [arg [1]] e .NE, è possibile specificare un elenco di destinatari di copie del documento. Il parametro arg specifica il tipo di notazione da stampare:

   nessuno   Copy to
   ""        Copy to
   1         Copy (with att.) to
   2         Copy (without att.) to
   3         Att.
   4         Atts.
   ...
   14        CC

Ecco un esempio di uso:

  .AST "Sommario"
  .ND "2 Gennaio 1998"
  .AF "MySoft"
  .TL
  Titolo del memorandum
  .AU "Federico Lupi"
  .AU "Altro Autore"
  .AS
  Contenuto del sommario
  .AE
  .NS
  Destinatario 1
  Destinatario 2
  Destinatario 3
  .NE
  .MT 3

6.2. Tipo di memo 4

Il tipo memo 4 è quello utilizzato per i documenti ufficiali rilasciati al pubblico e assomiglia molto a quello classico ottenuto con le macro ms.

Questo tipo memo usa i seguenti dati: titolo (.TL, obbligatorio), autore/i (.AU), ditta (.AF, è obbligatorio definirla), sommario (.AS, .AE) preceduto dalla stringa "Abstract", che può essere sostituita con una stringa a piacere definita mediante la macro .AST.

6.3. Tipo di memo 5

Il tipo memo 5 viene definito "lettera esterna"; vengono stampati il titolo (.TL) e la data (eventualmente definita con .ND).

6.4. Sommari

Si possono delimitare parti di testo con le macro .AS [arg [indent]] e .AE per produrre un blocco separato con il titolo Abstract.

Il parametro arg può avere i valori:

0

Se il tipo memo è 4, viene stampata una copertina sulla quale viene messo il sommario, altrimenti il sommario compare all'inizio di pagina 1.

1

Il sommario viene stampato a pagina 1 (solo per .MT 4).

2

Il sommario viene stampato sulla copertina. La copertina viene generata anche se non si specifica il comando .CS.

7. Altri comandi di mm

Questa sezione elenca altri comandi utili di mm che non hanno trovato posto nelle sezioni precendenti:

  .SG         Linea della firma
  .NS         Inizio nota (vedere pagina di manuale)
  .NE         Fine nota
  .CS         Copertina
  .BS         Inizio blocco finale
  .BE         Fine blocco finale
  .1C         Una colonna
  .2C         Due colonne
  .SA         Definisce la giustificazione del margine destro
  .DS         Inizio display
  .DE         Fine display
  .FD         Formato di default delle note a pié di pagina
  .FG         Titolo di figura
  .TS         Inizio tabella (tbl)
  .TE         Fine tabella
  .PS         Inizio figura (pic)
  .PE         Fine figura
  .EQ         Inizio equazione
  .EN         Fine equazione
  .EC         Intestazione d'equazione
  \*(BU       Pallino
  \*F         Numeratore nota a pié di pagina
  \*(DT       Data corrente
  \*(RE       Livello di release di mm

8. Inserimento di disegni

I disegni si effettuano con il programma pic, scrivendo il codice direttamente nel file sorgente troff e delimitandolo con le macro .PS e .PE. Pic deve venire invocato come preprocessore di troff oppure, nel caso di groff, è possibile utilizzare l'opzione -p per chiamare pic automaticamente. Pic elabora il disegno (o i disegni) nel testo e aggiunge alla macro PS due parametri: l'altezza e la larghezza del disegno.

Per evitare che il disegno venga spezzato è opportuno inserirlo tra la coppia di macro .DS e .DE, che definiscono un display. In tal modo si possono anche specificare le opzioni di posizionamento della figura.

Ecco un esempio di sorgente troff con una figura centrata:

  .DS CB
  .PS
  box "pic"; arrow; box "troff"
  .PE
  .FG "Figura di esempio"
  .DE

La figura che si ottiene è la seguente:

Il parametro CB indica a .DS di centrare il blocco. I possibili parametri di DS sono:

  L     nessuna indentazione
  I     indentare del valore specificato nel registro Si
  C     centrare ogni linea
  CB    centrare il blocco
  R     allineare ogni linea a destra
  RB    allineare a destra il blocco

Nell'esempio precedente è stata utilizzata anche la macro .FG, che serve a dare alla figura un titolo e una numerazione automatica.

8.1. Centratura di disegni

I disegni vengono centrati automaticamente, a meno che non siano racchiusi in un display; in questo caso è l'opzione del display a determinare la posizione del disegno.

9. Inserimento di tabelle

Le tabelle si elaborano con il programma tbl, scrivendo il codice direttamente del file sorgente troff, delimitato dalle macro .TS e .TE. Anche le tabelle, come le figure, possono essere racchiuse in un display.

Tbl deve venire invocato come preprocessore di troff oppure, nel caso di groff, è possibile utilizzare l'opzione -t per chiamare Tbl automaticamente.

10. Comandi troff utili con mm

Anche se si utilizza un pacchetto di macro come mm è talvolta necessario inserire direttamente alcuni comandi di troff. Alcuni comandi utili sono:

  \|    spaziatura di 1/6 di em (utile per il corsivo)
  \'    accento acuto
  \`    accento grave
  .so   include il file specificato (es. .so /usr/share/tmac/tmac.m)

11. Testi in lingua italiana

Per poter utilizzare troff con testi in italiano occorre avere alcune avvertenze.

11.1. Sillabazione

Per ottenere la sillabazione italiana con groff è necessario procurarsi il file di sillabazione. Quello di TeX va bene per groff: basta metterlo nella directory che contiene le macro dandogli il nome hyphen.it. Prima di poterlo utilizzare è però necessario modificare il file, conservando solo la parte che si trova tra le due parentesi graffe di "patterns".

A questo punto per abilitare la sillabazione italiana è sufficiente inserire i seguenti due comandi all'inizio del file di input:

  .do hla it
  .do hpf hyphen.it

11.2. Lettere accentate

Il pacchetto di macro mm definisce alcune macro da usare per semplificare la scrittura di lettere accentate. In particolare sono definite le stringhe \*' per generare un accento acuto e \*` per generare un accento grave. Pertanto per ottenere è si scrive e\*`, mentre per ottenere é si scrive e\*'. La lettera È si ottiene scrivendo E\*`.

Per ottenere la lettera ì è necessaria un'ulteriore avvertenza: bisogna utilizzare la `i' senza puntino. Questa caratteristica non è documentata, e forse è propria solo di groff. La sequenza da inserire per ottenere la `i' senza puntino è: \(.i, per cui per ottenere la `i' accentata bisogna scrivere così:

   \(.i\*`

Inoltre sono definite le seguenti stringhe:

    con a\*^ si ottiene â
    con a\*~ si ottiene ã
    con a\*: si ottiene ä
    con c\*, si ottiene ç

In alternativa, per poter scrivere con più comodità le lettere accentate, si possono definire alcune stringhe:

  .ds a \o"a\`"
  .ds e \o"e\`"
  .ds i \o"i\`"
  .ds o \o"o\`"
  .ds u \o"u\`"
  .ds ea \o"e\'"

La frase precedente è stata scritta così:

  Per poter scrivere con pi\*u comodit\*a le ...

11.3. Lettere accentate con groff_char

Come si può vedere, il supporto di troff alle lingue straniere è decisamente spartano e, pertanto, consiglio di dimenticare il supporto offerto dalle macro e di utilizzare al suo posto i caratteri supportati da groff_char (man groff_char).

Per esempio:

  per ottenere à si scrive \(`a
  per ottenere è si scrive \(`e
  per ottenere é si scrive \('e
  per ottenere ì si scrive \(`i
  per ottenere ò si scrive \(`o
  per ottenere ù si scrive \(`u

Groff_char definisce una quantità di altri simboli e non è difficile definire delle macro per vi che generino automaticamente le sequenze opportune quando si premono le lettere accentate sulla tastiera italiana.

12. Estensioni al pacchetto mm: groff_mm

Il pacchetto di macro mm fornito insieme a groff è dotato di alcune comode estensioni. Essendo molto diffuso, può valere la pena di sfruttarle.

Nota: si tenga presente che se si usano estensioni al pacchetto mm ci si può precludere l'utilizzo di alcuni strumenti quali, per esempio, i convertitori automatici di formato quali i filtri per trasformare mm in HTML.

Una prima aggiunta, molto pratica, è la possibilità di definire porzioni di testo in carattere monospaziato senza riempimento delle righe, caratteristica molto utile per inserire, per esempio, listati di programmi. Per ottenere questo effetto si utilizza la coppia di macro .VERBON [flag [punti [font]] e .VERBOFF. Il parametro flag di .VERBON definisce alcune proprietà:

1

Disabilita il carattere di escape. Se non si specifica questo flag il carattere di escape continua a essere interpretato (nel caso di frammenti di programmi C conviene disabilitare il carattere di escape).

2

Aggiunge una linea vuota prima del blocco di testo.

4

Aggiunge una linea vuota dopo il blocco di testo.

8

Stampa le linee del blocco di testo numerandole.

16

Indenta le linee del blocco di testo di 5 n. Questo valore è controllato dalla variabile numerica Verbin.

I valori dell'elenco precedente si possono sommare tra loro, ottenendo l'effetto di "combinare" le rispettive caratteristiche.