From 2630603f64a8a1d5a6f74aeace9f421cf2379afd Mon Sep 17 00:00:00 2001 From: =?utf-8?q?Michael=20K=C3=A4ppler?=
Date: Sat, 12 Sep 2009 21:55:17 +0200 Subject: [PATCH] Let default margins depend on paper size. * Make indent and short-indent defaults accessible in paper-defaults-init.ly * Default margins apply to the paper size set by (ly:set-option 'paper-size) and are linearly scaled for other paper sizes * Modify input/regression/page-turn-page-breaking-auto-first-page.ly to work with the new margin sizes --- .../page-turn-page-breaking-auto-first-page.ly | 4 +- .../page-turn-page-breaking-auto-first-page2.ly | 4 +- input/regression/paper-default-margins.ly | 32 ++++++++++ lily/output-def.cc | 4 +- ly/paper-defaults-init.ly | 14 +++- scm/lily-library.scm | 41 ++++++++++++ scm/paper.scm | 66 +++++++++++++++++--- 7 files changed, 147 insertions(+), 18 deletions(-) create mode 100644 input/regression/paper-default-margins.ly diff --git a/input/regression/page-turn-page-breaking-auto-first-page.ly b/input/regression/page-turn-page-breaking-auto-first-page.ly index a9c3f31..0aa5570 100644 --- a/input/regression/page-turn-page-breaking-auto-first-page.ly +++ b/input/regression/page-turn-page-breaking-auto-first-page.ly @@ -17,6 +17,6 @@ number to 2 in order to avoid a bad page turn." \book { \score { - {\repeat unfold 40 {a b c d}} + \relative c' {\repeat unfold 60 {a b c d}} } -} \ No newline at end of file +} diff --git a/input/regression/page-turn-page-breaking-auto-first-page2.ly b/input/regression/page-turn-page-breaking-auto-first-page2.ly index a71c222..7161e0e 100644 --- a/input/regression/page-turn-page-breaking-auto-first-page2.ly +++ b/input/regression/page-turn-page-breaking-auto-first-page2.ly @@ -25,9 +25,9 @@ number to 2 in order to avoid a bad page turn." \book { \score { - { + \relative c' { a b c d R1 - \repeat unfold 26 {a4 b c d} + \repeat unfold 40 {a4 b c d} } } } diff --git a/input/regression/paper-default-margins.ly b/input/regression/paper-default-margins.ly new file mode 100644 index 0000000..4bb9a27 --- /dev/null +++ b/input/regression/paper-default-margins.ly @@ -0,0 +1,32 @@ +\version "2.13.4" + +\header { + texidoc = "Default margin values are accessible in paper-defaults-init.ly + and apply to the default paper size returned by (ly:get-option + 'paper-size). For other paper sizes, they are scaled linearly. + This also affects head- and foot-separation as well as indents." +} + +someNotes = \repeat unfold 30 { c4 d e f } + +\book { + \paper { } + \markup { If the paper size remains default, the margin values from + paper-defaults-init.ly remain unchanged. } + \score { \relative c' { \someNotes \someNotes}} +} + +\book { + \paper { + #(set-paper-size "a6") + } + \markup { For other paper sizes, margins are scaled accordingly. } + \score { \relative c' { \someNotes }} +} + +\book { + \paper { + #(set-paper-size "a2") + } + \score { \relative c' { \someNotes \someNotes \someNotes}} +} diff --git a/lily/output-def.cc b/lily/output-def.cc index 4a1ce21..3461e3c 100644 --- a/lily/output-def.cc +++ b/lily/output-def.cc @@ -136,11 +136,11 @@ Output_def::normalize () SCM scm_paper_width = c_variable ("paper-width"); Real left_margin, left_margin_default; - SCM scm_left_margin_default = c_variable ("left-margin-default"); + SCM scm_left_margin_default = c_variable ("left-margin-default-scaled"); SCM scm_left_margin = c_variable ("left-margin"); Real right_margin, right_margin_default; - SCM scm_right_margin_default = c_variable ("right-margin-default"); + SCM scm_right_margin_default = c_variable ("right-margin-default-scaled"); SCM scm_right_margin = c_variable ("right-margin"); if (scm_paper_width == SCM_UNDEFINED diff --git a/ly/paper-defaults-init.ly b/ly/paper-defaults-init.ly index 4db5459..0345319 100644 --- a/ly/paper-defaults-init.ly +++ b/ly/paper-defaults-init.ly @@ -88,14 +88,20 @@ check-consistency = ##t - top-margin = 5 \mm - bottom-margin = 6 \mm + % This margins apply to the default paper format given by (ly:get-option 'paper-size) + % and are scaled accordingly for other formats + + top-margin-default = 5 \mm + bottom-margin-default = 6 \mm left-margin-default = 10 \mm right-margin-default = 10 \mm - head-separation = 4 \mm - foot-separation = 4 \mm + head-separation-default = 4 \mm + foot-separation-default = 4 \mm + + indent-default = 15 \mm + short-indent-default = 0 \mm first-page-number = #1 print-first-page-number = ##f diff --git a/scm/lily-library.scm b/scm/lily-library.scm index 827fb24..88c2e8d 100644 --- a/scm/lily-library.scm +++ b/scm/lily-library.scm @@ -399,6 +399,24 @@ (cons (cons (car coords) (cadr coords)) (ly:list->offsets accum (cddr coords))))) +(define-public (all-items lst) + "Concatenate all layers of a list into one. + The elements' order is not preserved. + Example: '(2 '('bla' . 'blu') 'p 54) -> + '(2 'p 54 'bla' 'blu')" + (let* ((pairs (filter pair? lst)) + (pair->listpart + (lambda (pair) + (list (car pair) (cdr pair)))) + (deflated-pairs (apply append + (map pair->listpart pairs))) + (deflated-lst + (append + (lset-difference eqv? lst pairs) deflated-pairs))) + (if (null? (filter pair? deflated-lst)) + deflated-lst + (all-items deflated-lst)))) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; numbers @@ -607,6 +625,29 @@ applied to function @var{getter}.") (define-public (symbol-key lst r) (string (symbol->string (car lst)) (symbol->string (car r)))) +(define-public (eval-carefully symbol module . default) + "Check if all symbols in expr SYMBOL are reachable + in module MODULE. In that case evaluate, otherwise + print a warning and set an optional DEFAULT." + (let* ((unavailable? (lambda (sym) + (not (module-defined? module sym)))) + (sym-unavailable (if (pair? symbol) + (filter + unavailable? + (filter symbol? (all-items symbol))) + (if (unavailable? symbol) + #t + '())))) + (if (null? sym-unavailable) + (eval symbol module) + (let* ((def (and (not (null? default)) (car default)))) + (ly:programming-error + "cannot evaluate ~S in module ~S, setting to ~S" + (object->string symbol) + (object->string module) + (object->string def)) + def)))) + ;; ;; don't confuse users with #