Hi Alex, OK ... first note, I use this on my machine with Ubuntu 12.04 having texlive(2012)-full installed and it does compile - but frescobaldi doesn't recognize the produced PDF (it is not displayed).
I do also get a lot of Warnings from xelatex and from lilypond. The TeX-warnings are a matter of the tex source, wich is produced inside the markup-list-command, and lilypond complains about the EPS-files, which are a little bit to large. The Fontconfig warning might have to do with PATH settings. I included export LD_LIBRARY_PATH=\"\" before the command is executed, so that lilyponds libraries do not interfere with the ones loaded by xelatex. So my question would be: Did the compilation of this file produce a PDF, which is simply not "found" by frescobaldi? Or did it actually fail? The idea is, that guile scheme can run commands with (system "cmd") If that command produces an EPS file, it can be included as an eps-stencil (line 177). If it produces a PDF file, that can be split into one EPS per page with "pdftops -eps" (lines 183-193). The tex-source is wrapped and written to a file "xelatex-<YYYYMMDDhhmmss>.tex" in lines 160-175. Here it is split into two files, so that the example does show up in frescobaldi. I removed the deletion of the xelatex-* working files, so you can start xelatex without lilypond and see, if there are errors on the shell. Cheers, Jan-Peter Am 16.01.2014 01:30, schrieb Alex Loomis: > I got no output and a page full of fontconfig warnings when I ran it. I > left out all but the first since there were about 100 and they're all > nearly identical. > > Starting lilypond 2.19.0 [xelatex-command-list.ly > <http://xelatex-command-list.ly>]... > > Processing `/tmp/xelatex-command-list.ly <http://xelatex-command-list.ly>' > > Parsing... > > This is XeTeX, Version 3.1415926-2.4-0.9998 (TeX Live 2012/Debian) > > restricted \write18 enabled. > > entering extended mode > > Fontconfig warning: > "/usr/local/lilypond/usr/bin/../etc/fonts/conf.d/30-metric-aliases.conf", line > 84: Having multiple <family> in <alias> isn't supported and may not > works as expected > > > > > > On Wed, Jan 15, 2014 at 4:12 PM, Jan-Peter Voigt <jp.vo...@gmx.de > <mailto:jp.vo...@gmx.de>> wrote: > > Hi Kieren, > > I have extracted the latex-markup commands. At the end of the file is a > little example. > There are three ways to produce the latex source: > 1. use a markup-list, which is converted with markup->tex: \xelatex > { ... } > 2. include a file with tex-content: \xelatexInclude #"<filename>" > 3. use a string, probably read from a multiline-comment: \xelatexInclude > #text-variable > > The example only uses the third method, because the first seemed to have > a bug and the second would need an extra file. > The latex code is included between \begin/\end{document}, so that the > markup command can calculate the dimensions for the resulting pdf. The > pdf is then split into eps files for each page, which are then included > in the markup-list. > > Best, Jan-Peter > > On 11.01.2014 21:19, Kieren MacMillan wrote: > > Hi Jan-Peter, > > > >> I usually use [xe]latex, to produce the text needed for a preface or > >> foreword. That way I can use latex input with its own commands - > in this > >> case: \twocolumn - and use hyphenation. > >> It is integrated in https://github.com/jpvoigt/lalily (latex.scm, > >> latex-init.scm). If you are interested, I would extract it. > > YES YES YES > > In other words, yes, I am interested. =) > > > >> If you want format a markup-list - this is, what you are asking > for - I > >> would recommend a markup-list-command. To make the > n-column-markup-list > >> work correctly, you have to extract the available paper-height. I am > >> doing it in the mentioned xelatex-include command, but it often warns > >> about overflows of a few points - I can live with that, because the > >> overflow is minor, but it seems not to be trivial. > >> If you have the printable paper-height, you can build markups per > page. > > If the [xe]latex doesn’t suit — or maybe even if it does — I’ll > try building a “native” function. > > > > Thanks, > > Kieren. > > > _______________________________________________ > lilypond-user mailing list > lilypond-user@gnu.org <mailto:lilypond-user@gnu.org> > https://lists.gnu.org/mailman/listinfo/lilypond-user > >
\version "2.18.0" #(use-modules (ice-9 popen) (ice-9 rdelim) (ice-9 regex) (scm framework-eps) ) % this predicate is not public? #(define (markup-function? x) (and (markup-command-signature x) (not (object-property x 'markup-list-command)))) % calculate available page-height #(define-public (content-height layout props) (let ((mm (ly:output-def-lookup layout 'mm)) (height (ly:output-def-lookup layout 'paper-height)) (perc (chain-assoc-get 'percent props 100)) (tm (ly:output-def-lookup layout 'top-margin)) (bm (ly:output-def-lookup layout 'bottom-margin)) (hom (ly:output-def-lookup layout 'oddHeaderMarkup)) (hem (ly:output-def-lookup layout 'evenHeaderMarkup)) (bom (ly:output-def-lookup layout 'oddFooterMarkup)) (bem (ly:output-def-lookup layout 'evenFooterMarkup))) (define (mupheight mup)(if (markup? mup) (let ((y-ext (ly:stencil-extent (interpret-markup layout props mup) Y))) (- (cdr y-ext)(car y-ext))) 0)) (/ (* (- height (+ tm bm (max (mupheight hom)(mupheight hem)) (max (mupheight hom)(mupheight hem)))) (/ perc 100)) mm) )) #(define-public (glue-list lst glue) "create string from list containing arbitrary objects" (string-join (map (lambda (s) (format "~A" s)) lst) glue 'infix)) % read text from multiline comment %{ %} #(define-public (read-comment port linenr) (let ((rstart (make-regexp "^[^%]*%\\{(.*)$")) (rend (make-regexp "^(.*)%}.*$"))) (define (collect lc status . lines) (let ((line (read-line port 'concat))) (if (string? line) (cond ((< lc linenr) (apply collect (+ lc 1) 0 lines)) ((= status 0) (let ((match (regexp-exec rstart line))) (if (regexp-match? match) (let ((i (match:start match 1))) (apply collect (+ lc 1) 1 (append lines (list (substring line i)))) ) (apply collect (+ lc 1) 0 lines) ))) ((= status 1) (let ((match (regexp-exec rend line))) (if (regexp-match? match) (let ((i (match:start match 1))) (apply collect (+ lc 1) 2 (append lines (list (match:substring match 1)))) ) (apply collect (+ lc 1) 1 (append lines (list line))) ))) (else (apply string-append lines)) ) (apply string-append lines)) )) (collect 1 0) )) % scheme function to read comment: \readComment readComment = #(define-scheme-function (parser location)() (let* ((fll (ly:input-file-line-char-column location)) (file (car fll)) (linenr (cadr fll)) (port (open-file file "r"))) (read-comment port linenr) )) % produce tex source from markup #(define-public (markup->tex mup . mprops) (let ((conc (if (> (length mprops) 0) (car mprops) #f)) (layout (if (> (length mprops) 1) (cadr mprops) #f)) (props (if (> (length mprops) 2) (caddr mprops) '())) (mup? (lambda (m)(or (string? m)(list? m)(markup? m)))) (result "")) (cond ((string? mup) (set! result mup)) ((null? mup) (set! result "")) ((and (pair? mup) (equal? (car mup) concat-markup)) (set! result (markup->tex (cdr mup) #t layout props))) ((and (pair? mup) (equal? (car mup) fromproperty-markup)) (set! result (markup->tex (chain-assoc-get (cadr mup) props "???") conc layout props))) ((and (pair? mup) (equal? (car mup) override-markup)) (set! result (markup->tex (cdr (cdr mup)) conc layout (cons (list (car (cdr mup))) props)))) ((and (pair? mup) (equal? (car mup) page-ref-markup)) (set! result (let* ((table (if layout (ly:output-def-lookup layout 'label-page-table) '())) (pg (assoc-get (car (cdr mup)) table))) (if pg (format "~A" pg) (caddr (cdr mup)))) )) ((and (pair? mup)(markup-function? (car mup))) (let ((proc (get-markup-producer (car mup)))) (if (procedure? proc) (set! result (markup->tex (proc layout props (cdr mup)))) (for-each (lambda (m)(set! result (string-append result (if (or conc (string=? result "")) "" " ") (markup->tex m conc layout props)))) (filter mup? (cdr mup)))))) ((list? mup) (for-each (lambda (m)(set! result (string-append result (if (or conc (string=? result "")) "" " ") (markup->tex m conc layout props)))) (filter mup? mup))) (else (ly:message "~A" mup))) result)) % create eps-markup-list from pdf #(define-public (tex-markup-list layout props pkgs cmd opts m) (let* ((mm (ly:output-def-lookup layout 'mm)) (padstart (chain-assoc-get 'padstart props 2)) (padlength (* mm (chain-assoc-get 'padlength props 0))) (scropts (chain-assoc-get 'scrartcl props "")) (size (chain-assoc-get 'line-width props (ly:output-def-lookup layout 'line-width 10))) ; width of our box in mm (width (let ((tw (chain-assoc-get 'tex-width props #f))) (if tw (begin (set! size (* tw mm)) tw) (/ size mm)))) ; percent of page to use (perc (chain-assoc-get 'percent props)) ; height of our box in mm (height (chain-assoc-get 'tex-height props (- (content-height layout props) (chain-assoc-get 'bottom-gap props (if perc 0 3))))) ; the text to fill into template.tex (text (if (and (string? m) (file-exists? m)) (ly:gulp-file m) (markup->tex m #f #f props))) ; basename of working files (basename (strftime (format "~A-%Y%m%d%H%M%S" cmd) (localtime (current-time)))) ; result of each command (result 0) ; stencil to return (text-stencil empty-stencil) (pages 0) (epslist '())) (define (readpipe port text) (let ((line (read-line port))) (if (not (eof-object? line)) (set! text (readpipe port (string-append (string-append text line) "\n")))) text)) (define (cmd->string cmd) (let* ((port (open-pipe cmd OPEN_READ)) (str (readpipe port "")) (result (close-pipe port))) (if (and (= 0 result)(> (string-length str) 0)) str ""))) (define (loop n callback)(let ((ret (list))) (define (lp i) (if (<= i n) (begin (set! ret (append ret (list (callback i)))) (lp (+ i 1))))) (lp 1) ret)) ; write <basename>.tex (let ((tex-src (format "\\documentclass~A{scrartcl} \\usepackage[paperwidth=~Amm,paperheight=~Amm,margin=~Amm]{geometry} \\usepackage[~A]{babel} ~A \\begin{document} ~A \\end{document} " scropts width height (chain-assoc-get 'tex-margin props 1) (chain-assoc-get 'babel props "ngerman") (glue-list pkgs "\n") text))) (with-output-to-file (format "~A.tex" basename) (lambda () (display tex-src))) ) ; produce pdf (set! result (system (format "export LD_LIBRARY_PATH=\"\" ; ~A ~A \"~A.tex\"" cmd opts basename))) ; how many pages (set! pages (let* ((r (make-regexp "Pages:\\s+([0-9]+)")) (m (regexp-exec r (cmd->string (format "pdfinfo \"~A.pdf\"" basename))))) (string->number (match:substring m 1)))) ; add pages to markup-list (loop pages (lambda (pag)(let ((pagname (format "~A-~A.eps" basename pag))) ; convert page to EPS (set! result (system (format "pdftops -eps -f ~A -l ~A \"~A.pdf\" \"~A\"" pag pag basename pagname))) ; include EPS (set! text-stencil (eps-file->stencil X size pagname)) (if (and (>= pag padstart)(> padlength 0)) (set! text-stencil (ly:stencil-combine-at-edge (ly:make-stencil '() (cons 0 size) (cons 0 padlength)) Y -1 text-stencil 0))) (set! epslist (append epslist (list text-stencil))) ))) ; remove working files ;(system (format "rm -v \"~A\"*" basename)) ; return eps-stencil epslist )) % pdflatex markup-list command #(define-markup-list-command (pdflatex layout props m)(markup-list?) (tex-markup-list layout props `("\\usepackage[utf8]{inputenc}") "pdflatex" "-interaction=batchmode" m)) % pdflatex markup-list include command #(define-markup-list-command (pdflatexInclude layout props m)(string?) (tex-markup-list layout props `("\\usepackage[utf8]{inputenc}") "pdflatex" "-interaction=batchmode" m)) % xelatex markup-list command #(define-markup-list-command (xelatex layout props m)(markup-list?) (let ((font-name (chain-assoc-get 'font-name props #f))) (if (not (string? font-name)) (begin (set! font-name (chain-assoc-get 'font-family props #f)) (if (string? font-name) (ly:warning "using deprecated property 'font-family for '~A'" font-name) (begin (set! font-name (get-registry-val lalily:latex:default-font "DejaVu Serif")) (ly:warning "no font-name defined! trying '~A' ..." font-name) )) )) (tex-markup-list layout props `("\\usepackage[T1]{fontenc}" "\\usepackage{fontspec}" "\\defaultfontfeatures{Mapping=tex-text}" ,(format "\\setmainfont{~A}" font-name) ,@(chain-assoc-get 'packages props '()) ) "xelatex" "-interaction=batchmode" m) )) % xelatex markup-list include command #(define-markup-list-command (xelatexInclude layout props m)(string?) (let ((font-name (chain-assoc-get 'font-name props #f))) (if (not (string? font-name)) (begin (set! font-name (chain-assoc-get 'font-family props #f)) (if (string? font-name) (ly:warning "using deprecated property 'font-family for '~A'" font-name) (begin (set! font-name "DejaVu Serif") (ly:warning "no font-name defined! trying '~A' ..." font-name) )) )) (tex-markup-list layout props `("\\usepackage[T1]{fontenc}" "\\usepackage{fontspec}" "\\defaultfontfeatures{Mapping=tex-text}" ,(format "\\setmainfont{~A}" font-name) ,@(chain-assoc-get 'packages props '()) ) "xelatex" "-interaction=batchmode" m)))
\version "2.18.0" \include "xelatex-markup-list.ly" text = \readComment %{ \twocolumn{} \sloppy{} It was a night to remember. All of a sudden the door opened with dark noise and he, yes HE, came in. We all were waiting for something, but we all didn't know what it was. I was first to say "`Hello Sir"'. -- \textit{silence} --- It seemed like an invasion of something alien. No one knows, if it is evil or just some kind of short intermission. Jan-Peter Voigt, \today{} in Germany %} \markuplist { \override-lines #'(tex-height . 230) % 230mm for tex output \override-lines #'(font-name . "Century Schoolbook L") \xelatexInclude #text }
_______________________________________________ lilypond-user mailing list lilypond-user@gnu.org https://lists.gnu.org/mailman/listinfo/lilypond-user