instrument im bookTitleMarkup und odd-/evenHeaderMarkup

Begonnen von Köbi, Mittwoch, 4. Oktober 2017, 12:28

« vorheriges - nächstes »

Köbi

Hallo zusammen

In einem anderen Beitrag hat mir Harm aufgezeigt, wie ich in einer Bookpart-Function das Anzeigen des Instruments steure. Was ich nicht bedacht habe, ist, dass die vertikalen Positionen so gar nicht stimmen. Auch habe ich herausgefunden warum und beschlossen, dass die saubere Lösung darin besteht, direkt bookTitleMarkup und die odd-/evenHeaderMarkup entsprechend anzupassen. Leider scheitere ich wieder mal an der Syntax...

Folgendes Minimal-Beispiel funktioniert, macht aber (noch) nicht das, was ich möchte. Die zwei Probleme, die ich habe, sind direkt als Kommentare reingeschrieben:

\version "2.19.65"

\paper {
  bookTitleMarkup =
  \markup {
    \column {
      \fill-line {

        % Problem 1: Hier müsste eine Bedingung rein, dass 'instrument' nur angezeigt werden soll, wenn 'title' gesetzt ist.
        { \box \pad-around #1 \fromproperty #'header:instrument }
       
        { \huge \larger \larger \bold \fromproperty #'header:title }
        { \null }
      }
    }
  }
 
  oddHeaderMarkup = \markup
  \fill-line {
    ""
   
    % Problem 2 (gilt auch für evenHeaderMarkup): Statt '#not-part-first-page' sollte hier
    % eine Bedingung rein, dass 'instrument' nur angezeigt wird, wenn 'title' nicht gesetzt ist.
    \on-the-fly #not-part-first-page \fromproperty #'header:instrument
   
    \on-the-fly #print-page-number-check-first \fromproperty #'page:page-number-string
  }
 
  evenHeaderMarkup = \markup
  \fill-line {
    \on-the-fly #print-page-number-check-first \fromproperty #'page:page-number-string
   
    % Problem 2 -> siehe evenHeaderMarkup
    \on-the-fly #not-part-first-page \fromproperty #'header:instrument
   
    ""
  }
}


\header {
  instrument = "Instrument1"
}

\bookpart {
  \header { title ="Title1" }
  { c'1 \pageBreak d' }
}
\bookpart {
  { e'1 \pageBreak f' \pageBreak g' }
}

Das Problem ist die Seite 3. Statt der Box aus dem bookTitleMarkup sollte dort der Instrument-Text aus dem odd-/evenHeaderMarkup erscheinen.

Für Problem 1 wäre meine Lösung wie folgt:

        {
          #(
             if (string-null? (markup->string ??? \fromproperty #'header:title ???))
             ""
             (markup #:box #:pad-around 1 ??? \fromproperty #'header:instrument ???)
          )
        }

Leider habe ich es nicht hinbekommen, auf die Properties zuzugreifen. Wie mache ich das?

Zu Problem 2: In der Syntax von "\on-the-fly" habe ich gesehen, dass der erste Parameter "procedure" ist. Da hätte ich eine "condition" erwartet. Wie baue ich hier eine normale Bedingung ein? Und wie greife ich auf das Property zu? Mein Pseudo-Code dazu:

\on-the-fly ??? (not (string-null? (markup->string \fromproperty #'header:title))) ??? \fromproperty #'header:instrument


Gruss, Köbi

harm6

Hallo,

Dein Versuch ein fromproperty-markup auszulesen funktioniert so nicht. Selbst bei Erfolg führt das nur zum symbol 'header:instrument.
Du willst ja eher den Inhalt haben. Der ist aber in den props versteckt.
Wenn Du die props hast geht:
(chain-assoc-get 'header:title props)
Das macht man am besten in einem markup-command oder markup-list-command.

Z.B.:

\version "2.19.65"

#(define-markup-list-command (tst-I layout props)()
  (let ((title (chain-assoc-get 'header:title props))
        (lst
          (list
          #{
            \markup { \box \pad-around #1 \fromproperty #'header:instrument }
          #}
          #{
          \markup { \huge \larger \larger \bold \fromproperty #'header:title }
          #})))
    ;(display-scheme-music props)
    ;(display-scheme-music (chain-assoc-get 'header:title props))
   
    (interpret-markup-list layout props
      (if title
          lst
          (last-pair lst)))))
         
#(define-markup-list-command (tst-II layout props)()
  (let ((title (chain-assoc-get 'header:title props))
        (lst
          (list
          #{
            \markup \fromproperty #'header:instrument
          #})))
    ;(display-scheme-music props)
    ;(display-scheme-music (chain-assoc-get 'header:title props))
   
    (interpret-markup-list layout props
      (if title
          (list "")
          lst))))

\paper {
  bookTitleMarkup =
  \markup {
    \column {
      \fill-line {
      \tst-I
      % Problem 1: Hier müsste eine Bedingung rein, dass 'instrument' nur angezeigt werden soll, wenn 'title' gesetzt ist.
        { \null }
      }
    }
  }

  oddHeaderMarkup = \markup
  \fill-line {
    ""
   
    % Problem 2 (gilt auch für evenHeaderMarkup): Statt '#not-part-first-page' sollte hier
    % eine Bedingung rein, dass 'instrument' nur angezeigt wird, wenn 'title' nicht gesetzt ist.
    %\on-the-fly #not-part-first-page \fromproperty #'header:instrument
    \tst-II
    \on-the-fly #print-page-number-check-first \fromproperty #'page:page-number-string
  }

  evenHeaderMarkup = \markup
  \fill-line {
    \on-the-fly #print-page-number-check-first \fromproperty #'page:page-number-string
   
    % Problem 2 -> siehe evenHeaderMarkup
    %\on-the-fly #not-part-first-page \fromproperty #'header:instrument
    \tst-II
   
    ""
  }
}


\header {
  instrument = \markup \with-color #red "Instrument1"
}

\bookpart {
  \header { title ="Title1" }
  { c'1 \pageBreak d' }
}
\bookpart {
  { e'1 \pageBreak f' \pageBreak g' }
}


Dieser Code erfüllt alle von Dir genannten Bedingungen, allerdings glaube ich die Bedingungen waren nicht hinreichend präzise.
Schau Dir Seite 2 an. ;)

Gruß,
  Harm

Köbi

Hallo Harm

Uff, das ist mal wieder eine Lösung, auf die ich nie gekommen wäre :-( Immerhin kann ich den Code soweit nachvollziehen, Danke!

Zitat von: harm6 am Mittwoch,  4. Oktober 2017, 23:25
Dieser Code erfüllt alle von Dir genannten Bedingungen, allerdings glaube ich die Bedingungen waren nicht hinreichend präzise.
Schau Dir Seite 2 an. ;)

Du hast natürlich recht ;-)  Das Problem ist in "tst-II" das "if" am Schluss. Statt "if title" müsste es dort heissen "if (and title ???part-first-page???)". Leider habe ich es trotz zwei Stunden suchen und probieren wieder einmal nicht geschafft, die richtige Syntax raus zu finden :-( Wie komme ich an dieser Stelle an das "part-first-page"?

Gruss, Köbi

Malte

#3
Du brauchst erstens das Prädikat part-first-page? (mit Fragezeichen), nicht die Funktion part-first-page. Und zweitens ist das nicht öffentlich definiert in titling-init.ly.

Also entweder (das ist die kürzeste, aber nicht sehr elegante Version)
\include "titling-init.ly"
oder wie im Folgenden die Definition kopieren und dann verwenden:% aus titling-init.ly übernommen, weils dort nicht öffentlich definiert ist
#(define (part-first-page? layout props)
   (= (chain-assoc-get 'page:page-number props -1)
      (ly:output-def-lookup layout 'first-page-number)))

#(define-markup-list-command (tst-II layout props)()
   (let ((title (chain-assoc-get 'header:title props))
         (lst
          (list
           #{
             \markup \fromproperty #'header:instrument
           #})))
     (interpret-markup-list layout props
       (if (and title (part-first-page? layout props))
           (list "")
           lst))))

Alternativ kannst du natürlich auch die Definition sparen und nur den relevanten Teil kopieren:
#(define-markup-list-command (tst-II layout props)()
   (let ((title (chain-assoc-get 'header:title props))
         (lst
          (list
           #{
             \markup \fromproperty #'header:instrument
           #})))
     (interpret-markup-list layout props
       (if (and title
                (= (chain-assoc-get 'page:page-number props -1)
                   (ly:output-def-lookup layout 'first-page-number)))
           (list "")
           lst))))

Köbi

Hallo Malte

Vielen Dank, jetzt funktioniert's, wie's soll!

Gruss
Köbi