Ein Kommandozeilen-Werkzeug aus dem GNU-Werkzeugkasten zum Wandeln von
Text nach PostScript, und damit in ein druckbares Format, ist
enscript. Sein
Verhalten wird von Konfigurationseinstellungen und den
Kommandozeilenparametern des jeweiligen Aufrufs bestimmt.
Das Programm ist als Filter konzipiert, sendet seine Ausgabe per
Default jedoch direkt an einen Drucker. Dieses Verhalten ist, wenn
man enscript universell einsetzen will, eher störend. Es empfiehlt
sich, in der Konfiguration "DefaultOutputMethod: stdout"
einzustellen (s.u.), dann schreibt das Programm seine Ausgabe nach
stdout. Im folgenden gehe ich von dieser Einstellung aus.
(Quell)Textdatei FILE in eine PDF-Datei wandeln:
$ enscript FILE | ps2pdf - FILE.pdf
Mit einem PDF-Viewer kann das Resultat FILE.pdf angesehen und von
dort aus ganz oder teilweise gedruckt werden.
Optionen
Enscript hat viele Optionen und Konfigurationsvariablen, mit denen
man auf die Gestaltung der Druckseite Einfluss nehmen kann. Wie
üblich, muss man ein wenig experimentieren bis das Ergebnis den eigenen
Vorstellungen entspricht. Es folgen die Optionen, die ich für
eine Quelltextausgabe als sinnvoll erachte.
Zweispaltige Ausgabe
Wer (wie ich) die Zeilenlänge seiner Quelltexte auf 80 Zeichen
beschränkt, fährt mit einer zweispaltigen Ausgabe im Querformat am
besten:
Header-Information
Der Default-Header ist recht simpel. Man kann ihn mit Option
--header=STRING umdefinieren oder einen sog. "Fancy Header"
auswählen, der die Headerinformation fix-und-fertig vorgibt und die
Seite zusätzlich durch Umrandungen und Trennlinen gestaltet. Welche
Fancy Header zur Verfügung stehen, ist auf der man page nicht
dokumentiert, kann aber anhand der Fancy-Header-Definitionsdateien
ermittelt werden:
$ ls -l /usr/share/enscript/*.hdr
Mir erscheint Fancy Header edd am zweckmäßigsten:
Beim Fancy Header edd steht im Kopf der Seite sämtliche relevante
Information:
- Dateiname
- Letzter Änderungszeitpunkt
- Seitennummer / Gesamtzahl Seiten
- Druckzeitpunkt
Außerdem werden die beiden Spalten des zweiseitigen Drucks durch
eine senkrechte Linie optisch getrennt.
Syntax Highlighting
Programm-Quelltext ist leichter lesbar, wenn Schlüsselworter und
andere Sprachbestandteile hervorgehoben werden. Bei Angabe der Option
--highlight führt enscript ein Syntax-Highlighting durch:
Die Liste der unterstützen Sprachen erhält man mit
$ enscript --help-highlight
UTF-8
Leider beherrscht enscript kein UTF-8. Im Falle einer UTF-8-Datei
müssen wir in ein Encoding wandeln, mit dem enscript umgehen
kann. Das Default-Encoding von enscript ist latin1. Enthält unsere
UTF-8-Quelltext-Datei FILE lediglich Umlaute und andere
Zeichen, die in latin1 enthalten sind, brauchen wir bei enscript
nichts weiter einstellen. Für die Wandlung von UTF-8 nach latin1
schalten wir iconv davor:
$ iconv -f utf-8 -t latin1 FILE | enscript ...
Script
Die oben beschrieben Anforderungen sind bereits zu umfangreich, als
dass sie mit jedem Ausdruck manuell angewendet werden
könnten. Folgendes Bash-Script kapselt sie. Die
Zeichensatz-Konvertierung ist hier mittels einer temporären Datei
(statt einer Pipe) gelöst, damit enscript den Dateinamen und den
letzten Änderungszeitpunkt erfährt.
1 |
#!/bin/bash |
2 |
|
3 |
# NAME |
4 |
# src-to-pdf - Quelltext nach PDF |
5 |
# |
6 |
# USAGE |
7 |
# src-to-pdf LANGUAGE ENCODING SOURCE_FILE PDF_FILE |
8 |
# |
9 |
# DESCRIPTION |
10 |
# Erzeuge zu Quelltext-Datei SOURCE_FILE mit Character-Encoding ENCODING |
11 |
# in Programmiersprache LANGUAGE die (druckbare) PDF-Datei PDF_FILE. |
12 |
# |
13 |
# AUTHOR |
14 |
# Frank Seitz, http://fseitz.de/ |
15 |
|
16 |
set -e |
17 |
|
18 |
if [ $# != 4 ]; then |
19 |
PROG=`basename $0` |
20 |
echo "Usage: $PROG LANGUAGE ENCODING SOURCE_FILE PDF_FILE" |
21 |
exit 10 |
22 |
fi |
23 |
|
24 |
LANG=$1 |
25 |
ENC=$2 |
26 |
IN=$3 |
27 |
OUT=$4 |
28 |
|
29 |
FILE=`basename $IN` |
30 |
TMPDIR=/tmp/enscript |
31 |
TMPFILE=$TMPDIR/$FILE |
32 |
|
33 |
mkdir -p $TMPDIR |
34 |
iconv -f $ENC -t latin1 $IN >$TMPFILE |
35 |
touch --reference=$IN $TMPFILE |
36 |
(cd $TMPDIR; enscript --quiet --output=- --columns=2 --landscape \ |
37 |
--fancy-header=edd --lines-per-page=60 --highlight=$LANG $FILE) \ |
38 |
| ps2pdf - $OUT |
39 |
rm -rf $TMPDIR |
40 |
|
41 |
# eof |
Globale Einstellungen
Für systemglobale Anpassungen sollte man die ergänzende
Datei /etc/enscriptsite.cfg anlegen. Vorteil: Es entstehen keine
Konflikte, wenn durch die Paketverwaltung an der eigentlichen
Configdatei /etc/enscript.cfg Änderungen vorgenommen
werden. Hier meine systemglobalen Anpassungen:
# Site-spezifische Einstellungen
DefaultFancyHeader: edd
DefaultMedia: A4dj
DefaultOutputMethod: stdout
# eof
Links