Autor Thema: Auf Seitenvariablen im Titel-Markup zugreifen  (Gelesen 1768 mal)

complanar

  • Member
Auf Seitenvariablen im Titel-Markup zugreifen
« am: Montag, 26. September 2011, 13:51 »
Hallo ihr,

Bei der erstellung eines Notenbuches habe ich in header-Block eine neue Variable number definiert, z.B.:
\header {
  number = "3"
}

Diese Nummer möchte ich im bookTitleMarkup einbinden, was auch mittels \fromproperty #'header:number einwandfrei funktioniert.

Die Sache ist nun die: Ich möchte, dass die Liednummer – je nachdem, ob sie auf einer geraden oder ungeraden Seite auftritt – entweder rechts oder links platziert wird.
Dazu habe ich mir zwei Scheme Funktionen geschrieben:

#(define (page-even layout props arg)
    (let*
      ((page (inexact->exact (chain-assoc-get 'page:page-number props #f))))
      (if (even? page)
        (interpret-markup layout props arg)
        empty-stencil)
    )
  )

  #(define (page-odd layout props arg)
    (let*
      ((page (inexact->exact (chain-assoc-get 'page:page-number props #f))))
      (if (odd? page)
        (interpret-markup layout props arg)
        empty-stencil)
    )
  )

Das Problem ist nun, dass chain-assoc-get 'page:page-number props #f immer #f zurückgibt, egal auf welcher Seite ich mich befinde. Wenn ich stattdessen chain-assoc-get 'page:page-number props 1 in der Funktion schreibe, bekomme ich immer 1. Anscheinend ist props in diesem Kontext nicht verfügbar, sodass immer der default-Wert zurückgegeben wird.

Hat jemand eine Ahnung, ob man das „importieren“ kann oder so ähnlich. Ich habe mich in der Datei scm/titling.scm umgesehen und dabei in Zeile 64 folgendes entdeckt:
(define-public ((marked-up-title what) layout scopes) ...
Bei der entprechenden Funktion für die Kopf- und Fußzeilen (Zeile 15) steht dagegen:
(define-public ((marked-up-headfoot what-odd what-even)
                layout scopes page-number is-last-bookpart is-bookpart-last-page)


Hier wird anscheinend die Variable page-number mit übergeben, die ich ja eigentlich brauche.
Kann mir da jemand helfen, oder muss ich gleich die Funktion marked-up-title komplett überschreiben? Das wollte ich eigentlich vermeiden, von wegen Update-Sicherheit usw.

Viele Grüße,
Holger

harm6

  • Member
Re: Auf Seitenvariablen im Titel-Markup zugreifen
« Antwort #1 am: Dienstag, 27. September 2011, 02:29 »
Hallo Holger,

zunächst bitte ich Dich immer einen möglichst kurzen kompilierbaren Code mit Angabe der Version zu posten! Sowas verkürzt und erleichtert die Bearbeitung! Außerdem ist es oft geeignet, das Problem zu illustrieren. Ich weiß im Moment nämlich nicht so genau was Du wie erreichen möchtest z.B.:

Zitat
Die Sache ist nun die: Ich möchte, dass die Liednummer – je nachdem, ob sie auf einer geraden oder ungeraden Seite auftritt – entweder rechts oder links platziert wird.

Links und rechts von was? Und es gibt noch andere Unklarheiten.

Aber zur Sache: Ich habe mal das markup-command \page-ref zu \text-page-ref umgearbeitet und \label eingesetzt:

\version "2.14.2"

#(define-markup-command (text-page-ref layout props label gauge default text1 text2)
  (symbol? markup? markup? markup? markup?)
  (let* ((gauge-stencil (interpret-markup layout props gauge))
         (text-stencil (interpret-markup layout props (markup #:concat (text2 "" #:hspace 2 text1))))
         (text-stencil-ext (ly:stencil-extent text-stencil X))
         (text-length (interval-length text-stencil-ext))
         (line-width (ly:output-def-lookup layout 'line-width))
         (x-ext (cons (- (/ line-width 2) 2) (+ (/ line-width 2) 2)))
         (y-ext (ly:stencil-extent gauge-stencil Y)))
         
  (ly:stencil-translate-axis
    (ly:make-stencil
     `(delay-stencil-evaluation
       ,(delay (ly:stencil-expr
(let* ((table (ly:output-def-lookup layout 'label-page-table))
       (page-number (if (list? table)
                        (assoc-get label table)
#f))
       (page-markup (if page-number (format "~a" page-number) default)))
       
(if (even? page-number)
       
  (interpret-markup layout props
  (markup #:concat (text1 #:hspace 2 text2)))
  (interpret-markup layout props
  (markup #:concat (text2 #:hspace 2 text1)))
  )))))
     x-ext
     y-ext)
     (- (/ line-width 2) (/ text-length 2)) X)
     ))

%---------------------- Test ---------------------------------------------------
     
\book {
\paper {
        print-all-headers = ##t

        bookTitleMarkup = \markup {
                \column {
                \vspace #5
                \fill-line \fontsize #6 { \fromproperty #'header:title }
                \null
                \fill-line \bold { \fromproperty #'header:subtitle }
                \vspace #15
                \italic \text-page-ref #'a " " "?" \fromproperty #'header:number \fromproperty #'header:title
                \italic \text-page-ref #'b " " "?" "NR2" "Stück B"
                }
        }
}

\pageBreak

\label #'a
                \header {
                title = "Stück A"
                subtitle = "Teil 1"
                composer = "comp. AA,aa"
                number = "NR1"
                }
        \score {
                { a'1 }
               
        }
       
\pageBreak

\label #'b

        \score {
                { b'1 }
                \header {
                title = "Stück B"
                subtitle = "Teil 2"
                composer = "comp. BB,bb"
                number = "NR2"
                }
        }
}

Das Auslesen der Seitenzahl gelang nur, weil der Weg über den stencil mittels delay führte.

Ich vermute mal, daß es nicht so ganz das ist, was Du eigentlich haben willst. Aber vielleicht hilft es wenigstens.

Gruß,
  Harm

complanar

  • Member
Re: Auf Seitenvariablen im Titel-Markup zugreifen
« Antwort #2 am: Dienstag, 27. September 2011, 13:55 »
Entschuldigung, hab diesmal ein Beispiel angehängt.

Dein Ansatz ist nicht so ganz das, was ich wollte. Ich will ja keine extra labels. Das Problem ist, dass der Titel (im Gegensatz zu den Fuß- und Kopfzeilen) intern nicht erkennen kann, ob er gerade auf einer geraden oder ungeraden Seitenzahl ausgegeben werden soll.
Im Beispiel sollte das einigermaßen erkennbar sein. Ich möchte, dass die Stücknummer beim zweiten Stück am rechten Seitenrand platziert wird. Dazu muss aber erkennbar sein, ob die Seitenzahl im Moment ungerade oder gerade ist.

Ich würde eben gern ohne die zusätzlichen labels auskommen. Abgesehen davon ließ sich dein Beispiel bei mir nicht gescheit kompilieren (auch nachdem ich die offensichtlichen Warnungen wegen \vspace korrigiert hatte). Ich verwende noch Version 2.12.3 und habe im Moment auch keine Möglichkeit upzugraden, da ich auf mehreren Rechnern arbeite, die untereinander kompatibel sein müssen, und unter Ubuntu 10.04 noch kein 2.14 verfügbar ist.

Grüße, Holger

complanar

  • Member
Re: Auf Seitenvariablen im Titel-Markup zugreifen
« Antwort #3 am: Dienstag, 27. September 2011, 14:07 »
Habe noch ein bisschen rumprobiert mit delay-stencil-evaluation und props statt layout, denn die Seitenzahl steckt ja in props.
Ich habe aber das Prinzip nicht richtig verstanden, und es funktionierte nicht oder kam zu tödlichen Fehlermeldungen.

Wenn du mir das etwas erklären könntest, dann klappt es vielleicht doch noch irgendwie.

harm6

  • Member
Re: Auf Seitenvariablen im Titel-Markup zugreifen
« Antwort #4 am: Mittwoch, 28. September 2011, 02:13 »
Hallo Holger,

nachdem ich nun genau weiß was Du anstrebst, fürchte ich Dir nicht helfen zu können. Ich habe zwar mein \text-page-ref noch gekürzt und überarbeitet damit es 2.12.3-kompatibel ist, aber es ist im bookTitleMarkup nicht sinnvoll einsetzbar. Das liegt an \label. Leider wird nur der angegebene label benutzt. Sinnvoll wäre, wenn es von einem zum anderen label springen würde. (Und die label willst Du ja sowieso nicht haben.) Ich poste es trotzdem mal, vielleicht kann jemand ja doch was damit anfangen. Wenn man im ersten bookpart bei \repeat unfold 1 {s1 \pageBreak } die Anzahl der Wiederholungen erhöht, so sieht man, daß "NR1" links oder rechts erscheint, je nach gerader oder ungerader Seitennummer. Aber das wars auch schon. Zumindest habe ich nichts weiteres damit hinbekommen. Schon wenn man einen zweiten Score mit header einfügt klappts es so nicht mehr. :(


\version "2.12.3"

#(define-markup-command (text-page-ref layout props label text1 text2)
  (symbol? markup? markup?)
  (let* ((text-stencil (interpret-markup layout props (markup #:concat (text2 text1))))
         (x-ext (ly:stencil-extent text-stencil X))
         (y-ext (ly:stencil-extent text-stencil Y)))

    (ly:make-stencil
     `(delay-stencil-evaluation
       ,(delay (ly:stencil-expr
(let* ((table (ly:output-def-lookup layout 'label-page-table))
       (label-page (and (list? table) (assoc label table)))
       (page-number (and label-page (cdr label-page))))
       
(if (even? page-number)
       
  (interpret-markup layout props
  (markup #:fill-line (#:null text1 text2)))
  (interpret-markup layout props
  (markup #:fill-line (text2 text1 #:null)))
  )))))
     x-ext
     y-ext)
     ))

%---------------------- Test ---------------------------------------------------

\book {
\paper {
  print-first-page-number = ##t
  bookTitleMarkup = \markup {
      \text-page-ref #'a
      \huge \larger \bold \larger \fromproperty #'header:title
      \fontsize #10 \bold \sans \with-color #(x11-color 'grey66)
      \fromproperty #'header:number
        }
}

\bookpart {
        \repeat unfold 1 {s1 \pageBreak }
}
\bookpart {

\label #'a


\header {
        title = "Stueck A"
        subtitle = "Teil 1"
        composer = "comp. AA,aa"
        number = "NR1"
}

        \score {
                { b'1 }
        }
}
}

Zitat
Habe noch ein bisschen rumprobiert mit delay-stencil-evaluation und props statt layout, denn die Seitenzahl steckt ja in props.
Ich habe aber das Prinzip nicht richtig verstanden, und es funktionierte nicht oder kam zu tödlichen Fehlermeldungen.

Wenn du mir das etwas erklären könntest, dann klappt es vielleicht doch noch irgendwie.

Da ich delay-stencil-evaluation hier zum allerersten mal angewendet habe und es bestenfalls halb verstanden habe, verzichte ich besser auf eine Erklärung ehe ich noch irgendeinen Unsinn verbreite.



Nachdem ich nun geschildert habe was alles nicht geklappt hat, noch ein paar Gedanken, die vielleicht weiterführen.

Du schreibst ja selbst:
Zitat
Das Problem ist, dass der Titel (im Gegensatz zu den Fuß- und Kopfzeilen) intern nicht erkennen kann, ob er gerade auf einer geraden oder ungeraden Seitenzahl ausgegeben werden soll.
Woher wissen, die header/footer das denn?
  In paper-defaults-init.ly gibts:
  %%
  %% Headers, footers, and titles
  %%
  #(define make-header (marked-up-headfoot 'oddHeaderMarkup 'evenHeaderMarkup))
  #(define make-footer (marked-up-headfoot 'oddFooterMarkup 'evenFooterMarkup))

  #(define-public book-title (marked-up-title 'bookTitleMarkup))
  #(define-public score-title (marked-up-title 'scoreTitleMarkup))
  #(define-public score-title-properties
     '((is-title . #t)
       (is-book-title . #f)))
  #(define-public book-title-properties
     '((is-title . #t)
       (is-book-title . #t)))

  \include "titling-init.ly"
Das marked-up-headfoot ist das wichtige hier. Die Definition hierfür findet sich in titling.scm (hast Du schon geschrieben, ich fasse es aber nochmal in einen anderen Zusammenhang).

Die Argumente von
(define-public ((marked-up-headfoot what-odd what-even)
                layout scopes page-number is-last-bookpart is-bookpart-last-page) ...

beinhalten auch die gesuchte page-nuber!
Diese Argumente führen jedoch zu page.scm.

Tja, und hier wird es mir zuviel ;) Eine solche Verschachtelung von files und und Definitionen ist für mich dann irgendwann nicht mehr zu durchschauen.

Tut mir leid.

Aber ich wünsche Dir natürlich viel Erfolg. An einem Ergebnis wäre ich dann sehr interessiert.

Gruß,
  Harm

P.S.
Zitat
Ich verwende noch Version 2.12.3 und habe im Moment auch keine Möglichkeit upzugraden, da ich auf mehreren Rechnern arbeite, die untereinander kompatibel sein müssen, und unter Ubuntu 10.04 noch kein 2.14 verfügbar ist.

Das ist nicht so ganz richtig. Die synaptic bietet zwar nur 2.12.3 aber man kann 2.14.2 natürlich direkt herunterladen und manuell installieren. Ich benutze selber Ubuntu 10.04 und bin so verfahren.