Übernahme von Angaben in header in tocItem [GELÖST]

Begonnen von martinmagtenor, Sonntag, 24. November 2024, 20:01

« vorheriges - nächstes »

martinmagtenor

Ich stehe etwas auf dem Schlauch. Ich bearbeite eine Sammlung kleiner Orgelkompositionen (ca. 170 Stück). Die soll natürlich ein Inhaltsverzeichnis bekommen. Und da man für die Überschriften und Kopfzeilen header befüllt, dachte ich, ich könnte mit fromproperty Daten in tocItem übernehmen und damit etwas Arbeit sparen.

Aber das funktioniert nicht. fromproperty funktioniert in der paper-Umgebung für header und/oder footer.

Geht das einfach nicht, da nicht möglich, oder mache ich es mir zu einfach?

Sorry, versehentlich zu früh abgeschickt.  :(

Ungefähr so:

% Die Ausgabe des Inhaltsverzeichnisses habe ich auch weggelassen, das funktioniert.

\version "2.24.1"

\bookpart {
\header {
piece = "Eins"
}

tocItem = \markup \fromproperty #'header:piece

\score {
% hier folgen die Noten für das erste Stück
\relative c' { a a a a }
}
}

\bookpart {
\header {
piece = "Zwei"
}

tocItem = \markup \fromproperty #'header:piece

\score {
% hier folgen die Noten für das zweite Stück
\relative c' { c c c c }
}
}


Beim Kompilieren gibt es keinen Fehler. Es entsteht auch ein Inhaltsverzeichnis (hier nicht gezeigt), aber da sind nur Seitennummern drin.


martinmagtenor

Hallo Harm,

vielen Dank. Tatsächlich ist das nur fast die Lösung, auch wenn der Ansatz vielversprechend ist. Die Funktion markupWithHeader gewährt Zugriff auf die globale Header-Definition, also, die außerhalb der books.

Diese Einschränkung ist auch Code ausgewiesen:

Zitat;; TODO: If we are inside a score, add the score's local header block, too!
;; Currently, I only use the global header block, stored in $defaultheader
      (scopes (list $defaultheader))
      (alists (map ly:module->alist scopes))

So auf die Schnelle bin ich nicht dahinter gekommen, wir man auf den "lokalen" header-Block zugreift. Hast Du eine Idee dazu?

Martin

harm6

Ich habs mal neu geschrieben und erweitert als \with-header-scopes:

\version "2.24.1"

#(define (scopes)
"Returns a list of header-modules from bookpart, book and @code{$defaultheader}.
"
  (let* ((current-bookpart (ly:parser-lookup '$current-bookpart))
         (current-book (ly:parser-lookup '$current-book))
         (book-header
           (if current-book
               (ly:book-header current-book)
               #f))
         (bookpart-header
           (if current-bookpart
               (ly:book-header current-bookpart)
               #f)))
     (filter module? (list bookpart-header book-header $defaultheader))))

#(define-markup-command (with-header-scopes layout props scopes markup)
  (list? markup?)
  "Interpret the given @var{markup} with the header fields from @var{scopes}
added to the props.
This way, one can re-use the same functions (using
@code{\\fromproperty #'header:field}) in the header block and as top-level
markup."
  (let* ((alists (map ly:module->alist scopes))
         (prefixed-alist
          (map
            (lambda (alist)
              (map
                (lambda (entry)
                  (cons
                    (string->symbol (format #f "header:~s" (car entry)))
                    (cdr entry)))
                alist))
           alists))
         (props
           (append
             prefixed-alist
             props
             (layout-extract-page-properties layout))))
    (interpret-markup layout props markup)))


\header { piece = "All books" }

\book {
  \header { piece = "This book" }
  \markuplist \table-of-contents

  \bookpart {
    \header { piece = "Bookpart One" }
    \tocItem \markup \with-header-scopes #(scopes) \fromproperty #'header:piece

    \score { \relative c' { a a a a } }
  }

  \bookpart {
    \header { piece = "Bookpart Two" }

    \tocItem \markup \with-header-scopes #(scopes) \fromproperty #'header:piece

    \score { \relative c' { c c c c } }
  }
}

HTH,
  Harm

martinmagtenor

Hallo Harm,

großartig, funktioniert. Vielen Dank!

Kann man das irgendwie als Feature-Request oder Community-Beitrag vorschlagen?

Grüße

Martin

martinmagtenor

Hallo Harm,

irgendwas ist an der Lösung noch "unrund". Ich sehe teilweise mehrfache Einträge im Inhaltsverzeichnis, obwohl das Makro tocItem jeweils nur einmal in den Quellen enthalten ist.

Wovon das abhängt und wie man das in einem Minimalbeispiel provoziert bekommt, muss ich noch herausfinden.

Martin

martinmagtenor

Hallo Harm,

entschuldige bitte, das war voreiliger Alarmismus. Problem gelöst. Da waren noch tocItem-Restanten, die auf's Löschen warteten.

Nochmal Danke! Eine sehr hilfreiche Erweiterung ist das geworden!

Martin

harm6

Zitat von: martinmagtenor am Dienstag, 26. November 2024, 17:57Kann man das irgendwie als Feature-Request oder Community-Beitrag vorschlagen?

Im allgemeinen:
Feature-Requests, etc kannst Du mit mail(s) an die bug-mailing-list vorschlagen.
Das LSR bietet ansonsten die beste Möglichkeit wie user an der Weiterentwicklung teilhaben können. Wenn Du also ein interessantes snippet hast oder bemerkst kannst Du es dort einstellen (account erforderlich). Ein LSR-Editor wird das snippet dann annehmen (evtl. nach Rückfragen). In dem Fall hier, gibt es jetzt eine Erweiterung zu einem bereits bestehenden snippet. Auch das könntest Du dort einstellen (siehe die entsprechenden Seiten des LSR zum Verfahren). Ein LSR-Editor wird es dann evtl einpflegen.

Im besonderen:
Es gibt nicht so viele LSR-Editoren, aber ich selbst bin einer ;)
Insoweit werde ich das snippet selbst verändern (sobald es meine Zeit zulässt).
Allerdings bin ich noch nicht ganz zufrieden, denn nach wie vor werden score-header nicht erfasst. Ich weiss aber auch nicht recht wie es mit vertretbarem Aufwand gelingen kann...

Viele Grüße,
  Harm