]> git.donarmstrong.com Git - lilypond.git/blobdiff - scm/framework-eps.scm
Merge branch 'lilypond/translation' of ssh://git.sv.gnu.org/srv/git/lilypond into...
[lilypond.git] / scm / framework-eps.scm
index 9389302e081e3e4b407edc7c57306f5e04d3c393..bd1d9bb1aa497d614470438a7dc7000722aa3034 100644 (file)
@@ -1,8 +1,8 @@
-;;;; framework-ps.scm --
+;;;; framework-eps.scm --
 ;;;;
 ;;;;  source file of the GNU LilyPond music typesetter
 ;;;;
-;;;; (c)  2004 Han-Wen Nienhuys <hanwen@cs.uu.nl>
+;;;; (c) 2004--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
 
 (define-module (scm framework-eps))
 
 
 (use-modules (ice-9 regex)
             (ice-9 string-fun)
-            (ice-9 format)
             (guile)
             (scm framework-ps)
+            (scm paper-system)
+            (scm page)
             (scm output-ps)
             (srfi srfi-1)
             (srfi srfi-13)
             (lily))
 
-(define framework-eps-module (current-module))
+(define format
+  ergonomic-simple-format)
+
+(define framework-eps-module
+  (current-module))
+
+(define (widen-left-stencil-edges stencils)
+  "Change STENCILS to use the union for the left extents in every
+stencil so that LaTeX's \\includegraphics command doesn't modify the
+alignment."
+  (define left
+    (if (pair? stencils)
+       (apply min
+              (map (lambda (stc)
+                     (interval-start (ly:stencil-extent stc X)))
+                   stencils))
+       0.0))
+
+  (map (lambda (stil)
+        (ly:make-stencil
+         (ly:stencil-expr stil)
+         (cons left
+               (cdr (ly:stencil-extent stil X)))
+         (ly:stencil-extent stil Y)))
+       stencils))
 
 (define (dump-stencils-as-EPSes stencils book basename)
-  (define paper (ly:paper-book-paper book))
+  (define do-pdf
+    (member  "pdf" (ly:output-formats)))
+
+  (define paper
+    (ly:paper-book-paper book))
+
   (define (dump-infinite-stack-EPS stencils)
-    (let*
-       ((dump-me (stack-stencils Y DOWN 2.0 stencils)))
-      (dump-stencil-as-EPS paper dump-me basename #t)
-      ))
+    (let* ((dump-me (stack-stencils Y DOWN 2.0 stencils)))
+      (dump-stencil-as-EPS paper dump-me basename #t)))
+
+  (define (dump-counted-stencil stencil-count-pair)
+    "Return EPS filename."
+    (let* ((stencil (car stencil-count-pair))
+          (number (cdr stencil-count-pair))
+          (name (format "~a-~a" basename number)))
+      (dump-stencil-as-EPS paper stencil name
+                          (ly:get-option 'include-eps-fonts))
+      (string-append name ".eps")))
 
   (define (dump-stencils-as-separate-EPS stencils count)
     (if (pair? stencils)
-       (let*
-           ((line (car stencils))
-            (rest (cdr stencils)))
-         (dump-stencil-as-EPS
-          paper
-          line (format "~a-~a" basename count)
-          #f)
-
-         (dump-stencils-as-separate-EPS rest (1+ count))
-         )))
-  
-  (let* ((tex-system-name (format "~a-systems.tex" basename))
-        (texi-system-name (format "~a-systems.texi" basename))
-        (tex-system-port (open-output-file tex-system-name))
-        (texi-system-port (open-output-file texi-system-name)))
-    
-    (display (format "Writing ~a\n" tex-system-name))
-    (display (format "Writing ~a\n" texi-system-name))
-    (dump-stencils-as-separate-EPS stencils 1)
+       (let* ((line (car stencils))
+              (rest (cdr stencils))
+              (system-base-name (format "~a-~a" basename count)))
+         (dump-stencil-as-EPS paper line system-base-name)
+         (if do-pdf
+             (postscript->pdf 0 0
+                              (string-append system-base-name ".eps")))
+         (dump-stencils-as-separate-EPS rest (1+ count)))))
+
+  ;; main body
+  (let* ((write-file (lambda (str-port ext)
+                      (let* ((name (format "~a-systems.~a" basename ext))
+                             (port (open-output-file name)))
+                        (ly:message (_ "Writing ~a...") name)
+                        (display (get-output-string str-port) port)
+                        (close-output-port port))))
+        (tex-system-port (open-output-string))
+        (texi-system-port (open-output-string))
+        (count-system-port (open-output-string))
+        (widened-stencils (widen-left-stencil-edges stencils))
+        (counted-systems  (count-list widened-stencils))
+        (eps-files (map dump-counted-stencil counted-systems)))
+    (if do-pdf
+       ;; par-for-each: a bit faster ...
+       (for-each (lambda (y)
+                   (postscript->pdf 0 0 y))
+                 eps-files))
     (for-each (lambda (c)
-               (display (format "\\includegraphics{~a-~a.eps}%\n"
+               (if (< 0 c)
+                   (display (format
+                             "\\ifx\\betweenLilyPondSystem \\undefined
+  \\linebreak
+\\else
+  \\expandafter\\betweenLilyPondSystem{~a}%
+\\fi
+" c)
+                            tex-system-port))
+               (display (format "\\includegraphics{~a-~a}%\n"
                                 basename (1+ c)) tex-system-port)
-               (display (format "@image{~a-~a}%\n"
+               (display (format "@image{~a-~a}\n"
                                 basename (1+ c)) texi-system-port))
              (iota (length stencils)))
-
-    (display "@c eof" texi-system-port)
-    (display "% eof" tex-system-port)
-    
-    (dump-infinite-stack-EPS stencils))
+    (display "@c eof\n" texi-system-port)
+    (display "% eof\n" tex-system-port)
+    (display (format "~a" (length stencils)) count-system-port)
+    (dump-infinite-stack-EPS stencils)
     (postprocess-output book framework-eps-module
-                       (format "~a.eps" basename) (ly:output-formats)))
-
-(define-public (output-classic-framework
-               basename book scopes fields)
+                       (format "~a.eps" basename) (ly:output-formats))
+    (write-file texi-system-port "texi")
+    (write-file tex-system-port "tex")
+    ;; do this as the last action so we know the rest is complete if
+    ;; this file is present.
+    (write-file count-system-port "count")))
 
-  (dump-stencils-as-EPSes
-   (map ly:paper-system-stencil (ly:paper-book-systems book))
-   book
-   basename))
+(define-public (output-classic-framework basename book scopes fields)
+  (output-scopes scopes fields basename)
+  (if (ly:get-option 'dump-signatures)
+      (write-system-signatures basename (ly:paper-book-systems book) 1))
+  (dump-stencils-as-EPSes (map paper-system-stencil
+                              (ly:paper-book-systems book))
+                         book
+                         basename))
 
 (define-public (output-framework basename book scopes fields)
-  (dump-stencils-as-EPSes (ly:paper-book-pages book)
+  (output-scopes scopes fields basename)
+  (if (ly:get-option 'clip-systems)
+      (clip-system-EPSes basename book))
+  (dump-stencils-as-EPSes (map page-stencil
+                              (ly:paper-book-pages book))
                          book
                          basename))
-  
 
 ; redefine to imports from framework-ps
-(define convert-to-pdf convert-to-pdf)
-(define convert-to-ps convert-to-ps)
-(define convert-to-png convert-to-png)
-(define convert-to-tex convert-to-tex)
-(define convert-to-dvi convert-to-dvi)
+(define convert-to-pdf
+  convert-to-pdf)
+
+(define convert-to-ps
+  convert-to-ps)
 
+(define convert-to-png
+  convert-to-png)