Deutsches Lilypond Forum (Archiv)

Allgemein => Fragen zu Funktionen => Thema gestartet von: martinmagtenor am Mittwoch, 17. Oktober 2012, 20:04

Titel: 2.16.0: /fromproperty #'header:piece geht nicht in HeaderMarkup
Beitrag von: martinmagtenor am Mittwoch, 17. Oktober 2012, 20:04
Guten Abend,

bin neu hier und komme mit einem Kopfzeilen-Formatierungsproblem nicht weiter.

Es geht um ein mehrseitiges vierstimmiges Vokalwerk. Der Druck soll beidseitig erfolgen, dei Kopfzeile soll außen den Titel des Werkes und innen den jeweiligen Satzbezeichner führen. Ich habe eine Kontrolldatei und für jeden Satz eine eigene Datei.

Das Inhaltsverzeichnis funktioniert, nur der Satzbezeichner, den ich mit \fromproperty aus dem header-Objekt holen will bleibt leer.

Damit ich nicht so viel erklären muss, habe ich versucht, das auf ein minimales Code-Fragment einzudampfen:

\version "2.16.0"

%{
Zugriff auf #'header:piece geht nicht in odd/evenHeaderMarkup!
Inhaltsverzeichnis ist ok.
}%

\include "deutsch.ly"

\markuplist \table-of-contents

\header {
title = "Titel"
composer = "Komponist"
copyright = "Copyright"
} % header

% Jetzt kommen die einzelnen Sätze über Inkludierung.
% Damit ich den Satztitel micht mehrfach schreiben muss, übergebe ich eine
% Variable:
thisPiece = "Eins"
\include "eins.ly"

thisPiece = "Zwei"
\include "zwei.ly"

% usw.

% dann kommt die paper-Deklaration, die ich auf den relevanten Teil verkürze:

\paper {
oddHeaderMarkup = \markup { \fill-line { \fromproperty #'header:piece \null \fromproperty #'header:title } }
evenHeaderMarkup = \markup { \fill-line { \fromproperty #'header:title \null \fromproperty #'header:piece } }

} % paper

%{
  % Beispiel für eins.ly

\tocItem \markup \thisPiece

\score {
  \relative c { b a c h }
 \header {
  piece = \thisPiece
 } % header
} % score


}%

Bin für jeden Hinweis dankbar.

Schönen Abend
Titel: Re: 2.16.0: /fromproperty #'header:piece geht nicht in HeaderMarkup
Beitrag von: harm6 am Donnerstag, 18. Oktober 2012, 02:03
Hallo,

willkommen im Forum!

Zum Thema:
Das Problem gründet auf dem Unterschied von bookTitleMarkup und scoreTitleMarkup.

\fromproperty #'header: ... ruft die entsprechende Variable aus dem bookTitleMarkup auf. Das scoreTitleMarkup kann zwar eine `piece´-Angabe hinzufügen (oder auch überschreiben), da die page-header (und footer) jedoch vorher definiert sein müssen, greifen sie immer auf die Original-Variable aus dem Original-bookheader zu.
Wenn Du also
piece = "irgendwas"
im book-header definiertest, so wird immer "irgendwas" in die page-header geschrieben.

Zwei Lösungsmöglichkeiten:
a) Ein kleines feature welches ich vor ein paar Monaten als patch geschrieben habe: #(on-page <number>)
Hier handelt es sich um die Möglichkeit auf bestimmten, namentlich anzugebenden Seiten, bestimmte markups in die header/footer zu setzen.
Wenn Du mehrere, verschiedene markups auf verschiedenen Seiten haben willst, so benutze \line { ... }.
Du kannst in \paper eine Variable (als \markup { ...}) definieren, die alle diese Setzungen enthält und in den page-header-Definitionen einfach aufrufen.
Das Ganze ist allerdings nicht völlig automatisiert, aber man hat zumindest die Möglichkeit bestimmte Seiten anzusprechen.

\version "2.16.0"

\include "deutsch.ly"

\markuplist \table-of-contents

\pageBreak

 \header {
  title = "Titel"
  composer = "Komponist"
  copyright = "Copyright"
 } % header

% Jetzt kommen die einzelnen Sätze über Inkludierung.
% Damit ich den Satztitel micht mehrfach schreiben muss, übergebe ich eine
% Variable:
thisPiece¹ = "Eins"
%\include "eins.ly"

thisPiece² = "Zwei"
% \include "zwei.ly"

thisPiece³ = "Drei"
% \include "drei.ly"

% usw.

% dann kommt die paper-Deklaration,

\paper {
        myHeadersMarkup = \markup {
        \line {
                \on-the-fly #(on-page 2) \thisPiece¹
        \on-the-fly #(on-page 3) \thisPiece²
        \on-the-fly #(on-page 4) \thisPiece³
}
        }
        oddHeaderMarkup = \markup {
        \fill-line { 
                \on-the-fly #not-first-page
                        \box
                        \myHeadersMarkup
                        \on-the-fly #not-first-page
                        \fromproperty #'header:title
                }
        }
        evenHeaderMarkup = \markup {
                \fill-line {
                        \fromproperty #'header:title
                        \box
                        \myHeadersMarkup
                }
        }

} % paper

%%{
  % Beispiel für eins.ly

\tocItem \markup \thisPiece¹
\tocItem \markup \thisPiece²
\tocItem \markup \thisPiece³

\score {
  \relative c { b a c h }
 \header {
         piece = \thisPiece¹
 } % header
} % score
\pageBreak \markup \fill-line { \fontsize #6 "Page 3" }
\pageBreak \markup \fill-line { \fontsize #6 "Page 4" }
%}

b) \book und \bookpart
Du kannst in jedem bookpart (unabhängig von anderen bookparts) neue Definitionen von \paper, \layout, \header etc angeben.
Allerdings wird jeder bookpart auf einer neuen Seite begonnen. Ob das in Deinem Fall von Vorteil oder Nachteil ist kann ich natürlich nicht sagen.


Gruß,
  Harm
Titel: Re: 2.16.0: /fromproperty #'header:piece geht nicht in HeaderMarkup
Beitrag von: martinmagtenor am Donnerstag, 18. Oktober 2012, 20:08
Hallo,

danke für fundierte die Erläuterung. Dass die beiden header-Umgebungen je nach Kontext so strikt getrennt sind, war mir irgendwie entgangen. Das ist ja wirklich schade.

Bookpart kommt nicht infrage, weil ich Seitenwechsel zwischen den Sätzen überhaupt nicht brauchen kann.

Dein erster Vorschlag mit Deiner on-page-Funktion ist interessant, mir aber noch zu umständlich. Der Leidensdruck ist noch nicht groß genug.  ;-)

Insgesamt sträubt sich meine Programmiererseele noch gegen so einen Workaround. Noch spiele ich mit Skalierung und anderen Parametern und da müsste ich ja jedesmal alles nachjustieren.

Der Hinweis "[...] die page-header [...] jedoch vorher definiert sein müssen [...]" bringt mich nochmal auf den Gedanken, ob es keine Möglichkeit gibt, einer "späten" Auflösung der Verweise in dem Markup. Dann könnte sich der Inhalt unterwegs durchaus ändern.

Nun denn, mal sehen ...

Schönen Abend
   Martin
Titel: Re: 2.16.0: /fromproperty #'header:piece geht nicht in HeaderMarkup
Beitrag von: harm6 am Freitag, 19. Oktober 2012, 20:59
Hallo Martin,

Zitat
Dein erster Vorschlag mit Deiner on-page-Funktion ist interessant, mir aber noch zu umständlich. Der Leidensdruck ist noch nicht groß genug.  ;-)
Insgesamt sträubt sich meine Programmiererseele noch gegen so einen Workaround.

Ist schon richtig, `on-page´ ist eigentlich nicht für diesen Zweck geschrieben worden. Wenn man es doch so einsetzt muß man natürlich immer wieder manuell eingreifen. :(

Zitat
Der Hinweis "[...] die page-header [...] jedoch vorher definiert sein müssen [...]" bringt mich nochmal auf den Gedanken, ob es keine Möglichkeit gibt, einer "späten" Auflösung der Verweise in dem Markup. Dann könnte sich der Inhalt unterwegs durchaus ändern.

Falls Dir da etwas gelingt, würde es mich sehr interessieren. Das Problem ist schon mehrfach aufgetaucht.



Gruß,
  Harm
Titel: Re: 2.16.0: /fromproperty #'header:piece geht nicht in HeaderMarkup
Beitrag von: martinmagtenor am Sonntag, 27. April 2014, 22:42
Das Thema lässt mir keine Ruhe und der Leidensdruck steigt ...

In der Zwischenzeit habe ich dies und das über Lilypond gelernt und verstehe die Problematik besser.

Also weiterhin keine einfache Lösung? Zumindest ohne Verständnis dieser verzögerten Auflösung (Wer oder was löst sie aus? Und wann?) ist hier kein Staat zu machen. Ich denke, hier kommt der in C++ geschriebene Lilypond-Kern ins Spiel.

Irgendwelche An- und Einsichten zum Thema? Entwickler-Doku?

Grüße
  Martin