lilypond-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Paper default margins


From: Michael Käppler
Subject: Re: Paper default margins
Date: Mon, 26 Oct 2009 07:52:50 +0100
User-agent: Thunderbird 2.0.0.12 (X11/20071114)

Hi Neil,
I hope I've lost nothing.

Regards,
Michael
>From aa34f02a9eb85aaa39d3ff45f31597d279330461 Mon Sep 17 00:00:00 2001
From: =?utf-8?q?Michael=20K=C3=A4ppler?= <address@hidden>
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 +-
 input/regression/paper-default-margins-a6.ly       |   24 +++++++
 input/regression/paper-default-margins-def.ly      |   23 +++++++
 input/regression/paper-margins-consistency.ly      |    4 +-
 input/regression/paper-margins-left-margin.ly      |    4 +-
 input/regression/paper-margins-line-width.ly       |    4 +-
 input/regression/paper-margins-no-checks.ly        |    4 +-
 input/regression/paper-margins-overrun.ly          |    4 +-
 input/regression/paper-margins-right-margin.ly     |    4 +-
 input/regression/paper-margins.ly                  |    4 +-
 lily/output-def.cc                                 |    4 +-
 ly/paper-defaults-init.ly                          |   14 +++-
 scm/lily-library.scm                               |   37 +++++++++---
 scm/paper.scm                                      |   66 +++++++++++++++++---
 14 files changed, 169 insertions(+), 31 deletions(-)
 create mode 100644 input/regression/paper-default-margins-a6.ly
 create mode 100644 input/regression/paper-default-margins-def.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/paper-default-margins-a6.ly 
b/input/regression/paper-default-margins-a6.ly
new file mode 100644
index 0000000..163a9bf
--- /dev/null
+++ b/input/regression/paper-default-margins-a6.ly
@@ -0,0 +1,24 @@
+\version "2.13.7"
+
+\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 }
+
+\paper {
+  #(set-paper-size "a6")
+}
+
+\book {
+  \markup { For other paper sizes, margins are scaled accordingly. }
+  \score {
+    \relative c' {
+      \someNotes
+    }
+  }
+}
+
diff --git a/input/regression/paper-default-margins-def.ly 
b/input/regression/paper-default-margins-def.ly
new file mode 100644
index 0000000..82afc4d
--- /dev/null
+++ b/input/regression/paper-default-margins-def.ly
@@ -0,0 +1,23 @@
+\version "2.13.7"
+
+\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 }
+
+\paper { }
+
+\book {
+  \markup { If the paper size remains default, the margin values from
+            paper-defaults-init.ly remain unchanged. }
+  \score {
+    \relative c' {
+      \someNotes
+      \someNotes
+    }
+  }
+}
diff --git a/input/regression/paper-margins-consistency.ly 
b/input/regression/paper-margins-consistency.ly
index 1b58b15..a3a7a40 100644
--- a/input/regression/paper-margins-consistency.ly
+++ b/input/regression/paper-margins-consistency.ly
@@ -16,4 +16,6 @@ someNotes = \relative c' { \repeat unfold 40 { c4 d e f } }
   line-width = 100 \mm
 }
 
-\score { \someNotes }
+\book {
+  \score { \someNotes }
+}
diff --git a/input/regression/paper-margins-left-margin.ly 
b/input/regression/paper-margins-left-margin.ly
index 5876196..efb9981 100644
--- a/input/regression/paper-margins-left-margin.ly
+++ b/input/regression/paper-margins-left-margin.ly
@@ -10,4 +10,6 @@ someNotes = \relative c' { \repeat unfold 40 { c4 d e f } }
   left-margin = 40 \mm
 }
 
-\score { \someNotes }
+\book {
+  \score { \someNotes }
+}
diff --git a/input/regression/paper-margins-line-width.ly 
b/input/regression/paper-margins-line-width.ly
index bf6e14d..e38f57f 100644
--- a/input/regression/paper-margins-line-width.ly
+++ b/input/regression/paper-margins-line-width.ly
@@ -10,4 +10,6 @@ someNotes = \relative c' { \repeat unfold 40 { c4 d e f } }
   line-width = 100 \mm
 }
 
-\score { \someNotes }
+\book {
+  \score { \someNotes }
+}
diff --git a/input/regression/paper-margins-no-checks.ly 
b/input/regression/paper-margins-no-checks.ly
index 119235e..5f3e783 100644
--- a/input/regression/paper-margins-no-checks.ly
+++ b/input/regression/paper-margins-no-checks.ly
@@ -13,6 +13,8 @@ someNotes = \relative c' { \repeat unfold 40 { c4 d e f } }
   check-consistency = ##f
 }
 
-\score { \someNotes }
+\book {
+  \score { \someNotes }
+}
 
 
diff --git a/input/regression/paper-margins-overrun.ly 
b/input/regression/paper-margins-overrun.ly
index ebe4269..1492de9 100644
--- a/input/regression/paper-margins-overrun.ly
+++ b/input/regression/paper-margins-overrun.ly
@@ -15,4 +15,6 @@ someNotes = \relative c' { \repeat unfold 40 { c4 d e f } }
   line-width = 200 \mm
 }
 
-\score { \someNotes }
+\book {
+  \score { \someNotes }
+}
diff --git a/input/regression/paper-margins-right-margin.ly 
b/input/regression/paper-margins-right-margin.ly
index 40091b4..a2c5977 100644
--- a/input/regression/paper-margins-right-margin.ly
+++ b/input/regression/paper-margins-right-margin.ly
@@ -10,4 +10,6 @@ someNotes = \relative c' { \repeat unfold 40 { c4 d e f } }
   right-margin = 40 \mm
 }
 
-\score { \someNotes }
+\book {
+  \score { \someNotes }
+}
diff --git a/input/regression/paper-margins.ly 
b/input/regression/paper-margins.ly
index 99d5841..52e09a9 100644
--- a/input/regression/paper-margins.ly
+++ b/input/regression/paper-margins.ly
@@ -10,5 +10,7 @@ someNotes = \relative c' { \repeat unfold 40 { c4 d e f } }
 
 \paper { }
 
-\score { \someNotes }
+\book {
+  \score { \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 df7a63b..8be089f 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
+  % These 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..4a7973a 100644
--- a/scm/lily-library.scm
+++ b/scm/lily-library.scm
@@ -333,14 +333,12 @@
    (lambda (x) x)
    (map proc lst)))
 
-
-(define (flatten-list lst)
-  "Unnest LST"
-  (if (null? lst)
-      '()
-      (if (pair? (car lst))
-         (append (flatten-list (car lst)) (flatten-list  (cdr lst)))
-         (cons (car lst) (flatten-list (cdr lst))))))
+(define (flatten-list x)
+  "Unnest list."
+  (cond ((null? x) '())
+        ((not (pair? x)) (list x))
+        (else (append (flatten-list (car x))
+                      (flatten-list (cdr x))))))
 
 (define (list-minus a b)
   "Return list of elements in A that are not in B."
@@ -607,6 +605,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? (flatten-list symbol)))
+                             (if (unavailable? symbol)
+                                  #t
+                                  '()))))
+    (if (null? sym-unavailable)
+        (eval symbol module)
+        (let* ((def (and (pair? 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 #<procedure .. > syntax.
 ;;
diff --git a/scm/paper.scm b/scm/paper.scm
index 1eb3b59..0b5a60e 100644
--- a/scm/paper.scm
+++ b/scm/paper.scm
@@ -16,7 +16,7 @@
                    indent
                    ledger-line-thickness
                    left-margin
-                    left-margin-default
+                    left-margin-default-scaled
                    line-thickness
                    line-width
                    mm
@@ -24,7 +24,7 @@
                    paper-width
                    pt
                    right-margin
-                    right-margin-default
+                    right-margin-default-scaled
                    short-indent
                    staff-height
                    staff-space
@@ -213,13 +213,63 @@ size. SZ is in points"
 
 (define (set-paper-dimensions m w h)
   "M is a module (i.e. layout->scope_ )"
-  (begin
+  (let*
     ;; page layout - what to do with (printer specific!) margin settings?
-    (module-define! m 'paper-width w)
-    (module-define! m 'paper-height h)
-    (module-define! m 'indent (/ w 14))
-    (module-define! m 'short-indent 0))
-    (module-remove! m 'line-width))
+    ((paper-default (eval-carefully
+                      (assoc-get
+                       (ly:get-option 'paper-size)
+                       paper-alist
+                       #f
+                       #t)
+                     m
+                     (cons w h)))
+     (scaleable-values `(("left-margin" . ,w)
+                         ("right-margin" . ,w)
+                         ("top-margin" . ,h)
+                         ("bottom-margin" . ,h)
+                         ("head-separation" . ,h)
+                         ("foot-separation" . ,h)
+                         ("indent" . ,w)
+                         ("short-indent" . ,w)))
+     (scaled-values
+       (map
+         (lambda (entry)
+           (let ((entry-symbol
+                  (string->symbol
+                     (string-append (car entry) "-default")))
+                (orientation (cdr entry)))
+             (if paper-default
+                 (cons (car entry)
+                       (round (* orientation
+                                 (/ (eval-carefully entry-symbol m 0)
+                                    (if (= orientation w)
+                                        (car paper-default)
+                                        (cdr paper-default))))))
+                 entry)))
+        scaleable-values)))
+
+  (module-define! m 'paper-width w)
+  (module-define! m 'paper-height h)
+  ;; Left and right margin are stored in renamed variables because
+  ;; they must not be overwritten.
+  ;; Output_def::normalize () needs to know
+  ;; whether the user set the value or not.
+  (module-define! m 'left-margin-default-scaled
+    (assoc-get "left-margin" scaled-values 0 #t))
+  (module-define! m 'right-margin-default-scaled
+    (assoc-get "right-margin" scaled-values 0 #t))
+  ;; Sometimes, lilypond-book doesn't estimate a correct line-width.
+  ;; Therefore, we need to unset line-width.
+  (module-remove! m 'line-width)
+  (set! scaled-values (assoc-remove!
+                        (assoc-remove! scaled-values "left-margin")
+                       "right-margin"))
+  (for-each
+     (lambda (value)
+        (let ((value-symbol (string->symbol (car value)))
+              (number (cdr value)))
+          (module-define! m value-symbol number)))
+     scaled-values)))
 
 (define (internal-set-paper-size module name landscape?)
   (define (swap x)
-- 
1.6.0.2


reply via email to

[Prev in Thread] Current Thread [Next in Thread]