Bookparts immer auf gerader Seite beginnen lassen

Begonnen von martinmagtenor, Donnerstag, 27. Februar 2025, 22:09

« vorheriges - nächstes »

martinmagtenor

Hallo,

es geht um eine Sammlung von Orgelnoten (~ 200 Seiten, um die 90 Bookparts). Die werden üblicherweise im Querformat gedruckt. Und zum Einsparen von Blätterstellen sollen die Bookparts links, also auf der geradzahligen Seite beginnen.

Um nicht alle Bookparts mit ungerader Anzahl Seiten von Hand mit einem pageBreak versehen zu müssen (da schimmert der bequeme Programmierer durch), dachte ich, es wäre nett, wenn man in einem evenFooterMarkup einen Test auf die letzte Seite im Bookpart (\on-last-page-of-part) einbetten würde, um einen Seitenumbruch auszulösen.

Aber kann man in einem Markup überhaupt einen Seitenumbruch auslösen? Ich habe jedenfalls nichts dazu gefunden.

Falls nein, kann man im Score-Kontext einen Test in der Art \on-last-page-of-part verwenden? Dann bräuchte man aber neben dem Test auf die letzte Seite im bookPart auch noch den Test auf gerade bzw. ungerade. Wobei das mit dem Scheme-Operator even? kein Problem sein sollte, sobald man an die aktuelle Seitenzahl herankommt.

Bin für jeden Hinweis dankbar.

Martin

Lilysetter

Ich nenne nur einige Stichpunkte, anhand derer Du weiter recherchieren / probieren kannst:
\paper-Variablen f¨ur zweiseitigen Satz
Standardwerte (vor der Skalierung) sind definiert in ly/paper-defaults-init.ly.
two-sided
.....
blank-last-page-penalty
    Die Strafpunkte, wenn eine Partitur auf einer ungeraden Seite beendet wird. Standard: 0.
blank-page-penalty
......
\paper-Variablen f¨ur Seitenzahlen
Standardwerte, die hier nicht aufgelistet sind, finden sich in ly/paper-defaults-init.ly
auto-first-page-number
.......
In diesem Beispiel aus notation.pdf kommt die aktuelle Seitennummer als String vor:
oddFooterMarkup = \markup {
  \fill-line {
    \if \should-print-page-number
    \fromproperty #'page:page-number-string
    }
  }

Kommst Du damit weiter?

martinmagtenor

Vielen Dank, die genannten Parameter kannte ich schon. Danke für den Verweis auf paper-defaults-init.ly, da habe ich noch nicht reingeschaut. Vielleicht schlummert darin noch etwas. [...] leider nicht.

Die mir bisher bekannten Parameter helfen nicht weiter, denn ich will ja vermeiden jeden Einzelfall von Hand bearbeiten zu müssen.

Mir wäre schon geholfen, wenn man einem Bookpart, vom ersten abgesehen, beibringen könnte, pauschal immer auf der linken (geraden) Seite zu beginnen. Oder umgekehrt in einem evenFooterMarkup mit einem Test auf die letzte Seite einen Seitenwechsel auszulösen. Deshalb die Frage, ob man in einem Markup überhaupt einen Seitenwechsel auslösen kann! Geht das? Wenn ja wie?

Dann würde man in einer verkleinerten Übersichtsdarstellung schnell erkennen, wenn irgendwo leere Seiten sind und die beteiligten Bookparts dann individuell betrachten und nötigenfalls bearbeiten.

Mir ist vollkommen klar, dass ich um eine individuelle Betrachtung der einzelnen Bookparts nicht herumkomme, denn bisweilen sind auch inhaltliche oder ästhetische Aspekte zu beachten, denen sich das Layout dann unterordnen muss.

harm6

ZitatMir wäre schon geholfen, wenn man einem Bookpart, vom ersten abgesehen, beibringen könnte, pauschal immer auf der linken (geraden) Seite zu beginnen.

Ich weiss nicht wie das gehen könnte.

ZitatDeshalb die Frage, ob man in einem Markup überhaupt einen Seitenwechsel auslösen kann!

Dazu weiss ich auch nichts.

Aber, vielleicht helfen dir ein paar ausgelesene Daten, denn wenn ein bookpart auf ungerader Seite anfängt, dann hat der vorangegangene ja eine ungerade Anzahl von Seiten (den allerersten bookpart mal ausgeklammert).

\paper {
  counter = 1
  #(define (page-post-process layout pages)
    (let* ((page-count (length pages)))
      (format #t "\n\tbookpart ~a has ~a page(s)~a"
        counter
        page-count
        (if (odd? page-count) ", i.e. an uneven amount of pages" ""))
      (set! counter (1+ counter))))
}

\bookpart {
  \header { title = "MYBOOK" }
  \markup \null
}
\bookpart {
  \header { instrument = "bookpart 3 pages" }
  \repeat unfold 3 { R1 \pageBreak }
}
\bookpart {
  \header { instrument = "bookpart 2 pages" }
  \repeat unfold 2 { R1 \pageBreak }
}

führt zu:
 
Zitat von: terminalProcessing `file.ly'
Parsing...
Interpreting music...
Preprocessing graphical objects...
Interpreting music...
Preprocessing graphical objects...
Finding the ideal number of pages...
Fitting music on 1 page...
Drawing systems...
   bookpart 1 has 1 page(s), i.e. an uneven amount of pages
Finding the ideal number of pages...
Fitting music on 2 or 3 pages...
Drawing systems...
   bookpart 2 has 3 page(s), i.e. an uneven amount of pages
Finding the ideal number of pages...
Fitting music on 1 or 2 pages...
Drawing systems...
   bookpart 3 has 2 page(s)
Converting to `file.pdf'...
Success: compilation successfully completed


HTH,
  Harm


martinmagtenor

Danke für den Hinweis auf page-post-process und die Idee, sich da einzuhängen. Mal sehen ...

Martin

martinmagtenor

Und hier ist nun meine Version.

\paper {
  counter = 1
  last-pagenum-of-bookpart = 0
  #(define (page-post-process layout pages)
    (let* ((page-count (length pages)))
           (if (and (> last-pagenum-of-bookpart 0) (> page-count 1) (odd? (+ 1 last-pagenum-of-bookpart)))
           ; Ein bookpart, das nur aus einer Seite besteht, ist unkritisch.
           (format #t "\tbookpart ~a hat ~a Seiten und beginnt auf ~a Seite ~a\n"
                  counter
                  page-count
                  (if (odd? (+ 1 last-pagenum-of-bookpart)) "ungerader" "gerader")
                  (+ 1 last-pagenum-of-bookpart)
            )
           )
           (set! last-pagenum-of-bookpart (+ last-pagenum-of-bookpart page-count))
           (set! counter (1+ counter))
     )
    )
}

Die Variable last-pagenum-of-bookpart hilft zu erkennen, ob das nächste Bookpart auf einer geraden oder ungeraden Seite beginnt.

Das ist natürlich nicht perfekt, hat aber sehr geholfen. Und damit steht die Frage im Raum: Was könnte noch mehr helfen?

Da denke ich an einen bedingten Seitenumbruch. Beispielsweise \condPageBreak dem man einen Bedingungsausdruck mit gibt oder \newPageIf ...

Diese Art von Automatismus würde noch kein perfektes Ergebnis liefern, aber die entstehenden Leerräume fallen einem leicht ins Auge und erleichtern so, den Handlungsbedarf zu identifizieren.

Martin