Seitennummer nach Inhaltsverzeichnis zurücksetzen [GELÖST]

Begonnen von martinmagtenor, Donnerstag, 28. November 2024, 22:15

« vorheriges - nächstes »

martinmagtenor

Die Digitalisierung, an der ich arbeite, ist schon weit fortgeschritten. Das geht in Richtung 200 Seiten. Das Inhaltsverzeichnis wird entsprechend lang (um 5 Seiten, da es um Orgelnoten geht, alles im Querformat).

Nun ist es durchaus üblich, dass der Vorspann eines Werks mit dem Inhaltsverzeichnis eine eigene Seitennummerierung, häufig mit römischen Zahlen, bekommt. Und der eigentliche Inhalt beginnt dann mit der Seite 1 in arabischer Darstellung.

Lilypond kann Zahlen in römischer Darstellung ausgeben (page-number-type = #'roman). Das Einzustellen passiert in \paper { ... }, genauso wie das Setzen der ersten Seitenzahl. So, wie ich Lilypond verstehe gilt \paper { ... } aber für das ganze Dokument! Und das schließt dann das Zurücksetzen der Seitenzahl unterwegs auf 1 aus und ebenso die Änderung der Darstellung von römischen Zahlen auf Arabische.

In \layout kann man ausgewählte paper-Variablen verwenden, aber eben nicht die für die Seitennummerierung.

Oder habe ich etwas übersehen?

Gibt es einen Trick, das zu überwinden?


Die Struktur der Dokumentquellen sieht so aus:

\version ...

% allgemeine Deklarationen paper

% Dann schließen sich Gruppen aus includes und bookparts an. Skizze:

\include "noten_1.ly"
\include "noten_2.ly"
...
\bookpart {
  \include "score_u_a_1.ly"
  \include "score_u_a_2.ly"
  ...
}

\include "noten_3.ly"
\bookpart {
  \include "score_u_a_3.ly"
}

... usw.

Das jeweilige \header + \tocItem steckt dann in den score-Dateien.

So bleibt alles schön übersichtlich. Die Dateinamen sind natürlich "sprechender" und in jeweiligen Unterordnern angesiedelt. So kann ich die Dateien (alias Stücke) einzeln Versionieren usw.

Danke und Grüße
Martin


martinmagtenor

Hallo Harm,

vielen Dank. Zu Deiner Frage: Ja und Nein.

Einerseits habe ich dadurch gelernt, dass man innerhalb eines bookpart auch paper verwenden darf und das auch wirkt. Aber es entstehen komische Effekte.

Beispiel: Das Inhaltsverzeichnis wird am Anfang des Dokuments ausgegeben. In den Bookparts gibt es jeweils ein

\paper {
  bookpart-level-page-numbering = ##t
  print-first-page-number = ##t
}

Dann wird in jedem so ausgestatteten bookpart wieder bei 1 zu zählen begonnen. Im Inhaltsverzeichnis werden die Seitenzahlen der bookparts ausgewiesen, was wenig hilfreich ist, weil man dann sehr viele Seiten 1 hat, aber das ist im Moment egal. Aber wenn man dann in dem PDF auf die Seitenzahl klickt, z.B. die 1, dann wird die "globale Seite 1" angesprungen, also die Seite, auf der das Inhaltsverzeichnis beginnt.

Mein vorläufiges Fazit: Inhaltsverzeichnis, bookpart und die Einstellung bookpart-level-page-numbering = ##t ergeben zusammen kein sinnvolles Resultat.

Hinsichtlich meines Ziels bringt mich das nicht weiter.

Oder könnte man das Inhaltsverzeichnis in einen bookpart packen?

Zumindest auf den ersten Blick ergibt das einen Fortschritt. Das Inhaltsverzeichnis enthält die richtigen Seitenzahlen. Aber das Klicken im PDF springt nicht an die referenzierte Seite des PDF-Dokuments sondern an die angegebene Blattnummer und liegt dann um die Anzahl der Seiten im Inhaltsverzeichnis daneben.

Wenn man dann noch in dem diesem Inhaltsverzeichnis-Bookpart in dem paper-Block page-number-type = #'roman einträgt, hat man römische Seitenzahlen und ein Inhaltsverzeichnis, in dem auch alle Seitenzahlen römisch dargestellt sind. Irgendwie unpraktisch. Ob das gewollt oder ein Bug ist? Denn die Seitenzahlen der Seiten, auf die verwiesen wird, sind in arabischer Schreibweise dargestellt.

Grüße
 Martin

martinmagtenor

Ich habe nun eine für mich taugliche Lösung gefunden. Damit erreiche ich, dass das Inhaltsverzeichnis römische Seitenzahlen im Header (oder Footer) bekommt und der eigentliche Inhalt mit der Seitenzahl 1 beginnt, ohne dass das Inhaltsverzeichnis selber mit römischen Seitenzahlen erzeugt wird. Ursache für Letzteres ist, dass fromproperty beim Zugriff auf page:page-number-string die Seitenzahl als String gemäß Parameter (page-number-type = #'roman) erhält. Da kann nicht mehr unterschieden werden, ob die aktuelle Seitenzahl des Inhaltsverzeichnisses ausgegeben werden soll oder die Seitenzahl als Verweis auf eine Stelle im Dokument.

Was bleibt, ist der Umstand, dass die Navigation im PDF-Dokument über die als Link ausgestalteten Inhaltsverzeichniseinträge weiterhin um den Offset der Seitenanzahl des Inhaltsverzeichnisses nicht stimmt. Und ob ich da ran komme, überblicke ich im Moment nicht. Das lagere ich in ein eigenes Problem/Frage aus.

Zurück zu den Seitenzahlen in römischer Schreibweise. Die ersten Versuche, in den Header-Definitionen (oddHeaderMarkup und Co) die Darstellung der Seitenzahl zu ändern ist fehlgeschlagen. Das liegt schlicht daran, dass dort die Seitenzahl als String abgerufen wird (\fromproperty #'page:page-number-string). Man könnte auf die Idee kommen, einfach die Zahl abzurufen (#'page:page-number). Das erzeugt keinen Fehler ist aber erfolglos.

Nach etwas Suchen ist mir klar geworden, woran das liegt. Die Definition von \fromproperty sieht die Rückgabe anderer Datentypen als String/Markup nicht vor, dann wird einfach ein leeres Stencil zurückgegeben. Und in einem leeren Stencil ist keine Seitenzahl enthalten, also kann man da nichts machen.

Meine Lösung ist nun ein angepasstes \fromproperty. Das muss einen anderen Namen bekommen. Ich habe mich für \number-fromproperty entschieden. Eigentlich müsste man die Spezialisierung hinten anhängen, das wäre dann fromproperty-number. Da die eigentliche Semantik von fromproperty mit get-string-from-property beschrieben ist, ist number-fromproperty nach meinem Verständnis "näher".

Und so sieht der modifizierte Scheme-Code aus:

#(define-markup-command (number-fromproperty layout props symbol type)
 (symbol? symbol?)
 #:category other
 #:as-string (markup-string
        (chain-assoc-get symbol props)
        #:layout layout
        #:props (prepend-alist-chain
              symbol
              (make-property-recursive-markup symbol)
              props))
 (let ((m (chain-assoc-get symbol props)))
   (if (number? m)
       ;; prevent infinite loops by clearing the interpreted property:
       (interpret-markup layout
                         (prepend-alist-chain
                          symbol
                          (make-property-recursive-markup symbol)
                          props)
                       (number-format type m))
       empty-stencil)))

Der Aufruf sieht dann so aus, dass man einen zusätzliches Argument mit gibt, das den Nummerntyp, hier roman, bestimmt. Damit lassen sich dann die oddHeaderMarkup und evenHeaderMarkup-Definitionen beispielsweise so modifizieren:

oddHeaderMarkup = \markup \fill-line {
  ""
  \unless \on-first-page-of-part \fromproperty #'header:title
  \if \should-print-page-number \number-fromproperty #'page:page-number #'roman
}
evenHeaderMarkup = \markup \fill-line {
  \if \should-print-page-number \number-fromproperty #'page:page-number #'roman
  \unless \on-first-page-of-part \fromproperty #'header:title
  ""
}

Ausblicke:
  • Das ursprüngliche fromproperty mit einem case-Statement anstelle des if ertüchtigen ...
  • Offen, also noch zu lösen, ist das Seiten-Offset-Problem. Aber das ist eine andere Baustelle.

harm6

Hallo Martin,

bevor wir weiter dran arbeiten...
Wenn ich dein Projekt richtig verstanden habe, so hat es folgende Teile (in dieser Reihenfolge):

(1) Titelblatt (ohne Seitenzahl)
(2) Inhaltsverzeichnis (ohne Seitenzahlen)
(3) Vorwort (mit römischen Seitenzahlen)
(4) Teile mit der Musik (arabische Seitenzahlen)

Ich würde im Inhaltsverzeichnis gerne auch die römischen Ziffern für das Vorwort bzw arabische Zahlen für die Musikteile sehen.
Das Vorwort würde ich wohl mit Seite I beginnen.
Den Musikteil würde ich mit Seite 1 beginnen lassen wollen und ab da auch weitere Musikteile weiterzählen. (Also Musik-Teil 1 endet z.B. auf Seite 9, der zweite Teil beginnt dann auf Seite 10.
Diese Seitenzahlen sollen so auch im Inhaltsverzeichnis gedruckt werden.

Allerdings muss die interne Verlinkung funktionieren und nicht zur gedruckten Seitenzahl sondern zur richtigen PDF-Seitenzahl führen.

Das wäre mein Ziel. Siehst du das auch so? Oder falls nicht, wo weichst du wie davon ab?

Gruß,
  Harm


martinmagtenor

Hallo Harm,

vielen Dank.

Fast, kleine Korrektur: Über ein Titelblatt habe ich noch nicht nachgedacht, genauso wenig über ein Vorwort, das ist aktuell nicht vorhanden. Aktuell habe ich diese Struktur:

  • Titel mit Inhaltsverzeichnis, in dem die Seitenzahlen in römischer Schreibweise ausgegeben werden, beginnend bei 1 dargestellt als i.
  • Alle Teile mit Musik, mit Seitenzahlen, beginnen bei eins in arabischer Schreibweise und laufen dann durch.

Strukturell ist das so gestaltet: Jeder Musikteil, in dem durchaus mehrere Kompositionen gesammelt sein können (zum gleichen Lied des Gesangbuchs), in einem bookpart.

Damit das Inhaltsverzeichnis mit einer Seitenzählung ab 1 beginnt, ist dieses auch als eigener bookpart vorangestellt. Das funktioniert prima. Auch, dass der erste Musik-Bookpart dann auf einer ungeraden Seite mit Seite 1 beginnt.

Die römischen Darstellung der Seitenzahlen des Inhaltsverzeichnis habe ich hinbekommen.

Es bleibt das Offset-Problem: Wenn ich im Inhaltsverzeichnis auf irgendeine Seitenzahl im Inhaltsverzeichnis klicke, springt der das Programm (bei mir evince unter Linux) auf die Blattnummer des Dokuments. Klicken auf Seite 1 im Inhaltsverzeichnis springt also auf die erste Seite des PDF, aktuell die Seite, in der der erste Bookpart mit dem Inhaltsverzeichnis beginnt.

Wäre es nicht sinnvoll, dieses Thema in einer eigenen Frage zu behandeln? Denn das im Betreff genannte Thema ist gelöst. Das könnte ich dann auch mit einem "minimalen" Beispiel ausstatten.

Grüße
  Martin

harm6

Ich bin mir immer noch nicht sicher was genau du haben willst.
Ein minimal muss her, zum Beispiel das unten stehende. Was ist noch falsch?
\version "2.24.3"

\paper {
  first-page-number = #0
}
\bookpart {
  \paper {
    page-number-type = #'roman-lower
  }
  \markuplist \table-of-contents
}
\bookpart {
  \tocItem \markup "Score-1"
  \score { { c'1 \pageBreak 1 } }
}
\bookpart {
  \tocItem \markup "Score-2"
  \score { { d'1 \pageBreak 1 } }
}

ZitatWäre es nicht sinnvoll, dieses Thema in einer eigenen Frage zu behandeln? Denn das im Betreff genannte Thema ist gelöst.
Da bin ich mir nicht so sicher...
Je nachdem was du wie gemacht hast hängt dieser "offset" direkt mit diesem Problem zusammen.
Und ist je nachdem nicht so einfach zu korrigieren.
Siehe auch:
https://gitlab.com/lilypond/lilypond/-/issues/6696
https://gitlab.com/lilypond/lilypond/-/issues/6697

Gruß,
  Harm

martinmagtenor

Hallo Harm,

Das Problem des Zurücksetzens der Seitenzahlen nach dem Inhaltsverzeichnis hatte ich durch Einbetten des Inhaltsverzeichnisses in ein bookpart mit eigener paper-Umgebung gelöst. Dadurch wirkt sich die Seitenzählung im Inhaltsverzeichnis nicht auf den globalen Seitenzähler aus.

Das war das Thema bzw. der Anlass für diesen Thread hier. Und das ist gelöst.

Das römische-Zahlen-Problem im Inhaltsverzeichnis war eigentlich auch schon ein eigenes, aka zweites, Thema.

Und ich bleibe bei der Ansicht, dass das Seitenzahlen-Offset-Problem ein eigenes Thema ist. Und man sollte nicht zu viele verschiedene Themen in einen Thread packen. D.h. ich werde ein neues Thema beginnen, auch, wenn es eine Fortsetzungsgeschichte ist.


Danke für die Links. Ja, die beiden Tickets decken sich mit meinen Beobachtungen.

Grüße
  Martin