Deutschsprachiges LilyPond-Forum

Allgemeine Fragen und Probleme => Fragen und Probleme aller Art => Thema gestartet von: martinmagtenor am Sonntag, 24. November 2024, 20:01

Titel: Übernahme von Angaben in header in tocItem [GELÖST]
Beitrag von: martinmagtenor am Sonntag, 24. November 2024, 20:01
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.
Titel: Antw:Übernahme von Angaben in header in tocItem
Beitrag von: harm6 am Montag, 25. November 2024, 08:58
Hilft https://lsr.di.unimi.it/LSR/Item?id=467 ?

Gruß,
  Harm
Titel: Antw:Übernahme von Angaben in header in tocItem
Beitrag von: martinmagtenor am Montag, 25. November 2024, 17:48
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
Titel: Antw:Übernahme von Angaben in header in tocItem
Beitrag von: harm6 am Dienstag, 26. November 2024, 00:42
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
Titel: Antw:Übernahme von Angaben in header in tocItem
Beitrag von: martinmagtenor am Dienstag, 26. November 2024, 17:57
Hallo Harm,

großartig, funktioniert. Vielen Dank!

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

Grüße

Martin
Titel: Antw:Übernahme von Angaben in header in tocItem
Beitrag von: martinmagtenor am Mittwoch, 27. November 2024, 20:28
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
Titel: Antw:Übernahme von Angaben in header in tocItem
Beitrag von: martinmagtenor am Mittwoch, 27. November 2024, 20:41
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
Titel: Antw:Übernahme von Angaben in header in tocItem
Beitrag von: harm6 am Donnerstag, 28. November 2024, 21:44
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
Titel: Antw:Übernahme von Angaben in header in tocItem
Beitrag von: martinmagtenor am Donnerstag, 28. November 2024, 21:45
DANKE