1 ;;; lily.scm -- implement Scheme output routines for TeX and PostScript
3 ;;; source file of the GNU LilyPond music typesetter
5 ;;; (c) 1998--2000 Jan Nieuwenhuizen <janneke@gnu.org>
6 ;;; Han-Wen Nienhuys <hanwen@cs.uu.nl>
10 ;;; This file contains various routines in Scheme that are easier to
11 ;;; do here than in C++. At present it is an unorganised mess. Sorry.
14 ;;; We should repartition the entire scm side of lily in a
15 ;;; more sane way, using namesspaces/modules?
17 (debug-enable 'backtrace)
20 (define point-and-click #f)
24 (use-modules (ice-9 regex))
26 (define (number-pair? x)
27 (and (pair? x) (number? (car x)) (number? (cdr x))))
28 (define (boolean-or-symbol? x) (or boolean? x) (or symbol? x))
29 (define (number-or-string? x) (or (number? x) (string? x)))
30 (define (list-or-string? x) (or (list? x) (string? x)))
32 (lambda (x) (or (string? x) (list? x))))
36 ;; ugh: code dup ; merge.
37 (define (object-type obj)
39 ((dir? obj) "direction")
40 ((number-pair? obj) "pair of numbers")
41 ((ly-input-location? obj) "input location")
42 ((ly-grob? obj) "graphic element")
44 ((integer? obj) "integer")
46 ((symbol? obj) "symbol")
47 ((string? obj) "string")
48 ((boolean? obj) "boolean")
49 ((moment? obj) "moment")
50 ((number? obj) "number")
52 ((input-port? obj) "input port")
53 ((output-port? obj) "output port")
54 ((vector? obj) "vector")
55 ((procedure? obj) "procedure")
60 (define (type-name predicate)
62 ((eq? predicate dir?) "direction")
63 ((eq? predicate number-pair?) "pair of numbers")
64 ((eq? predicate ly-input-location?) "input location")
65 ((eq? predicate ly-grob?) "graphic element")
66 ((eq? predicate pair?) "pair")
67 ((eq? predicate integer?) "integer")
68 ((eq? predicate list?) "list")
69 ((eq? predicate symbol?) "symbol")
70 ((eq? predicate string?) "string")
71 ((eq? predicate boolean?) "boolean")
72 ((eq? predicate moment?) "moment")
73 ((eq? predicate number?) "number")
74 ((eq? predicate char?) "char")
75 ((eq? predicate input-port?) "input port")
76 ((eq? predicate output-port?) "output port")
77 ((eq? predicate vector?) "vector")
78 ((eq? predicate procedure?) "procedure")
83 (define (uniqued-alist alist acc)
85 (if (assoc (caar alist) acc)
86 (uniqued-alist (cdr alist) acc)
87 (uniqued-alist (cdr alist) (cons (car alist) acc)
91 ;; The regex module may not be available, or may be broken.
93 (let ((os (string-downcase (vector-ref (uname) 0))))
94 (not (equal? "cygwin" (substring os 0 (min 6 (string-length os)))))))
96 ;; If you have trouble with regex, define #f
98 ;;(define use-regex #f)
100 ;; do nothing in .scm output
101 (define (comment s) "")
103 ;; URG guile-1.3/1.4 compatibility
104 (define (ly-eval x) (eval2 x #f))
106 (define (comment s) "")
109 (* (/ 72.27 25.40) x)
112 (define (cons-map f x)
113 (cons (f (car x)) (f (cdr x))))
115 (define (reduce operator list)
116 (if (null? (cdr list)) (car list)
117 (operator (car list) (reduce operator (cdr list)))
122 (define (numbers->string l)
123 (apply string-append (map ly-number->string l)))
125 ; (define (chop-decimal x) (if (< (abs x) 0.001) 0.0 x))
127 (define (number->octal-string x)
128 (let* ((n (inexact->exact x))
129 (n64 (quotient n 64))
130 (n8 (quotient (- n (* n64 64)) 8)))
134 (number->string (remainder (- n (+ (* n64 64) (* n8 8))) 8)))))
136 (define (inexact->string x radix)
137 (let ((n (inexact->exact x)))
138 (number->string n radix)))
141 (define (control->string c)
142 (string-append (number->string (car c)) " "
143 (number->string (cdr c)) " "))
148 (make-string 1 (integer->char (+ (char->integer #\A) i)))
151 (define (scm-scm action-name)
154 (define security-paranoia #f)
158 (define (find-notehead-symbol duration style)
161 ((harmonic) "0mensural")
163 (string-append (number->string duration)
164 (if (< duration 0) "mensural" "")))
165 ((default) (number->string duration))
167 (string-append (number->string duration) (symbol->string style))))
173 (define (string-encode-integer i)
176 ((< i 0) (string-append "n" (string-encode-integer (- i))))
178 (make-string 1 (integer->char (+ 65 (modulo i 26))))
179 (string-encode-integer (quotient i 26))
184 (define default-script-alist '())
186 (define font-name-alist '())
187 (define (tex-encoded-fontswitch name-mag)
189 (iname-mag (car name-mag))
190 (ename-mag (cdr name-mag))
194 (string-append "magfont"
195 (string-encode-integer
196 (hashq (car ename-mag) 1000000))
198 (string-encode-integer
199 (inexact->exact (* 1000 (cdr ename-mag))))
205 (define (define-fonts internal-external-name-mag-pairs)
206 (set! font-name-alist (map tex-encoded-fontswitch
207 internal-external-name-mag-pairs))
210 (font-load-command (car x) (cdr x)))
211 (map cdr font-name-alist)
215 (define (fontify name-mag-pair exp)
216 (string-append (select-font name-mag-pair)
223 ; Make a function that checks score element for being of a specific type.
224 (define (make-type-checker symbol)
227 ;;(eq? #t (ly-get-elt-property elt symbol))
228 (not (eq? #f (memq symbol (ly-get-elt-property elt 'interfaces))))
231 ;;;;;;;;;;;;;;;;;;; TeX output
232 (define (tex-scm action-name)
237 (define (select-font name-mag-pair)
240 (c (assoc name-mag-pair font-name-alist))
246 (display (object-type (car name-mag-pair)))
247 (display (object-type (caaar font-name-alist)))
249 (ly-warn (string-append
250 "Programming error: No such font known "
251 (car name-mag-pair) " "
252 (number->string (cdr name-mag-pair))
254 "") ; issue no command
255 (string-append "\\" (cddr c)))
260 (define (beam width slope thick)
261 (embedded-ps ((ps-scm 'beam) width slope thick)))
263 (define (bracket arch_angle arch_width arch_height width height arch_thick thick)
264 (embedded-ps ((ps-scm 'bracket) arch_angle arch_width arch_height width height arch_thick thick)))
266 (define (dashed-slur thick dash l)
267 (embedded-ps ((ps-scm 'dashed-slur) thick dash l)))
269 (define (crescendo thick w h cont)
270 (embedded-ps ((ps-scm 'crescendo) thick w h cont)))
273 (string-append "\\char" (inexact->string i 10) " "))
275 (define (dashed-line thick on off dx dy)
276 (embedded-ps ((ps-scm 'dashed-line) thick on off dx dy)))
278 (define (decrescendo thick w h cont)
279 (embedded-ps ((ps-scm 'decrescendo) thick w h cont)))
281 (define (font-load-command name-mag command)
283 "\\font\\" command "="
286 (number->string (inexact->exact (* 1000 (cdr name-mag))))
289 (define (embedded-ps s)
290 (string-append "\\embeddedps{" s "}"))
293 (string-append "% " s))
297 ; uncomment for some stats about lily memory
298 ; (display (gc-stats))
299 (string-append "\n\\EndLilyPondOutput"
303 (define (experimental-on)
306 (define (font-switch i)
310 (define (font-def i s)
312 "\\font" (font-switch i) "=" s "\n"))
318 ;; URG: ly-gulp-file: now we can't use scm output without Lily
320 ;; fixed in 1.3.4 for powerpc -- broken on Windows
321 (regexp-substitute/global #f "\n"
322 (ly-gulp-file "lily.ps") 'pre " %\n" 'post)
323 (ly-gulp-file "lily.ps"))
325 "\\input lilyponddefs\\newdimen\\outputscale \\outputscale=\\lilypondpaperoutputscale pt\\turnOnPostScript"))
327 (define (header creator generate)
329 "%created by: " creator generate "\n"))
331 (define (invoke-char s i)
333 "\n\\" s "{" (inexact->string i 10) "}" ))
335 (define (invoke-dim1 s d)
337 "\n\\" s "{" (number->dim d) "}"))
342 ;; need to do something to make this really safe.
344 (define (output-tex-string s)
345 (if security-paranoia
347 (regexp-substitute/global #f "\\\\" s 'pre "$\\backslash$" 'post)
348 (begin (display "warning: not paranoid") (newline) s))
351 (define (lily-def key val)
355 ;; fixed in 1.3.4 for powerpc -- broken on Windows
356 (regexp-substitute/global #f "_"
357 (output-tex-string key) 'pre "X" 'post)
358 (output-tex-string key))
359 "{" (output-tex-string val) "}\n"))
361 (define (number->dim x)
363 (ly-number->string x) " \\outputscale "))
365 (define (placebox x y s)
368 (number->dim y) "}{" (number->dim x) "}{" s "}\n"))
370 (define (bezier-sandwich l thick)
371 (embedded-ps ((ps-scm 'bezier-sandwich) l thick)))
373 (define (start-line ht)
374 (string-append"\\vbox to " (number->dim ht) "{\\hbox{%\n"))
377 "}\\vss}\\interscoreline\n")
378 (define (stop-last-line)
380 (define (filledbox breapth width depth height)
382 "\\kern" (number->dim (- breapth))
383 "\\vrule width " (number->dim (+ breapth width))
384 "depth " (number->dim depth)
385 "height " (number->dim height) " "))
388 (string-append "\\hbox{" (output-tex-string s) "}"))
390 (define (tuplet ht gapx dx dy thick dir)
391 (embedded-ps ((ps-scm 'tuplet) ht gapx dx dy thick dir)))
393 (define (volta h w thick vert_start vert_end)
394 (embedded-ps ((ps-scm 'volta) h w thick vert_start vert_end)))
396 (define (define-origin file line col)
397 ; use this for column positions
399 (string-append "\\special{src:" (number->string line) ":"
400 (number->string col) " " file "}"
401 ;; arg, the clueless take over the mailing list...
402 ; "\\special{-****-These-warnings-are-harmless-***}"
403 ; "\\special{-****-PLEASE-read-http://appel.lilypond.org/wiki/index.php3?PostProcessing-****}"
408 ;(string-append "\\special{src:" (number->string line) " " file "}")
411 ; no-origin not yet supported by Xdvi
412 (define (no-origin) "")
415 ;; The procedures listed below form the public interface of TeX-scm.
416 ;; (should merge the 2 lists)
417 (cond ((eq? action-name 'all-definitions)
419 (define font-load-command ,font-load-command)
421 (define bezier-sandwich ,bezier-sandwich)
422 (define bracket ,bracket)
424 (define crescendo ,crescendo)
425 (define dashed-line ,dashed-line)
426 (define dashed-slur ,dashed-slur)
427 (define decrescendo ,decrescendo)
428 (define end-output ,end-output)
429 (define experimental-on ,experimental-on)
430 (define filledbox ,filledbox)
431 (define font-def ,font-def)
432 (define font-switch ,font-switch)
433 (define header-end ,header-end)
434 (define lily-def ,lily-def)
435 (define header ,header)
436 (define invoke-char ,invoke-char)
437 (define invoke-dim1 ,invoke-dim1)
438 (define placebox ,placebox)
439 (define select-font ,select-font)
440 (define start-line ,start-line)
441 (define stop-line ,stop-line)
442 (define stop-last-line ,stop-last-line)
444 (define tuplet ,tuplet)
445 (define volta ,volta)
446 (define define-origin ,define-origin)
447 (define no-origin ,no-origin)
450 ((eq? action-name 'beam) beam)
451 ((eq? action-name 'tuplet) tuplet)
452 ((eq? action-name 'bracket) bracket)
453 ((eq? action-name 'crescendo) crescendo)
454 ((eq? action-name 'dashed-line) dashed-line)
455 ((eq? action-name 'dashed-slur) dashed-slur)
456 ((eq? action-name 'decrescendo) decrescendo)
457 ((eq? action-name 'end-output) end-output)
458 ((eq? action-name 'experimental-on) experimental-on)
459 ((eq? action-name 'font-def) font-def)
460 ((eq? action-name 'font-switch) font-switch)
461 ((eq? action-name 'header-end) header-end)
462 ((eq? action-name 'lily-def) lily-def)
463 ((eq? action-name 'header) header)
464 ((eq? action-name 'invoke-char) invoke-char)
465 ((eq? action-name 'invoke-dim1) invoke-dim1)
466 ((eq? action-name 'placebox) placebox)
467 ((eq? action-name 'bezier-sandwich) bezier-sandwich)
468 ((eq? action-name 'start-line) start-line)
469 ((eq? action-name 'stem) stem)
470 ((eq? action-name 'stop-line) stop-line)
471 ((eq? action-name 'stop-last-line) stop-last-line)
472 ((eq? action-name 'volta) volta)
473 (else (error "unknown tag -- PS-TEX " action-name))
479 (define (ps-scm action-name)
481 ;; alist containing fontname -> fontcommand assoc (both strings)
482 (define font-alist '())
483 (define font-count 0)
484 (define current-font "")
487 (define (cached-fontname i)
490 (make-string 1 (integer->char (+ 65 i)))))
493 (define (select-font name-mag-pair)
496 (c (assoc name-mag-pair font-name-alist))
501 (display name-mag-pair)
502 (display font-name-alist)
503 (ly-warn (string-append
504 "Programming error: No such font known " (car name-mag-pair))
505 (number->string (cdr name-mag-pair))
508 "") ; issue no command
509 (string-append " " (cdr c) " "))
512 (define (font-load-command name-mag command)
516 (symbol->string (car name-mag))
518 (number->string (cdr name-mag))
519 " 1000 div 12 mul scalefont setfont } bind def "
523 (define (beam width slope thick)
525 (numbers->string (list width slope thick)) " draw_beam" ))
528 (string-append "% " s))
530 (define (bracket arch_angle arch_width arch_height width height arch_thick thick)
532 (numbers->string (list arch_angle arch_width arch_height width height arch_thick thick)) " draw_bracket" ))
535 (invoke-char " show" i))
537 (define (crescendo thick w h cont )
539 (numbers->string (list w h (inexact->exact cont) thick))
542 ;; what the heck is this interface ?
543 (define (dashed-slur thick dash l)
545 (apply string-append (map control->string l))
546 (number->string thick)
548 (number->string dash)
550 (number->string (* 10 thick)) ;UGH. 10 ?
551 " ] 0 draw_dashed_slur"))
553 (define (dashed-line thick on off dx dy)
559 (number->string thick)
564 " ] 0 draw_dashed_line"))
566 (define (decrescendo thick w h cont)
568 (numbers->string (list w h (inexact->exact cont) thick))
569 " draw_decrescendo"))
575 (define (experimental-on) "")
577 (define (filledbox breapth width depth height)
578 (string-append (numbers->string (list breapth width depth height))
582 (define (font-def i s)
585 (substring s 0 (- (string-length s) 4))
586 " findfont 12 scalefont setfont} bind def \n"))
588 (define (font-switch i)
589 (string-append (font i) " "))
593 ;; URG: now we can't use scm output without Lily
594 (ly-gulp-file "lilyponddefs.ps")
595 " {exch pop //systemdict /run get exec} "
596 (ly-gulp-file "lily.ps")
597 "{ exch pop //systemdict /run get exec } "
600 (define (lily-def key val)
602 (if (string=? (substring key 0 (min (string-length "lilypondpaper") (string-length key))) "lilypondpaper")
603 (string-append "/" key " {" val "} bind def\n")
604 (string-append "/" key " (" val ") def\n")
608 (define (header creator generate)
611 "%%Creator: " creator generate "\n"))
613 (define (invoke-char s i)
615 "(\\" (inexact->string i 8) ") " s " " ))
617 (define (invoke-dim1 s d)
619 (number->string (* d (/ 72.27 72))) " " s ))
621 (define (placebox x y s)
623 (number->string x) " " (number->string y) " {" s "} placebox "))
625 (define (bezier-sandwich l thick)
627 (apply string-append (map control->string l))
628 (number->string thick)
629 " draw_bezier_sandwich"))
631 (define (start-line height)
634 (define (stem breapth width depth height)
635 (string-append (numbers->string (list breapth width depth height))
642 (string-append "(" s ") show "))
645 (define (volta h w thick vert_start vert_end)
647 (numbers->string (list h w thick (inexact->exact vert_start) (inexact->exact vert_end)))
650 (define (tuplet ht gap dx dy thick dir)
652 (numbers->string (list ht gap dx dy thick (inexact->exact dir)))
660 (define (define-origin a b c ) "")
661 (define (no-origin) "")
664 (cond ((eq? action-name 'all-definitions)
667 (define tuplet ,tuplet)
668 (define bracket ,bracket)
670 (define crescendo ,crescendo)
671 (define volta ,volta)
672 (define bezier-sandwich ,bezier-sandwich)
673 (define dashed-line ,dashed-line)
674 (define dashed-slur ,dashed-slur)
675 (define decrescendo ,decrescendo)
676 (define end-output ,end-output)
677 (define experimental-on ,experimental-on)
678 (define filledbox ,filledbox)
679 (define font-def ,font-def)
680 (define font-switch ,font-switch)
681 (define header-end ,header-end)
682 (define lily-def ,lily-def)
683 (define font-load-command ,font-load-command)
684 (define header ,header)
685 (define invoke-char ,invoke-char)
686 (define invoke-dim1 ,invoke-dim1)
687 (define placebox ,placebox)
688 (define select-font ,select-font)
689 (define start-line ,start-line)
691 (define stop-line ,stop-line)
692 (define stop-last-line ,stop-line)
694 (define no-origin ,no-origin)
695 (define define-origin ,define-origin)
697 ((eq? action-name 'tuplet) tuplet)
698 ((eq? action-name 'beam) beam)
699 ((eq? action-name 'bezier-sandwich) bezier-sandwich)
700 ((eq? action-name 'bracket) bracket)
701 ((eq? action-name 'char) char)
702 ((eq? action-name 'crescendo) crescendo)
703 ((eq? action-name 'dashed-line) dashed-line)
704 ((eq? action-name 'dashed-slur) dashed-slur)
705 ((eq? action-name 'decrescendo) decrescendo)
706 ((eq? action-name 'experimental-on) experimental-on)
707 ((eq? action-name 'filledbox) filledbox)
708 ((eq? action-name 'select-font) select-font)
709 ((eq? action-name 'volta) volta)
710 (else (error "unknown tag -- PS-SCM " action-name))
715 (define (arg->string arg)
716 (cond ((number? arg) (inexact->string arg 10))
717 ((string? arg) (string-append "\"" arg "\""))
718 ((symbol? arg) (string-append "\"" (symbol->string arg) "\""))))
721 (define (func name . args)
727 (map (lambda (x) (string-append " " (arg->string x))) args)))
735 (define (gulp-file name)
736 (let* ((file (open-input-file name))
737 (text (read-delimited "" file)))
741 ;; urg: Use when standalone, do:
742 ;; (define ly-gulp-file scm-gulp-file)
743 (define (scm-gulp-file name)
745 (cons (string-append (getenv 'LILYPONDPREFIX) "/ly")
746 (cons (string-append (getenv 'LILYPONDPREFIX) "/ps")
748 (let ((path (%search-load-path name)))
753 (define (scm-tex-output)
754 (ly-eval (tex-scm 'all-definitions)))
756 (define (scm-ps-output)
757 (ly-eval (ps-scm 'all-definitions)))
759 (define (scm-as-output)
760 (ly-eval (as-scm 'all-definitions)))
762 (define (index-cell cell dir)
782 ;; (name . (glyph clef-position octavation))
783 ;; -- the name clefOctavation is misleading the value 7 is 1 octave not 7 Octaves.
785 (define supported-clefs '(
786 ("treble" . ("clefs-G" -2 0))
787 ("violin" . ("clefs-G" -2 0))
788 ("G" . ("clefs-G" -2 0))
789 ("G2" . ("clefs-G" -2 0))
790 ("french" . ("clefs-G" -4 0))
791 ("soprano" . ("clefs-C" -4 0))
792 ("mezzosoprano" . ("clefs-C" -2 0))
793 ("alto" . ("clefs-C" 0 0))
794 ("tenor" . ("clefs-C" 2 0))
795 ("baritone" . ("clefs-C" 4 0))
796 ("varbaritone" . ("clefs-F" 0 0))
797 ("bass" . ("clefs-F" 2 0))
798 ("F" . ( "clefs-F" 2 0))
799 ("subbass" . ("clefs-F" 4 0))
801 ;; should move mensural stuff to separate file?
802 ("vaticana_do1" . ("clefs-vaticana_do" -1 0))
803 ("vaticana_do2" . ("clefs-vaticana_do" 1 0))
804 ("vaticana_do3" . ("clefs-vaticana_do" 3 0))
805 ("vaticana_fa1" . ("clefs-vaticana_fa" -1 0))
806 ("vaticana_fa2" . ("clefs-vaticana_fa" 1 0))
807 ("medicaea_do1" . ("clefs-medicaea_do" -1 0))
808 ("medicaea_do2" . ("clefs-medicaea_do" 1 0))
809 ("medicaea_do3" . ("clefs-medicaea_do" 3 0))
810 ("medicaea_fa1" . ("clefs-medicaea_fa" -1 0))
811 ("medicaea_fa2" . ("clefs-medicaea_fa" 1 0))
812 ("hufnagel_do1" . ("clefs-hufnagel_do" -1 0))
813 ("hufnagel_do2" . ("clefs-hufnagel_do" 1 0))
814 ("hufnagel_do3" . ("clefs-hufnagel_do" 3 0))
815 ("hufnagel_fa1" . ("clefs-hufnagel_fa" -1 0))
816 ("hufnagel_fa2" . ("clefs-hufnagel_fa" 1 0))
817 ("hufnagel" . ("clefs-hufnagel_do_fa" 4 0))
818 ("mensural1_c1" . ("clefs-mensural1_c" -4 0))
819 ("mensural1_c2" . ("clefs-mensural1_c" -2 0))
820 ("mensural1_c3" . ("clefs-mensural1_c" 0 0))
821 ("mensural1_c4" . ("clefs-mensural1_c" 2 0))
822 ("mensural2_c1" . ("clefs-mensural2_c" -4 0))
823 ("mensural2_c2" . ("clefs-mensural2_c" -2 0))
824 ("mensural2_c3" . ("clefs-mensural2_c" 0 0))
825 ("mensural2_c4" . ("clefs-mensural2_c" 2 0))
826 ("mensural2_c5" . ("clefs-mensural2_c" 4 0))
827 ("mensural3_c1" . ("clefs-mensural3_c" -2 0))
828 ("mensural3_c2" . ("clefs-mensural3_c" 0 0))
829 ("mensural3_c3" . ("clefs-mensural3_c" 2 0))
830 ("mensural3_c4" . ("clefs-mensural3_c" 4 0))
831 ("mensural_f" . ("clefs-mensural_f" 2 0))
835 (define (clef-name-to-properties cl)
838 (l (string-length cl))
842 (if (equal? "8" (substring cl (- l 1) l))
844 (if (equal? "^" (substring cl (- l 2) (- l 1)))
848 (set! cl (substring cl 0 (- l 2)))))
851 (set! e (assoc cl supported-clefs))
853 `(((symbol . clefGlyph)
854 (iterator-ctor . ,Property_iterator::constructor)
857 ((symbol . clefPosition)
858 (iterator-ctor . ,Property_iterator::constructor)
861 ,(if (not (equal? oct 0))
862 `((symbol . clefOctavation)
863 (iterator-ctor . ,Property_iterator::constructor)
868 (ly-warn (string-append "Unknown clef type `" cl "'\nSee scm/lily.scm for supported clefs"))
874 (define (repeat-name-to-ctor name)
877 `(("volta" . ((iterator-ctor . ,Volta_repeat_iterator::constructor)
878 (length . ,Repeated_music::volta_music_length)
880 ("unfold" . ((iterator-ctor . ,Unfolded_repeat_iterator::constructor)
881 (length . ,Repeated_music::unfolded_music_length)
883 ("fold" . ((iterator-ctor . ,Folded_repeat_iterator::constructor)
884 (length . ,Repeated_music::folded_music_length)
886 ("tremolo" . ((iterator-ctor . ,Chord_tremolo_iterator::constructor)
887 (length . ,Repeated_music::unfolded_music_length)
891 (handle (assoc name supported-reps))
898 (string-append "Unknown repeat type `" name "'\nSee scm/lily.scm for supported repeats")
900 '(type . 'repeated-music))
905 (map (lambda (x) (eval-string (ly-gulp-file x)))
907 '("backend-property.scm"
908 "translator-properties.scm"
914 "generic-property.scm"
915 "basic-properties.scm"
917 "element-descriptions.scm"