\version "2.19.8" #(define pair-or-rational? (or pair? rational?)) %% use inside \paper {} or on top level typeArea = #(define-scheme-function ;; size: optional paper size specification as defined in scm/paper.scm ;; orientation: 'portrait or 'landscape (optional, with 'portrait as default) ;; ratio: typeAreaWidth/typeAreaHeight ;;;; examples: ;;;; portrait: standard 3/2, smaller would be 8/5 and 5/3 ;;;; landscape: standard 5/4, smaller would be 6/5, larger 4/3 (parser location sz orientation ratio-input) ((string? "a4") (symbol? 'portrait) pair-or-rational?) (_i "Calculate paper margins for DIN A paper formats so that: – the width-to-height ratio of the type area is @var{ratio} – the upper corners of the type area are on the diagonals of imaginary double pages – the lower corners of the type area are on the diagonals of the page which is supposed to make a pleasant visual appearance") (let ((ratio (if (rational? ratio-input) ratio-input (/ (car ratio-input) (cdr ratio-input)))) (ref (lambda (sym) (module-ref (current-module) sym)))) (cond ((and (eq? orientation 'portrait) (< ratio (sqrt 2))) (ly:warning "Type area ratio has to be larger than square root of 2 (1,414...). Using default margins")) ((and (eq? orientation 'landscape) (> ratio (sqrt 2))) (ly:warning "Type area ratio has to be smaller than square root of 2 (1,414...). Using default margins")) (else (cond ((eq? orientation 'portrait) #{ \paper { #(set-paper-size sz) top-margin = $(* (ref 'paper-height) (/ (- (numerator ratio) (* (denominator ratio) (sqrt 2))) (- (* 4 (numerator ratio)) (* 3 (denominator ratio) (sqrt 2))) )) bottom-margin = #(* (ref 'top-margin) 2) left-margin = #(* (ref 'top-margin) (sqrt 2)) right-margin = #(ref 'left-margin) } #} ) ((eq? orientation 'landscape) #{ \paper { #(set-paper-size sz orientation) left-margin = $(* (ref 'paper-width) (/ (- (numerator ratio) (* (denominator ratio) (sqrt 2))) (- (* 1.5 (numerator ratio)) (* 2 (denominator ratio) (sqrt 2))) )) right-margin = #(ref 'left-margin) bottom-margin = #(* 0.5 (ref 'left-margin) (sqrt 2)) top-margin = #(* (ref 'bottom-margin) 0.5) } #} ))) ) ;(format #t "Margins used: \n top margin: ~a \n bottom margin: ~a \n side margins: ~a" ; (ref 'top-margin) ;(ref 'bottom-margin) ;(ref 'left-margin)) ))