2016-12-12 2:20 GMT+01:00 Freddy Ouellette <freddy.ouelle...@gmail.com>: > The table of contents seems to list its items by the order in which they > were evaluated by the parser, and not by where they actually appear in the > book... Is there a way to avoid this? > > for example, even though partB comes AFTER partA in the book, and the PAGES > in the table of contents are right, partB comes listed first in the TOC > which is very annoying, simply because it was evaluated first.
As far as I understand, then the toc-tems are stored in a list as soon as they are seen by the parser. The (simplified) list for your example would then look like (list "PART B" "PART A") The table-of-contents-markup-list-command works on this list in the order the entries appear. Though, the page-numbers are assigned and inserted with delay, _after_ the pages are calculated, i.e. at the very end of compilation. Thus you can't go back and reorder the table-of-content. Resulting in (usually) correct assignmens but appearing in unwanted order (at least in your example). Though, you can reorder the toc-items _before_ table-of-contents work on it. For your example one could do: partB = \bookpart { \tocItem "PART B" \new Staff { c4 d e f } } partA = \bookpart { \tocItem "PART A" \new Staff { c4 d e f } } %% Reorder (toc-items): %% To be done after all \tocItem-stuff is done and before table-of-contents is %% called #(let ((t-i (toc-items))) ;;;; (1) ;;;; watch the original toc-items: ;(write t-i) ;;;; (2) ;;;; reset the list, be aware: needs to be a procedure! ;;;; (2a) ;; doing it manually for each entry: ;(set! ; toc-items ; (lambda () ; (list ; (second t-i) ; (first t-i)))) ;;;; (2b) ;; in the simple example a reverse would do it already; ;(set! ; toc-items ; (lambda () (reverse t-i))) ; ;;;; (2c) ;; reorder alphabetical (set! toc-items (lambda () (sort t-i (lambda (p q) (string-ci<? (last p) (last q)))))) ;;;; (3) ;;;; watch the result ;(write (toc-items)) ) \book { \bookpart { \markuplist \table-of-contents \paper { tocTitleMarkup = \markup \center-column { \italic "Contents" \vspace #0.3 } tocItemMarkup = \markup { \fill-with-pattern #1 #RIGHT " . " \fromproperty #'toc:text \fromproperty #'toc:page } } } \bookpart { \partA } \bookpart { \partB } } Also, look at: http://lsr.di.unimi.it/LSR/Item?id=763 For personal use I made some other codings of this kind, shout if interested. They all reorder the toc-items for different use-cases. HTH, Harm _______________________________________________ lilypond-user mailing list lilypond-user@gnu.org https://lists.gnu.org/mailman/listinfo/lilypond-user