Le 07/08/2022 à 22:51, M Sun a écrit :
Hi all, I’m writing a sheet targeting two different paper sizes, with some layout adjustments. My goal is to be able to specify (maybe indirectly) the paper size in command line, without changing the lilypond file itself. My initial set up was this: \version "2.23.2" #(set! paper-alist (cons '("kobo" . (cons (* 15.7 cm) (* 20.9 cm))) paper-alist)) #(set-global-staff-size 18) \paper { top-margin = 0 bottom-margin = 0 left-margin = 5 right-margin = 0 } #(set-default-paper-size "kobo") \score { \new Staff {a b c}} As you can see this is a cramped layout for a small paper size. Now I also want a version with a normal layout on us-letter size, so I removed the set-global-staff-size line, and the paper block, and changed the paper size to “letter”. The file became this: \version "2.23.2" #(set! paper-alist (cons '("kobo" . (cons (* 15.7 cm) (* 20.9 cm))) paper-alist)) #(set-default-paper-size "letter") \score { \new Staff {a b c}} These worked. But like I mentioned my goal is to be able to switch between these two setups in command line, without changing the file. My idea was to set a variable in the command line using “-e”, and in the file choose the layout and paper size based on the variable. Here’s my code: \version "2.23.2" #(define (configOutput spec) (cond ((eqv? spec 'letter) (set-default-paper-size "letter")) ((eqv? spec 'kobo) (set! paper-alist (cons '("kobo" . (cons (* 15.7 cm) (* 20.9 cm))) paper-alist)) (set-global-staff-size 18) #{ \paper { top-margin = 0 bottom-margin = 0 left-margin = 5 right-margin = 0 } #} (set-default-paper-size "kobo")) (default nil))) #(use-modules (guile-user)) #(configOutput output-spec) \score { \new Staff {a b c}} Then in the shell I ran a command like this: lilypond -e "(define-public output-spec 'kobo)" test.ly This produced the output with the “kobo” paper size. Or I could change that “kobo” to “letter” and it’d produce with the “letter” paper size. This *almost* worked, except that the \paper block didn’t take effect. This is where I’m lost. How should I make this work?
set!, set-global-staff-size and set-default-paper-size all act through a side effect. On the other hand, \paper doesn't have a side effect, it is a value that you should pass to LilyPond to make its settings integrated into the default settings. Because the principle of cond in Scheme is that the value of the last expression the a cond clause is returned, your \paper is evaluated and just thrown away. You need to put it last. Furthermore, there is a subtlety here that forces to use $ instead of #; see https://lilypond.org/doc/v2.23/Documentation/extending/lilypond-scheme-syntax and https://extending-lilypond.readthedocs.io/en/latest/lily-and-scheme.html#hash-vs-dollar Some minor comments on your code: - eqv? is more general than needed for symbols, you can use the (theoretically) faster eq? - case does the job too, - there is no "default" in Scheme, it's "else", - there is no "nil" (the empty list is '() and the boolean false is #f). You don't need it anyway, just leave that "default" clause out (it will return *unspecified*, a special Guile value that is ignored by LilyPond). Giving: \version "2.23.12" #(use-modules (guile-user)) $(case output-spec ((letter) (set-default-paper-size "letter")) ((kobo) (set! paper-alist (cons '("kobo" . (cons (* 15.7 cm) (* 20.9 cm))) paper-alist)) (set-global-staff-size 18) (set-default-paper-size "kobo") #{ \paper { top-margin = 0 bottom-margin = 0 left-margin = 5 right-margin = 0 } #}))) \score { \new Staff {a b c}} Best, Jean