Druckaufbereitung mit Ghostscript

Begonnen von Arnold, Mittwoch, 27. September 2017, 10:35

« vorheriges - nächstes »

Arnold

Hallo,

dies ist mein Erfahrungsbericht, wie ich ein kleines Notenheftchen (8 Seiten in DIN A6 Größe) für den Ausdruck auf einem DIN-A4 Laserdrucker aufbereitet habe.

Wie schon gesagt, ich habe die Seitengröße auf DIN A6 eingestellt, sogar wechselnde Seitenränder (two-sided = ##t).
Es waren insgesamt nur 8 Seiten, in zwei bookparts (eine Titelseite und sieben Notenseiten) aufgeteilt, global-staff-size um die 5 mm, und für die Wiederholungszeichen in den Strophentextblöcken habe ich mir extra markup-Funktionen erstellt.

Betriebssystem war Windows, Lilypondversion 2.18.2, zum puzzeln der Einzelseiten dann Ghostscript 8.64 (mit Ghostview zusammen)
Die Kommandozeile, um ein EPS je Seite zu erstellen, habe ich in eine BAT-Datei geschreiben. Anders als ich aus dem Handbuch herauslas, mußte ich noch das »#« hinzufügen:lilypond -dbackend=#'eps Lieder.ly

Beim "analysieren" der EPS-Dateien stellte ich fest, daß alle Fonts in jeder der Einzelseiten-EPS-Datein eingebettet sind - also auch Emmentaler-14 in der Titelseite, auf welcher gar keine Noten sondern nur Text enthalten ist. Und Emmentaler-14 ist zweimal eingebettet!!! Anhand der angegebenen BoundingBox war zu erkennen, daß der Referenzpunkt die obere linke Ecke des Blattes (also Druckränder eingeschlossen) ist, ein Skalieren ist also nicht mehr nötig.

In einer Postscript-Datei habe ich meine Blattvereilung aufgebaut - durch einen "boolean Schalter" wahlweise das Layout visualisiert oder die EPS-Biler eingebettet.%!PS-Adobe-2.0
%%Pages: 2

statusdict begin a4tray end
% Convert to PDF, use additional Option
%  -dAutoRotatePages=/None
% for Ghostscript

/mm { 25.4 div 72.0 mul } def

/Hoehe 297 0.5 mul mm def
/Breite 210 0.5 mul mm def
/SHOWPAGE { showpage } bind def
/showpage { } bind def
true { % EPS einbinden, sonst Positionstext
  /RUN { run } def
} {
  /RUN {
    newpath
    2 -2 moveto
    Breite 2 sub -2 lineto
    Breite 2 sub Hoehe 2 sub neg lineto
    2 Hoehe 2 sub neg lineto
    closepath
    2 setlinewidth stroke
    /Helvetica findfont 20 scalefont setfont
    10 -40 moveto show
  } def
} ifelse

%%Page: 1 1

gsave
Breite Hoehe translate                  % rechts unten
(Lieder-1.eps) RUN
grestore
gsave
0 Hoehe translate                       % links unten
(Lieder-8.eps) RUN
grestore
gsave
Breite 2 mul Hoehe translate 180 rotate % rechts oben
(Lieder-4.eps) RUN
grestore
gsave
Breite Hoehe translate 180 rotate       % links oben
(Lieder-5.eps) RUN % !!
grestore

SHOWPAGE

%%Page: 2 2

gsave
Breite Hoehe translate                  % rechts unten
(Lieder-7.eps) RUN
grestore
gsave
0 Hoehe translate                       % links unten
(Lieder-2.eps) RUN
grestore
gsave
Breite 2 mul Hoehe translate 180 rotate % rechts oben
(Lieder-6.eps) RUN
grestore
gsave
Breite Hoehe translate 180 rotate       % links oben
(Lieder-3.eps) RUN
grestore

SHOWPAGE

Die Größe meiner DIN A6 Einzelblätter habe ich als Postscript-Parameter Hoehe und Breite definiert. Drei Zeilen tiefer legt true fest, daß die selbstdefinierte Funktion RUN das Kommando run ausführt, während bei einem false an dieser Stelle die Prozedur RUN einen "Zielrahmen mit den Namen der einzubindenden EPS-Datei" darstellt.
Als ich die SHOWPAGE-Definitionen noch nicht in der PS-Datei hatte, mußte ich feststellen, daß nur eine einzige Lilypond-Seite je Postscript-Seite dargestellt wird; und im PDF entsprechend viele zusätzliche Seiten erstellt werden. Daher definiere ich als Workaround mein "privates showpage" in Großbuchstaben, und definiere anschließend das "Kleinbuchstaben-showpage" zu einer No-Operation-Funktion um.

Nun mußte ich nur noch feststellen, daß die Ausgabeseiten gegenüber der Ansicht im Ghostview dann in den PDF-Readern (acrobat, sumatraPDF) zum Teil rotiert waren. Bei nur zwei Druckseiten könnte ich ja noch die Umklappregel im Druckdialog anpassen, darüber hinaus wäre das sehr ungemütlich. Aber ich fand heraus, daß beim Ghostscript als weitere Option zur PDF-Erstellung »-dAutoRotatePages=/None« mitzugeben ist, und die Seiten kommen so heraus wie ich sie angelegt habe, also die Seiten nicht rotiert werden weil so viel Strophentext auf dem Kopf steht.

Nochmal zusammengefaßt:

  • Das Handling der eingebetteten Resourcen ist nicht glücklich gewählt, aber es funktioniert. Und der Font Emmentaler-14 ist sogar im PDF zweifach als Embedded Font gelistet!
  • Daß ich das »schowpage« umdefinieren mußte, damit ich alle vier Lilypond-EPS-Seiten auf eine DIN-A4-Seite packen konnte, halte ich für einen Fehler.
  • Ist das auch eine kleiner Bug im Handbuch, daß ich in der Kommandozeile noch ein »#« einfügen mußte?
  • Verhält sich dies unter Linux genauso? Auch in der neuen Version?
  • Wäre solch ein Beispiel etwas für das Hanbbuch?

Arnold

harm6

Hallo Arnold,

im wesentlichen ist das außerhalb meiner Kompetenz, deshalb kann ich auch nur zu wenigen Punkten was sagen.

Aber Du magst an folgendem interessiert sein:
ZitatDas Handling der eingebetteten Resourcen ist nicht glücklich gewählt, aber es funktioniert. Und der Font Emmentaler-14 ist sogar im PDF zweifach als Embedded Font gelistet!
Da gibts ausführliche Diskussionen auf der lily-devel-list und gs-devel-list:
http://lilypond.1069038.n5.nabble.com/Re-gs-devel-Ghostscript-GhostPDL-9-22-Release-Candidate-1-tt205921.html#none
https://ghostscript.com/pipermail/gs-devel/2017-September/date.html
Nicht jeder post ist auf beiden lists einsehbar.

sowie einen aktuellen patch:
https://sourceforge.net/p/testlilyissues/issues/5201/

Zitat
Ist das auch eine kleiner Bug im Handbuch, daß ich in der Kommandozeile noch ein »#« einfügen mußte?
Verhält sich dies unter Linux genauso? Auch in der neuen Version?
Bei mir (Linux) funktioniert
lilypond -dbackend=eps <file.ly>
tadellos. #' einzufügen klappt nicht.
Kannst Du das Problem für windows auf der bug-list melden?

Ich bin auf current master,  i.e. 2.21.0 mit ghostscript 9.18

Gruß,
  Harm

Malte

Zitat von: Arnold am Mittwoch, 27. September 2017, 10:35[...]für die Wiederholungszeichen in den Strophentextblöcken habe ich mir extra markup-Funktionen erstellt.
Es gibt Fonts, die die Wiederholungszeichen

Malte

Zitat von: harm6 am Mittwoch, 27. September 2017, 10:59
ZitatDas Handling der eingebetteten Resourcen ist nicht glücklich gewählt, aber es funktioniert. Und der Font Emmentaler-14 ist sogar im PDF zweifach als Embedded Font gelistet!
Da gibts ausführliche Diskussionen auf der lily-devel-list und gs-devel-list:
http://lilypond.1069038.n5.nabble.com/Re-gs-devel-Ghostscript-GhostPDL-9-22-Release-Candidate-1-tt205921.html#none
https://ghostscript.com/pipermail/gs-devel/2017-September/date.html
Nicht jeder post ist auf beiden lists einsehbar.

sowie einen aktuellen patch:
https://sourceforge.net/p/testlilyissues/issues/5201/
Danke für den Hinweis, das ist auch für mich evtl. interessant :)
Zitat
Bei mir (Linux) funktioniert
lilypond -dbackend=eps <file.ly>
tadellos. #' einzufügen klappt nicht.
Das liegt aber an der Shell, die ' als besonderes Zeichen behandelt.

lilypond -dbackend=#\'eps test.ly

funktioniert.

Arnold

Hallo,

bevor ich dazukomme ein abgespecktes Beispiel zu erzeugen, habe ich schon ein paar "Antworten" selbst gefunden.


  • Im englischsprachigen HTML-Handbuch USAGE (Version 18.2.2) werden die Kommandozeilenoptionen für backend ohne Anführungszeichen »'« aufgelistet, im deutschen PDF-Handbuch aber mit. Ich habe im PDF nachgesehen und wurde so auf die falsche Fährte gesetzt.
  • Das »showpage«-Kommando wird laut Adobes »Encapsulated PostScript File Format Specification« in vielen Programmen, welche eine EPS-Datei erstellen, dort eingefügt. Zum Einbetten in eine Postscriptdatei ist es dann die Aufgabe der darüber liegenden Ebene (als der Postscriptdatei, in welche das EPS eingebettet wird), den showpage-Befehl zu "neutralisieren". Also kein Workaround, sondern übliche Arbeitsweise. Auch Ghostscript fügt das schowpage in die EPS-Datei ein, wenn es eine Seite einer PDF-Datei in eine EPS-Datei konvertiert.
  • Das »AutoRotatePages« in Ghostscript (bei der PDF-Erstellung) ist - so interpretiere ich die gefundenen Einträge im Internet - kein Bug, sondern ein Feature, allerdings ein durchaus kontrovers diskutiertes Feature. Ich habe noch nicht ausprobiert, ob dieses Feature auch zuschlägt, wenn in einer Notendatei sehr viel Text senkrecht geschrieben wird. Falls ja, sollte Lilypond diese Ghostscript-Option zumindest per Lilypond-Option setzen können.

Arnold

harm6

Hallo Arnold,

Zitat
Im englischsprachigen HTML-Handbuch USAGE (Version 18.2.2) werden die Kommandozeilenoptionen für backend ohne Anführungszeichen »'« aufgelistet, im deutschen PDF-Handbuch aber mit. Ich habe im PDF nachgesehen und wurde so auf die falsche Fährte gesetzt.

Dazu habe ich gerade einen patch eingereicht:
https://sourceforge.net/p/testlilyissues/issues/5206/

Zitat
Das »AutoRotatePages« in Ghostscript (bei der PDF-Erstellung) ist - so interpretiere ich die gefundenen Einträge im Internet - kein Bug, sondern ein Feature, allerdings ein durchaus kontrovers diskutiertes Feature. Ich habe noch nicht ausprobiert, ob dieses Feature auch zuschlägt, wenn in einer Notendatei sehr viel Text senkrecht geschrieben wird. Falls ja, sollte Lilypond diese Ghostscript-Option zumindest per Lilypond-Option setzen können.

Dazu:
Zitat
commit 84675bc536af363543bdae1fa422903a977e1ec8
Author: Masamichi Hosoda <[mail-Adresse gelöscht, Harm]>
Date:   Thu Apr 27 21:18:41 2017 +0900

    Issue 5126: Prevent Ghostscript's unwanted automatic page rotation
   
    Ghostscript is "too clever" to rotate pages automatically
    with "majority decision".
    This behavior can cause unwanted page rotation.
   
    This commit prevents such behavior
    by adding option `-dAutoRotatePages=/None` to Ghostscript.

Steht ab LilyPond 2.19.60 zur Verfügung.


Gruß,
  Harm


Arnold

Danke Harm,

ich habe mir auch gestern die neuen Handbücher heruntergeladen, um das »usage.pdf« zu vergleichen bzw. abzugleichen. Beim schnellen überfliegen (der vorversiong) habe ich im ersten Haupkapitel jedenfalls schon ein paar Unterschiede entdeckt, da möchte ich einen Korrekturvorschlag machen.

Arnold.