[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
footnote example
From: |
Jan-Peter Voigt |
Subject: |
footnote example |
Date: |
Fri, 05 Nov 2010 15:31:48 +0100 |
User-agent: |
Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.15) Gecko/20101027 Thunderbird/3.0.10 |
Hello list,
here is a snippet, wich creates footnotes. It is not tested very much!!!
If you like, try it and tell me how it works! If you have improvements,
tell the list :-)
I don't know what happens, when you use it extensibly in a large book
with several pages - if there are X pages and Y footnotes, the
footer-items markup has to loop X*Y through the list of notes!
I will try later ...
First I was trying to get the piece field in the footer with several
scores in one bookpart. I looked through the lily-files in /usr/share
and used some code of toc-init.ly (\label) define-markup-commands.scm
(\page-ref) and thought of using a global running variable to keep this
info available for the footer ...
Then I received my first printed book of lily-scores I typesetted ( I am
10cm larger now ;-) ) and I see, the piece info in the footer is not
that important.
But my tries made me think of footnotes. So I made this little script.
Regards,
Jan-Peter
--snip--
\version "2.12.3"
% Trying to get small(!) footnotes with excerpts from
define-markup-commands.scm and toc-init.ly
% This is a first try!
% TODO take gauge-stencil from page-width?
% TODO parameter for markup styles in paper{} (like 'tocItemMarkup)
% PROBLEM if there are X pages and Y footnotes, the footer-items markup
has to loop X*Y through the list of notes!
% PROBLEM the gauge-stencil always uses the same space! Also if there
are no notes on the page!
% define the footnote counter
#(define footnr 0)
% to be defined in a closure later (see toc-init.ly)
#(define-public (add-foot-item! dir text) #f)
#(define-public (foot-items) #f)
% define add item and get list functions
#(let ((foot-item-list (list)))
(set! add-foot-item!
(lambda (dir text)
(let ((label (gensym "foot")))
(set! footnr (+ footnr 1))
(set! foot-item-list
(cons (list label text footnr)
foot-item-list))
(make-music 'EventChord
'page-marker #t
'page-label label
'elements (list
(make-music 'LabelEvent 'page-label label)
(make-music 'TextScriptEvent 'direction dir
'text (markup #:super #:circle (number->string footnr)))
)))))
(set! foot-items (lambda ()
(reverse foot-item-list))))
% conditionally add text markup, if we are on the right page
#(define (runfi pagelist cur-page table label text fnnr)
(let ((label-page (and (list? table) (assoc label table))))
(if (and label-page (= cur-page (cdr label-page)))
(markup pagelist #:super (number->string fnnr) text)
pagelist
)
)
)
% define markup command to be used in footerMarkup
% delayed stencil-evaluation like in page-ref - so we know the
pagenumber of the label and the current page
% needs 'gauge'-stencil --- is hardcoded right now
#(define-markup-command (footer-items layout props)()
"markup footer items"
(let* ((gauge-stencil (interpret-markup layout props (markup #:super
"1" "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX")))
(x-ext (ly:stencil-extent gauge-stencil X))
(y-ext (ly:stencil-extent gauge-stencil Y)))
(ly:make-stencil
`(delay-stencil-evaluation
,(delay (ly:stencil-expr
(let* ((table (ly:output-def-lookup layout
'label-page-table))
(cur-page (inexact->exact (string->number
(chain-assoc-get 'page:page-number-string props))))
(pagelist (markup))
(page-number -1))
(map (lambda (fn)
(let ((label (car fn))
(text (cadr fn))
(fnnr (caddr fn)))
(set! pagelist (runfi
pagelist cur-page table label text fnnr))
)
) (foot-items))
(interpret-markup layout props (markup
pagelist))
)
)
)) x-ext y-ext)))
% the footnote function
% takes direction (UP/DOWN) and markup
% other layout properties can be set via [\once] \override TextScript
#'... = ...
addfoot = #(define-music-function (parser location dir text)(integer?
markup?)
(begin (add-foot-item! dir text)
))
\paper {
#(set-paper-size "a5" 'landscape)
oddHeaderMarkup = ""
evenHeaderMarkup = ""
oddFooterMarkup = \markup { \fill-line {
\concat { \fromproperty #'header:composer ", " \bold
\fromproperty #'header:title }
% fill in footer-items
\footer-items
\fromproperty #'page:page-number-string
}
}
evenFooterMarkup = \markup { \fill-line {
\fromproperty #'page:page-number-string
% fill in footer-items
\footer-items
\concat { \fromproperty #'header:composer ", " \bold
\fromproperty #'header:title }
}
}
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% some really boaring music with \addfoot
notenA = \relative c' {
\addfoot #UP \markup { "The C in the beginning is not confirmed!" }
\repeat unfold 24 { c d e f }
\addfoot #UP \markup { "This is started on G" }
{ g( f e d) }
\repeat unfold 23 { c d e f }
\bar "|."
}
\bookpart {
\header {
title = "title"
composer = "composer"
}
\score {
\new Staff \new Voice { \notenA }
\header {
piece = "first"
}
}
\score {
\relative c' {
\repeat unfold 10 { c d e f }
\addfoot #0 \markup { "Test3" }
\repeat unfold 10 { c d e f }
\bar "|."
}
\header {
piece = "second"
}
}
}
\bookpart {
\header {
title = "Really boaring!!!!"
composer = "James the Chordbreaker"
}
\score {
<<
\new Staff \new Voice = "voc" {
\relative c' {
\repeat unfold 10 { c d e f }
% override TextScript properties to move the number
\once \override TextScript #'self-alignment-X = #RIGHT
\once \override TextScript #'X-offset = #-2
\addfoot #DOWN \markup { \italic "mi = \"la\" in ancient ork" }
\repeat unfold 10 { c d e f }
\bar "|."
}
}
\new Lyrics \lyricsto "voc" \lyricmode {
\repeat unfold 10 { la la la la }
\repeat unfold 10 { mi mi mi mi }
} >>
\header {
piece = "third"
}
}
}
- footnote example,
Jan-Peter Voigt <=