Newsgroup: it.comp.os.linux.iniziare
Titolo: Visualizzazione testo formattato con groff

Sto cercando di capire un po' di più sulla formattazione del
testo con groff, nroff, troff e parenti.
In realtà stavo cercando qualcosa per imparare a scrivere una
pagina di manuale da usare con man.
Ne ho approfittato partendo dal giacomini per approfondire un
attimo e è saltato fuori che praticamente le man pages sono
scritte con un semplice codice che è in grado di essere
interpretato da programmi appunto come groff, nroff ecc, per
rendere una pagina formattata coerentemente con canoni
prestabiliti.
http://a2.pluto.it/a2660.htm#almlindex11581
La questione delle manpages è un po' più complessa nella teoria
visto che non si parla di semplici istruzioni codificate ma di
"macro", poi all'atto pratico è in definitiva la stessa cosa.
Ma giusto perchè ho deciso di approfondire un pelo seguendo il
giacomini e il naso, vorrei proporvi un esempio semplicissimo che
esula totalmente dalle pagine di manuale e rispettive macro.
=================
Si vuole scrivere il seguente testo (che ho chiamato first) e
soprattutto stamparne una versione foemattata puramente testuale
su un semplice file di testo visualizzabile tranquillamente cone
cat less o altro.
Ecco il testo sorgente:
$ cat first
.ft B
questo e grassetto
.ft
questo no
$ groff -Tascii first|col -b> out.txt
$ less out.txt 
ed ecco cosa ottengo a video:
1mquesto e grassetto 22mquesto no
=============
1- è possibile fare quello che sto cercando di fare?
2- dove sbaglio?
grazie in anticipo, è solo a scopo di curiosità e apprendimento,
ma sarei veramente grato se poteste spiegarmi la questione.  :-)

 2- dove sbaglio?
Vedi sopra.
Roberto Deboni

 Vedi sopra.
Finalmente mi dai del tu! :-D
Contnuiamo così allora  ;-)

Ho notato un'altro aspetto particolare relativo più nello
specifico alle pagine di manuale:
se diamo per esempio
man groff
appare a terminale la pagina di manuale di groff.
Se ora ridimensioniamo quel terminale, pensiamo ad un terminale
virtuale grafico che sta girando sotto X in una finestra...bene,
rimpiccioliamo un po' quella finestra in larghezza.
Ora ridiamo il man groff di cui sopra.
Osservo che il formato  giustificato dei paragrafi e l'eleganza
della pagina resta.
Stessa cosa se allarghiamo il terminale: anche la pagina di man
si allarga ma la giustificazione resta.
Una guida consigliava di visionare per verifica le proprie pagine
di manuale col seguente comando:
nroff -man myprogram.1 | less
la guida si riferiva alla stesura di una man-page per il generico
programma myprogram.
Io allora ho pensato di visualizzare la pagina di manuale per
esempio di groff usando invece del programma man, direttamente
loscript nroff:
zcat /usr/man/man1/groff.1.gz | nroff -man |less
Ma...con sorpresa ho notato che la larghezza della formattazione
è fissa: non s'adatta alla pagina.
Se infatti rimpicciolisco il terminale e dò nuovamente il comando
sopra, salta tutta la giustificazione del testo non adattandosi
alla nuova dimensione del terminale virtuale.
Perchè?
Io ne ho dedotto il fatto che:
1- il programma man è corrispondente a "nroff -man |less" ma a
   meno di una opzione o un passagio ulteriore che magari utilizza
   qualche pre o postprocessore in grado di adattare la pagina alla
   larghezza del terminale.
2- quale sia questa differenza non l'ho capito e non riesco a
   trovarlo.
   Lo chiederei a voi:
quale comando che sfrutta groff e le sue opzioni (o nroff) è
equivalente al comando man?
In particolare come preservare la resa grafica della
giustificazione del testo in terminali a larghezza variabile?
Ovvero come garantire un autoresize?
Brancolo nel buio e le informazioni che riesco a trovare in rete
sono decisamente poche...non so se per colpa mia o reale
scarsità.  :-|

       dell'implementazione, una o entrambe le
Penso sia una traduzione delle pagine di manuale per
ubuntu/debian.
Ok, quindi l'imputato è ioctl che a quanto pare è una funzione,
oppure la variaile $COLUMNS che effettivamente ho controllato:
allargando o stringendo la finestra di terminale, questa
variabile cambia.
Ora, la domanda diventa:
come forzare groff o chi per esso a stampare il testo frmattato
in modo aderente alla larghezza del terminale in uso?
Forse con ancora un po' di *man groff* si risolve...  ;-)

 Forse con ancora un po' di *man groff* si risolve...  ;-)
Forse ho trovato ciò che stavo cercando.
Non so se è la soluzione migliore o più corretta, nel man non vi
ho capito molto, si tratta del "man groff_man" e l'opzione in
questione è
-rLL=line-length
inizialmente ho pensato di usare la variabile $COLOUMN per
ottenere un valore della larghezza del terminale e decidere una
larghezza opportuna per la resa della pagina formattata.
Qualcosa del tipo:
larghezza=$((90*$COLUMNS/100)); cat $pagina | groff -rLL=$larghezza ...
Poi ho buttato giù uno script di bash e la variabile $COLUMNS
dava problemi...così ho usato il comando
tput cols
per definire la larghezza del terminale. Ecco cosa ne è venuto
fuori.
=============================================================
#!/bin/bash
width=$((90*$(tput cols)/100))
PAG=${PAG:-$1}
[ ! -f $PAG ] && echo "Error: $PAG File not found" && exit 1
if file $PAG| grep "gzip compressed data" > /dev/null 2>&1
then
   zcat $PAG  | groff -rLL=${width}n -Tlatin1 -mandoc |less
 else
   cat $PAG  | groff -rLL=${width}n -Tlatin1 -mandoc |less
fi
===========================================================
Come vedete supporta anche l'estrazione nel caso la pagina sia
compressa con gzip.
Va fatta un'ossevazione che naturalmente non avevo considerato
all'inizio:
lo script sopra usa il set di macro -mandoc per cui serve per
vedere pagine che usano tali comandi macro.
Così come pure l'opzione -rLL è propria dell'utilizzo delle 
macro mandoc.
l'amara considerazione è che lo script sopra ha un utilità nulla,
Valore didattico a parte.
Infatti (e non lo sapevo) man è in grado di lavorare anche su
singoli file, basta dargli il percorso del file.
per esempio se scrivo una pagina man, come fare a visualizzarla
prima di metterla nella directory delle manpages?
In parecchie guide si trovano acrobatici comandi nroff groff
troff ecc ecc.
Invece la via più semplice è usare man.... :-|  !!! >:-o
Già, capirlo dopo aver sbattuto la testa su groff e fratelli non
è il massimodella vita ma pazienza...
se usiamo
man programma
lui cerca tra le pagine di manuale e no troverà quella scritta da
noi che magari è in una subdir della nostra home directory.
...Ma se diamo
man ~/$path-to/$mia_pagina
vedremo la nostra bella pagina formattata come qualsiasi altra
pagina di manuale correttamente installata.
Penso proprio che questo topic sia poco interessante e poco
frequentato altrimenti l'idea sarebbe saltata fuori da qualcuno
che ha dovuto scrivere pagine man.
In effetti non è un argomento "alla moda" e sono compresibili
le poche risposte...
D'altra parte, come in altre mie vicissitudini "informatiche" e
non, si è rivelato utile, non tanto lo scopo raggiunto, quanto
l'esperienza acquisita per raggiungerlo.
Somma tutto fa brodo....  :-D



Ciao Johnny!
Ti ricordi di me? Mi hai " guidato" nella configurazione della connect card
con ubuntu 8.4, qualche mese fa'....
Ho un porblema simile, adesso...e l'ho postato in questo Group 5 minuti
fa': 
"Lanciando la connessione da WVDIAL mi appare questa sequenza:
--> WvDial: Internet dialer version 1.60
--> Cannot get information for serial port.
--> Initializing modem.
--> Sending: ATZ
OK
--> Sending: ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0
OK
--> Sending: AT+cgdcont=1,"IP","
ibox.tim.it
"
OK
--> Modem initialized.
--> Sending: ATM1L3DT<*99#>
--> Waiting for carrier.
OK
--> Timed out while dialing.  Trying again.
--> Sending: ATM1L3DT<*99#>
--> Waiting for carrier.
OK
E va avanti così ad oltranza....qualcuno sa come fare?
uso una Connect Card SIERRA WIRELESS 875 e questa è la configurazione di
WVDIAL:
[Dialer Defaults]
Init1 = ATZ
Init2 = ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0
Init3 = AT+cgdcont=1,"IP","
ibox.tim.it
"
Dial Command = ATM1L3DT
Modem Type = Analog Modem
Phone = <*99#>
ISDN = OFF
Password = <0000>
New PPPD = yes
Username = <tim>
Modem = /dev/ttyUSB0
Baud = 460800