;;;; This file is part of LilyPond, the GNU music typesetter.
;;;;
-;;;; Copyright (C) 2000--2011 Han-Wen Nienhuys <hanwen@xs4all.nl>
+;;;; Copyright (C) 2000--2012 Han-Wen Nienhuys <hanwen@xs4all.nl>
;;;; Jan Nieuwenhuizen <janneke@gnu.org>
;;;;
;;;; LilyPond is free software: you can redistribute it and/or modify
@lilypond[verbatim,quote]
\\markup {
- \\with-url #\"http://lilypond.org/web/\" {
+ \\with-url #\"http://lilypond.org/\" {
LilyPond ... \\italic {
music notation for everyone
}
@lilypond[verbatim,quote]
\\markup {
- \\with-link #\"label\" {
+ \\with-link #'label {
\\italic { This links to the page containing the label... }
}
}
Like simple-markup, but use tie characters for @q{~} tilde symbols.
@lilypond[verbatim,quote]
-\\markup {
- \\tied-lyric #\"Lasciate~i monti\"
-}
-@end lilypond"
- (if (string-contains str "~")
- (let*
- ((half-space (/ word-space 2))
- (parts (string-split str #\~))
- (tie-str (markup #:hspace half-space
- #:musicglyph "ties.lyric"
- #:hspace half-space))
- (joined (list-join parts tie-str))
- (join-stencil (interpret-markup layout props tie-str))
- )
+\\markup \\column {
+ \\tied-lyric #\"Siam navi~all'onde~algenti Lasciate~in abbandono\"
+ \\tied-lyric #\"Impetuosi venti I nostri~affetti sono\"
+ \\tied-lyric #\"Ogni diletto~e scoglio Tutta la vita~e~un mar.\"
+}
+@end lilypond"
+ (define (replace-ties tie str)
+ (if (string-contains str "~")
+ (let*
+ ((half-space (/ word-space 2))
+ (parts (string-split str #\~))
+ (tie-str (markup #:hspace half-space
+ #:musicglyph tie
+ #:hspace half-space))
+ (joined (list-join parts tie-str)))
+ (make-concat-markup joined))
+ str))
+
+ (define short-tie-regexp (make-regexp "~[^.]~"))
+ (define (match-short str) (regexp-exec short-tie-regexp str))
+
+ (define (replace-short str mkp)
+ (let ((match (match-short str)))
+ (if (not match)
+ (make-concat-markup (list
+ mkp
+ (replace-ties "ties.lyric.default" str)))
+ (let ((new-str (match:suffix match))
+ (new-mkp (make-concat-markup (list
+ mkp
+ (replace-ties "ties.lyric.default"
+ (match:prefix match))
+ (replace-ties "ties.lyric.short"
+ (match:substring match))))))
+ (replace-short new-str new-mkp)))))
- (interpret-markup layout
- props
- (make-concat-markup joined)))
- (interpret-markup layout props str)))
+ (interpret-markup layout
+ props
+ (replace-short str (markup))))
(define-public empty-markup
(make-simple-markup ""))
;; property
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+(define-markup-command (property-recursive layout props symbol)
+ (symbol?)
+ #:category other
+ "Print out a warning when a header field markup contains some recursive
+markup definition."
+ (ly:warning "Recursive definition of property ~a detected!" symbol)
+ empty-stencil)
+
(define-markup-command (fromproperty layout props symbol)
(symbol?)
#:category other
@end lilypond"
(let ((m (chain-assoc-get symbol props)))
(if (markup? m)
- (interpret-markup layout props m)
+ ;; prevent infinite loops by clearing the interpreted property:
+ (interpret-markup layout (cons (list (cons symbol `(,property-recursive-markup ,symbol))) props) m)
empty-stencil)))
(define-markup-command (on-the-fly layout props procedure arg)
- (symbol? markup?)
+ (procedure? markup?)
#:category other
"Apply the @var{procedure} markup command to @var{arg}.
@var{procedure} should take a single argument."
(interpret-markup layout props (list anonymous-with-signature arg))))
(define-markup-command (footnote layout props mkup note)
+ (markup? markup?)
+ #:category other
+ "Have footnote @var{note} act as an annotation to the markup @var{mkup}.
+
+@lilypond[verbatim,quote]
+\\markup {
+ \\auto-footnote a b
+ \\override #'(padding . 0.2)
+ \\auto-footnote c d
+}
+@end lilypond
+The footnote will not be annotated automatically."
+ (ly:stencil-combine-at-edge
+ (interpret-markup layout props mkup)
+ X
+ RIGHT
+ (ly:make-stencil
+ `(footnote (gensym "footnote") #f ,(interpret-markup layout props note))
+ '(0 . 0)
+ '(0 . 0))
+ 0.0))
+
+(define-markup-command (auto-footnote layout props mkup note)
(markup? markup?)
#:category other
#:properties ((raise 0.5)
@lilypond[verbatim,quote]
\\markup {
- \\footnote a b
+ \\auto-footnote a b
\\override #'(padding . 0.2)
- \\footnote c d
+ \\auto-footnote c d
}
-@end lilypond"
+@end lilypond
+The footnote will be annotated automatically."
(let* ((markup-stencil (interpret-markup layout props mkup))
- (auto-numbering (ly:output-def-lookup layout
- 'footnote-auto-numbering))
(footnote-hash (gensym "footnote"))
(stencil-seed 0)
- (gauge-stencil (if auto-numbering
- (interpret-markup
- layout
- props
- ((ly:output-def-lookup
- layout
- 'footnote-numbering-function)
- stencil-seed))
- empty-stencil))
- (x-ext (if auto-numbering
- (ly:stencil-extent gauge-stencil X)
- '(0 . 0)))
- (y-ext (if auto-numbering
- (ly:stencil-extent gauge-stencil Y)
- '(0 . 0)))
+ (gauge-stencil (interpret-markup
+ layout
+ props
+ ((ly:output-def-lookup
+ layout
+ 'footnote-numbering-function)
+ stencil-seed)))
+ (x-ext (ly:stencil-extent gauge-stencil X))
+ (y-ext (ly:stencil-extent gauge-stencil Y))
(footnote-number
- (if auto-numbering
- `(delay-stencil-evaluation
- ,(delay
- (ly:stencil-expr
- (let* ((table
- (ly:output-def-lookup layout
- 'number-footnote-table))
- (footnote-stencil (if (list? table)
- (assoc-get footnote-hash
- table)
- empty-stencil))
- (footnote-stencil (if (ly:stencil? footnote-stencil)
- footnote-stencil
- (begin
- (ly:programming-error
+ `(delay-stencil-evaluation
+ ,(delay
+ (ly:stencil-expr
+ (let* ((table
+ (ly:output-def-lookup layout
+ 'number-footnote-table))
+ (footnote-stencil (if (list? table)
+ (assoc-get footnote-hash
+ table)
+ empty-stencil))
+ (footnote-stencil (if (ly:stencil? footnote-stencil)
+ footnote-stencil
+ (begin
+ (ly:programming-error
"Cannot find correct footnote for a markup object.")
- empty-stencil)))
- (gap (- (interval-length x-ext)
- (interval-length
- (ly:stencil-extent footnote-stencil X))))
- (y-trans (- (+ (cdr y-ext)
- raise)
- (cdr (ly:stencil-extent footnote-stencil
- Y)))))
- (ly:stencil-translate footnote-stencil
- (cons gap y-trans))))))
- '()))
+ empty-stencil)))
+ (gap (- (interval-length x-ext)
+ (interval-length
+ (ly:stencil-extent footnote-stencil X))))
+ (y-trans (- (+ (cdr y-ext)
+ raise)
+ (cdr (ly:stencil-extent footnote-stencil
+ Y)))))
+ (ly:stencil-translate footnote-stencil
+ (cons gap y-trans)))))))
(main-stencil (ly:stencil-combine-at-edge
markup-stencil
X
(ly:stencil-add
main-stencil
(ly:make-stencil
- `(footnote ,footnote-hash ,(interpret-markup layout props note))
+ `(footnote ,footnote-hash #t ,(interpret-markup layout props note))
'(0 . 0)
'(0 . 0)))))
(ref-baseline (chain-assoc-get 'baseline-skip text-props 3))
(magnification (/ size ref-size)))
(interpret-markup
- layout
- (cons
- `((baseline-skip . ,(* magnification ref-baseline))
- (word-space . ,(* magnification ref-word-space))
- (font-size . ,(magnification->font-size magnification)))
- props)
- arg)))
+ layout
+ (cons
+ `((baseline-skip . ,(* magnification ref-baseline))
+ (word-space . ,(* magnification ref-word-space))
+ (font-size . ,(magnification->font-size magnification)))
+ props)
+ arg)))
(define-markup-command (fontsize layout props increment arg)
(number? markup?)
}
@end lilypond"
(interpret-markup
- layout
- (cons
- `((baseline-skip . ,(* baseline-skip (magstep increment)))
- (word-space . ,(* word-space (magstep increment)))
- (font-size . ,(+ font-size increment)))
- props)
- arg))
+ layout
+ (cons
+ `((baseline-skip . ,(* baseline-skip (magstep increment)))
+ (word-space . ,(* word-space (magstep increment)))
+ (font-size . ,(+ font-size increment)))
+ props)
+ arg))
(define-markup-command (magnify layout props sz arg)
(number? markup?)
\\markup \\replace #'((\"thx\" . \"Thanks!\")) thx
@end lilypond"
(interpret-markup
- layout
- (internal-add-text-replacements
- props
- replacements)
- (markup arg)))
+ layout
+ (internal-add-text-replacements
+ props
+ replacements)
+ (markup arg)))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Markup list commands