+ (is-paper? (module-defined? module 'is-paper))
+ (mm (eval 'mm module)))
+
+ (cond
+ ((not is-paper?)
+ (ly:warning (_ "This is not a \\layout {} object, ~S" module)))
+ ((pair? entry)
+
+ (set! entry (eval (cdr entry) module))
+ (if landscape?
+ (set! entry (swap entry)))
+ (set-paper-dimensions module (car entry) (cdr entry))
+
+ (module-define! module 'papersizename name)
+ (module-define! module 'landscape
+ (if landscape? #t #f)))
+ (else
+ (ly:warning (_ "Unknown papersize: ~a" name))))))
+
+(define-safe-public (set-default-paper-size name . rest)
+ (internal-set-paper-size
+ (ly:output-def-scope (eval '$defaultpaper (current-module)))
+ name
+ (memq 'landscape rest)))
+
+(define-public (set-paper-size name . rest)
+ (if (module-defined? (current-module) 'is-paper)
+ (internal-set-paper-size (current-module) name
+ (memq 'landscape rest))
+
+ ;;; TODO: should raise (generic) exception with throw, and catch
+ ;;; that in parse-scm.cc
+ (ly:warning (_ "Must use #(set-paper-size .. ) within \\paper { ... }"))))
+
+(define-public (scale-layout pap scale)
+ (let* ((new-pap (ly:output-def-clone pap))
+ (dim-vars (ly:output-def-lookup pap 'dimension-variables))
+ (old-scope (ly:output-def-scope pap))
+ (scope (ly:output-def-scope new-pap)))
+
+ (for-each
+ (lambda (v)
+ (let* ((var (module-variable old-scope v))
+ (val (if (variable? var) (variable-ref var) #f)))
+
+ (if (number? val)
+ (module-define! scope v
+ (/ val scale))
+
+ ;; spurious warnings, eg. for paper-width, paper-height.
+ ;; (ly:warning (_ "not a number, ~S = ~S " v val))
+ )))
+
+ dim-vars)