lilypond-user
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Table of Contents - order by page


From: Thomas Morley
Subject: Re: Table of Contents - order by page
Date: Tue, 13 Dec 2016 01:20:42 +0100

2016-12-12 2:20 GMT+01:00 Freddy Ouellette <address@hidden>:
> 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



reply via email to

[Prev in Thread] Current Thread [Next in Thread]