Skip to content

Come creare un pdf dalle pagine man di Linux in modo che lo stile sia prestabilito?

Vogliamo mostrarti la migliore soluzione che abbiamo trovato su Internet. Speriamo che ti sia d'aiuto e se vuoi condividere qualsiasi dettaglio che possa aiutarci a migliorare le nostre informazioni, fallo liberamente.

Soluzione:

Se non lo sapete, man sono già state scritte in un sistema di composizione tipografica ancora più vecchio di TeX. Si tratta della famiglia *roff: in diversi momenti della storia, i programmi correlati hanno avuto nomi come RUNOFF, runoff, roff, nroff, troff, ditroff, groffecc. Se si utilizza un sistema Unix-like (una buona ipotesi, visto che si sta chiedendo delle pagine man), è probabile che si abbia groff installati sul vostro sistema e forse con nomi come troff e nroff.

In effetti, man sono scritte in un formato pacchetto di macro per il tipografo *roff. Se si digita man -d mallocsi ottengono alcune informazioni di debug: sul mio computer l'ultima riga mostra il comando che sarebbe stato eseguito, per (impaginare e) visualizzare il file malloc pagina man:

cd '/usr/share/man' && (echo ".ll 18.3i"; echo ".nr LL 18.3i"; /bin/cat '/usr/share/man/man3/malloc.3') | /usr/bin/tbl | /usr/bin/groff -Wall -mtty-char -Tascii -mandoc -c | (/usr/bin/less -is || true)

Questo mostra che il file /usr/share/man/man3/malloc.3 viene passato prima attraverso il file tbl (che si occupa delle tabelle) e poi viene formattato da groff per la visualizzazione sullo schermo. L'"input" /usr/share/man/man3/malloc.3 ha istruzioni come queste:

The
.Fn malloc
function allocates
.Fa size
bytes of memory and returns a pointer to the allocated memory.

Questo è analogo a scrivere (in un ipotetico pacchetto LaTeX) qualcosa come

The functionname{malloc} function allocates functionarg{size} bytes of memory and returns a pointer to the allocated memory.

Questo viene "impaginato" dai preprocessori che terminano con /usr/bin/groff -Wall -mtty-char -Tascii -mandoc -c (definizioni di questi .Fn e .Fa *roff, e il fatto che i nomi delle funzioni debbano essere digitati in grassetto e gli argomenti debbano essere sottolineati, si trovano nel pacchetto di macro relative al manuale) e questo è il motivo per cui finisce sullo schermo con il grassetto e le sottolineature appropriate come:

riga da Malloc Man Page


Quindi Se invece si desidera generare un PDF, è sufficiente cambiare il formato di output. Questo può essere fatto in diversi modi (purtroppo ci sono alcune differenze nell'output, quindi si consiglia di provare ciascuno di essi e scegliere quello che piace di più):

man -t malloc > malloc.ps
ps2pdf malloc.ps

oppure (sì, esistono programmi diversi da TeX che possono generare file DVI!)

groff -T dvi -m mandoc '/usr/share/man/man3/malloc.3' > malloc.dvi
dvipdfmx malloc.dvi

oppure:

groff -T ps -m mandoc '/usr/share/man/man3/malloc.3' > malloc.ps
ps2pdf malloc.ps

oppure, su Linux, potrebbe essere necessario:

zcat '/usr/share/man/man3/malloc.3.gz' | tbl | groff -T ps -m mandoc > malloc.ps
ps2pdf malloc.ps

o varianti in cui si utilizza un convertitore diverso da PS a PDF o da DVI a PDF. Poi si può includere il PDF direttamente nel documento LaTeX; su questo sito si possono cercare molti modi per farlo. Se non si gradiscono i margini di pagina, le lunghezze delle righe, ecc.

Un'altra alternativa è quella di utilizzare l'opzione mandoc che comprende il formato sorgente dei file man:

zcat '/usr/share/man/man3/malloc.3.gz' | mandoc -T pdf > malloc.pdf

o

zcat '/usr/share/man/man3/malloc.3.gz' | mandoc -T html > malloc.html
# convert from html to pdf or to latex in your preferred way

Si noti che una conversione in html apre diverse possibilità di conversione in LaTeX. Ad esempio, si può usare pandoc. Ecco un esempio che corrisponde ad alcuni aspetti della visualizzazione nella vostra schermata:

  • tutto il testo in grassetto deve essere visualizzato in rosso (come evidentemente fa il vostro terminale)
  • lo sfondo non è bianco
  • al posto del corsivo, vengono usate le sottolineature (il vostro terminale lo fa perché non ha un carattere corsivo; potete valutare se volete farlo anche in PDF: le sottolineature sono di solito considerate una cattiva tipografia)

Creare mancolours.tex contenente:

usepackage{pagecolor}

% Set background colour (of the page)
definecolor{weirdbgcolor}{HTML}{FCF4F0}
pagecolor{weirdbgcolor}

% Make bold text appear in a particular colour
definecolor{boldcolor}{HTML}{6E0002}
letrealtextbf=textbf
renewcommand{textbf}[1]{textcolor{boldcolor}{realtextbf{#1}}}

% Use underlines instead of emphasis (ugh)
renewcommand{emph}[1]{underline{#1}}

% % Use fixed-width font by default
% renewcommand*familydefault{ttdefault}

e poi:

zcat '/usr/share/man/man3/malloc.3.gz' | mandoc -T html > malloc.html
pandoc -s -o malloc.tex --include-in-header=mancolours.tex malloc.html
pdflatex malloc.tex

Questo produce cose come:

abbinare attentamente lo screenshot


Infine, se nessuna di queste soluzioni è soddisfacente, si può consultare il sorgente della pagina man e scrivere il proprio strumento per tradurre le macro *roff in qualsiasi macro LaTeX si desideri come equivalenti. Non ce ne sono molte, quindi dovrebbe essere ragionevolmente fattibile. (Ci sono alcuni script online in cui sono stati scritti traduttori simili, ma ne ho provati un paio e nessuno ha funzionato abbastanza bene. Quindi sarebbe meglio scriverne uno proprio). Si può anche considerare di operare sull'output di mandoc -Thtml o mandoc -Ttree, se li trovate più semplici.


Un'altra opzione se si vuole che l'output del terminale corrisponda esattamente alla formattazione, consiste nel riversarlo in un file insieme alla formattazione. Quando si esegue man mallocil pager invocato è probabilmente qualcosa di simile a less. Se si scarica su un file tutto ciò che viene visualizzato e si apre il file con un editor decente, si vedrà come lo fa il terminale:

 The m^Hma^Hal^Hll^Hlo^Hoc^Hc() function allocates _^Hs_^Hi_^Hz_^He bytes of memory and…

(il carattere effettivo nel file è il byte 8, io l'ho cambiato con i due caratteri ^H in modo da poterlo vedere). Quindi: per rendere un carattere in grassetto, stampa il carattere, poi ^He poi di nuovo il carattere. Per rendere qualcosa sottolineato, viene stampato un _e poi ^H e poi il carattere. (Questo ha senso se si immagina che ^H agisca come se si muovesse all'indietro e che la sovrastampa di un carattere su se stesso lo renda in grassetto: in effetti, storicamente le cose funzionavano così). Inoltre, vengono applicate le preferenze del terminale per la visualizzazione dei caratteri in grassetto e sottolineati.

Ora che avete questo file, potete estrarre la formattazione in esso contenuta in un formato adatto a LaTeX. Per esempio, con il seguente script Python le trasformo in bold{...} e underline{...} rispettivamente (man malloc si dà il caso che non contenga backslash, ma se così fosse probabilmente si dovrebbero sostituire anche quelli):

import re
import sys

def parseFormatting(text):
    """Detects 'bold' and 'underlined' characters in the output to a terminal."""
    chars = [(c, '') for c in text]
    while True:  # Detect bold characters
        m = re.search('(.)x08\1', ''.join(c[0] for c in chars))
        if not m: break
        s = m.start()
        chars[s : s + 3] = [(chars[s + 2][0], 'bold')]
    while True:  # Detect underlined characters
        m = re.search('_x08.', ''.join(c[0] for c in chars))
        if not m: break
        s = m.start()
        chars[s : s + 3] = [(chars[s + 2][0], 'underline')]
    i = 0
    while i < len(chars):  # Collapse runs of identical formatting (for efficiency later)
        j = i
        while j < len(chars) and chars[j][1] == chars[i][1]: j += 1
        chars[i : j] = [(''.join(chars[k][0] for k in range(i, j)), chars[i][1])]
        i += 1
    return chars

def parseFileReplaceFormatting(filename):
    text = open(filename, 'rb').read().decode('utf-8').split('n')
    newtext = ''
    for line in text:
        for c in parseFormatting(line):
            if c[1] == '':
                newtext += c[0]
            elif c[1] == 'bold':
                newtext += '\bold{%s}' % c[0]
            elif c[1] == 'underline':
                newtext += '\underline{%s}' % c[0]
            else: assert False, ('Unknown formatting', c[1], 'for', c[0])
        newtext += 'n'
    return newtext

if __name__ == '__main__':
    infilename = sys.argv[1]
    outfilename = sys.argv[2]
    updated = parseFileReplaceFormatting(infilename)
    with open(outfilename, 'wb') as f:
        f.write(updated.encode('utf-8'))

Quindi, dopo aver eseguito lo script di cui sopra con qualcosa di simile a:

python malloc.man.less malloc.man.less.py2

è possibile elaborare (input) il file risultante con TeX. Se lo si desidera, si possono anche conservare le interruzioni di riga e qualsiasi sillabazione e giustificazione rozza fatta dal terminale! (Naturalmente in questo modo si perdono tutti i vantaggi del bellissimo algoritmo di interruzione di riga di TeX, ma si ottiene un'esatta corrispondenza con l'output del terminale). È sufficiente assicurarsi che la larghezza delle pagine e quella del terminale siano approssimativamente compatibili:

documentclass{article}

usepackage[paperwidth=11in, textwidth=10in, textheight=4in, paperheight=5in]{geometry}

usepackage{fontspec}
setmainfont{Consolas}

usepackage{xcolor}
% Set background colour (of the page)
definecolor{weirdbgcolor}{HTML}{FCF4F0}
usepackage[pagecolor=weirdbgcolor]{pagecolor}
% Make bold text appear in a particular colour
definecolor{boldcolor}{HTML}{6E0002}
newcommand{bold}[1]{textcolor{boldcolor}{textbf{#1}}}

begin{document}
% Foreground colour
definecolor{fgcolor}{HTML}{A57716}
color{fgcolor}

defnextline{nullpar} % null so that a blank line in input (two consecutive newlines) becomes an empty paragraph.
{catcode`^^M=active def^^M{nextline} catcode`#=12 catcode`_=12 catcode32=12relaxinput{malloc.man.less.py2}}

end{document}

Pagina 1 dell'output generato dal documento sopra tex

(Si può dire che l'output qui sopra è stato generato da TeX per via del numero di pagina nero in basso).

Può essere man2html più pandoc potrebbe essere un semplice buon inizio:

$ zcat '/usr/share/man/man3/malloc.3.gz' | man2html > malloc.html
$ pandoc -s -f html -t latex  malloc.html -o malloc.tex

Ma se non avete bisogno di modificare il sorgente LaTeX, potete esportare direttamente in PDF:

$ pandoc -f html -t latex malloc.html -o malloc.pdf

MWE

Poi, con un nuovo preambolo (e la rimozione di alcune prime righe):

MWE

documentclass[10pt]{hitec}
usepackage[tmargin=.5in]{geometry}
usepackage[english]{babel}
settextfraction {1}
setlengthleftmarginwidth{4em}
setlengthtextwidth{.84paperwidth}
usepackage[T1]{fontenc}
usepackage[utf8]{inputenc}
usepackage[colorlinks]{hyperref}
usepackage{longtable,booktabs}
usepackage{parskip}
setlength{parskip}{6pt plus 2pt minus 1pt}
setlength{emergencystretch}{3em}  % prevent overfull lines
setcounter{secnumdepth}{0}
usepackage{xcolor}
definecolor{texto}{HTML}{801c35}
definecolor{fondo}{HTML}{FDF6F3}
definecolor{textob}{HTML}{BB8B04}
pagecolor{fondo}color{textob}
letoldbfseriesbfseries
defbfseries{color{texto}oldbfseries}
deftextbf#1{textcolor{texto}{oldbfseries #1}}
pagestyle{empty}
title{Man page of MALLOC}

begin{document}

section{MALLOC}label{malloc}
subsection{NAME}label{name}

malloc, free, calloc, realloc - allocate and free dynamic memory

... % remaining text is not changed 

end{document}

Ricordati di diffondere questa sezione se hai raggiunto il successo.


Tags : / /

Utilizzate il nostro motore di ricerca

Ricerca
Generic filters

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.