Autor Thema: PDFs mit und ohne point-and-click gemeinsam erstellen  (Gelesen 1515 mal)

Arnold

  • Member
PDFs mit und ohne point-and-click gemeinsam erstellen
« am: Mittwoch, 6. März 2013, 09:19 »
Hallo,

wen ein »Hacker der alten Schule« sich daran stört, daß er nach dem Erstellen seiner PDF die Kompilation nochmals mit \pointAndClickOff durchführen muß, anschließend doch noch einen Fehler findet, und dann, um bequem an die zu korrigierende Stelle zu gelangen, erstmal erneut mit \pointAndClickOn das PDF neu erstellt, dann kann ein solcher »Patch zur Anpassung des Applikationsverhaltens selbst genutzter Programme an die Einbettung in den lokalen Prozessablauf« herauskommen (auch wenn die »Broschüren-Format-Endstufe« darin fehlt):
! Lilypond 2.17.12/usr/share/lilypond/current/scm/backend-library.scm

  (define-public (postscript->pdf paper-width paper-height name)
+  (define (filter-pnc from-name to-name)
+  ;;  allmost a `grep -v "^.* (textedit://.*) mark_URI$" name.ps > name-L.ps`
+   (let* ((p-in (open-file from-name "rb"))
+          (p-out (open-file to-name "wb"))
+          (line-count 0)
+          (match-count 0))
+     (while (not (eof-object? (peek-char p-in)))
+      (let ((ps-line (read-line p-in 'concat)))
+       (set! line-count (1+ line-count))
+       (if (and (string-suffix? ") mark_URI\n" ps-line)
+                (string-contains ps-line " (textedit://"))
+        (set! match-count (1+ match-count))
+        (display ps-line p-out))))
+    (close-port p-in)
+    (close-port p-out)
+    ;(for-each display (list "PS file has " match-count " matches in " line-count " lines.\n"))
+   ))
    (let* ((pdf-name (string-append
                      (dir-basename name ".ps" ".eps")
                      ".pdf"))
+          (l-pdf-name (string-append
+                     (dir-basename name ".ps" ".eps")
+                     "-L.pdf"))
+          (is-pnc (ly:get-option 'point-and-click))
           (is-eps (string-match "\\.eps$" name))
           (*unspecified* (if #f #f))
           (cmd
            (remove (lambda (x) (eq? x *unspecified*))
            (list
                 (search-gs)
                 (if (ly:get-option 'verbose) *unspecified* "-q")
                 (if (or (ly:get-option 'gs-load-fonts)
                         (ly:get-option 'gs-load-lily-fonts)
                         (eq? PLATFORM 'windows))
                     "-dNOSAFER"
                     "-dSAFER")
 
                 (if is-eps
                     "-dEPSCrop"
                     (ly:format "-dDEVICEWIDTHPOINTS=~$" paper-width))
                 (if is-eps
                     *unspecified*
                     (ly:format "-dDEVICEHEIGHTPOINTS=~$" paper-height))
                 "-dCompatibilityLevel=1.4"
                 "-dNOPAUSE"
                 "-dBATCH"
                 "-r1200"
                 "-sDEVICE=pdfwrite"
-                (string-append "-sOutputFile=" pdf-name)
+                (string-append "-sOutputFile=" (if is-pnc l-pdf-name pdf-name))
                 "-c.setpdfwrite"
                 (string-append "-f" name)))))
 
+     ;(for-each display (list "point-and-click = " is-pnc "\n"))
+     (if is-pnc
+      (let* ((ps-l-name (string-append (dir-basename name ".ps" ".eps") "-L.ps"))
+             (cmd-l
+              (remove (lambda (x) (eq? x *unspecified*))
+              (list
+                (search-gs)
+                (if (ly:get-option 'verbose) *unspecified* "-q")
+                (if (or (ly:get-option 'gs-load-fonts)
+                        (ly:get-option 'gs-load-lily-fonts)
+                        (eq? PLATFORM 'windows))
+                    "-dNOSAFER"
+                    "-dSAFER")
+
+                (if is-eps
+                    "-dEPSCrop"
+                    (ly:format "-dDEVICEWIDTHPOINTS=~$" paper-width))
+                (if is-eps
+                    *unspecified*
+                    (ly:format "-dDEVICEHEIGHTPOINTS=~$" paper-height))
+                "-dCompatibilityLevel=1.4"
+                "-dNOPAUSE"
+                "-dBATCH"
+                "-r1200"
+                "-sDEVICE=pdfwrite"
+                (string-append "-sOutputFile=" pdf-name)
+                "-c.setpdfwrite"
+                (string-append "-f" ps-l-name)))))
+       ;; it is a cross over output:
+       ;;  I remove the "^.*(textedit://.*) mark_URI$" from 'name.ps' into 'name-L.ps',
+       ;;  but I build 'name.pdf' from 'name-L.ps' and 'name-L.pdf' from 'name.ps'.
+       (ly:message (_ "Converting to `~a'...\n") pdf-name)
+       (filter-pnc name ps-l-name)
+       (ly:system cmd-l)
+       (if (ly:get-option 'delete-intermediate-files) (delete-file ps-l-name))
+       (ly:message (_ "Converting to `~a'...\n") l-pdf-name)
+       (ly:system cmd))
+      (begin
+       (ly:message (_ "Converting to `~a'...\n") pdf-name)
+       (ly:system cmd)))))
-     (ly:message (_ "Converting to `~a'...\n") pdf-name)
-     (ly:system cmd)))

Ich werde das ganze wohl noch etwas umstricken. Ich stelle mir das so vor:
Ist PointAndClick aktiviert, dann ...
   (1) endet der Basisname des Ergebnisses auf »-L« (Großbuchstabe!!!),
   (1.1) dann erstelle zusätzlich eine PS und eine PDF-Datei (ohne -L im Dateinamen) ohne PointAndClick
   (1.2) ansonsten hänge an den Basisnamen von resultierender PS und PDF-Datei das »-L« an,
           und erstelle eine PS und eine PDF-Datei (im Originalnamen) ohne PointAndClick
Ist PointAndClick deaktiviert, dann (2) alles wie bisher gehabt.

Methode 1.1 sollte für Anwendungen in »Entwicklungsumgebungen« (z. Bsp. Frescobaldi) geeignet sein.
Methode 1.2 ist für meine Kommandozeilen-Kompilation besser geeignet, wenn ich als »Nachbrenner« aus der PS-Datei noch eine
Broschürendruck-PDF-Datei erstelle.
Allgemein gültig bleibt dann: »*-L.PS« und »*-L.PDF« enthalten die PointAndClick-Links, die anderen enthalten diese nicht.

Arnold