Here you are.
What about the docs patch?

Regards,
Michael

>From 3cda0a2d5326b2359784ca1e10b04b078abd2cb9 Mon Sep 17 00:00:00 2001
From: =?utf-8?q?Michael=20K=C3=A4ppler?= <xmichae...@web.de>
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-a2.ly       |   16 +++++
 input/regression/paper-default-margins-a6.ly       |   18 +++++
 input/regression/paper-default-margins-def.ly      |   17 +++++
 lily/output-def.cc                                 |    4 +-
 ly/paper-defaults-init.ly                          |   14 +++-
 scm/lily-library.scm                               |   37 +++++++++---
 scm/paper.scm                                      |   66 +++++++++++++++++---
 8 files changed, 152 insertions(+), 24 deletions(-)
 create mode 100644 input/regression/paper-default-margins-a2.ly
 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-a2.ly b/input/regression/paper-default-margins-a2.ly
new file mode 100644
index 0000000..add59da
--- /dev/null
+++ b/input/regression/paper-default-margins-a2.ly
@@ -0,0 +1,16 @@
+\version "2.13.6"
+
+\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 "a2")
+}
+
+\score { \relative c' { \someNotes \someNotes \someNotes}}
diff --git a/input/regression/paper-default-margins-a6.ly b/input/regression/paper-default-margins-a6.ly
new file mode 100644
index 0000000..3973be9
--- /dev/null
+++ b/input/regression/paper-default-margins-a6.ly
@@ -0,0 +1,18 @@
+\version "2.13.6"
+
+\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")
+}
+
+\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..cd7d2e2
--- /dev/null
+++ b/input/regression/paper-default-margins-def.ly
@@ -0,0 +1,17 @@
+\version "2.13.6"
+
+\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 { }
+
+\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/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

_______________________________________________
lilypond-devel mailing list
lilypond-devel@gnu.org
http://lists.gnu.org/mailman/listinfo/lilypond-devel

Reply via email to