\markup innerhalb von Funktion ergibt Fehlermeldung

Begonnen von YoMannnn, Samstag, 1. August 2020, 08:57

« vorheriges - nächstes »

YoMannnn

Hallo zusammen!

Ich bin seit einigen Monaten begeisteter Lilypond Nutzer (Schlagzeugnoten) und benötige das neue PDF-Bookmark Feature in v2.21.  Innerhalb der Regressiontests habe ich ein Beispiel gefunden, was wunderbar funktioniert!

Bin jetzt aber über zwei Dinge gestolpert:

1)  solbald ich  `\bookpart {}` nutze, werden keine PDF-Bookmarks mehr erstellt.  Soll ich in Minimalbeispiel erstellen oder da muss ich mich ein bißchen in Geduld üben, bis das Feature von der Entwicklerversion in die  stablile Version "gewandert" ist?

Nun zur eigentlichen Frage 2)
Die Zeile \markup \bold \fill-line { "Hello World." }  innerhalb einer Funktion erzeugt diese Fehlermeldung
Fehler: Beschriftung außerhalb von Textbeschriftung oder \lyricmode
Kann mir jemand einen Tip geben?  Vielen Dank

Code Beispiel zu Frage 2)

\version "2.21.4"

myHeader =
#(define-music-function
     (s)
     (string?)
   #{
    \tocItem \markup $s
    \markup \bold \fill-line { "Hello World." }
   #})

\book {
  %\header { tagline = ##f }
  \markuplist \table-of-contents
  \pageBreak

  \tocItem \markup "Introduction"
  \markup \bold \fill-line { "Hello World." }
  \pageBreak
  %\tocItem parentI \markup "First-level I."
  \myHeader "akjsldkfj"

  \score {
    {
      %% See Issue #5999.
      % \tocItem \markup "BUG: infinite loop if uncommented."
      c'1 \pageBreak
      \tocItem parentI.pIchildI \markup "Second level I. a"
      d'
      \mark "A" \tocItem pIchildI.pIcIgrandchildI \markup "Third level I. a, 1"
      e'
      \pageBreak
    }
  }
  \pageBreak
  \tocItem parentII \markup "First-level II."
  \score {
    <<
      \new Devnull {
        R R \pageBreak
        \tocItem parentII.pIIchildI \markup "The end"
        R \bar "|."
      }
      %% This will appear in the TOC after the previous entry,
      %% but before it in the PDF outline.
      { e' \tocItem parentII.pIIchildII \markup "Before the end" s f' }
    >>
  }
}











harm6

Hallo YoMannnn,

willkommen im Forum.

Das PDF-Bookmark Feature ist ja sehr neu, da muß man damit rechnen, daß noch Probleme zu lösen sind.
Ich beschäftige mich jetzt das erste mal damit und habe schon einiges gefunden was mir nicht zusagt (da muß ich aber noch weiter forschen und drüber nachdenken).

Eine Sache ist auf jeden Fall:
  \markuplist \table-of-contents { \tocItem \markup \underline "xy" R1 }
Dafür teste ich gerade einen patch.

Deine Funktion myHeader krankt an verschiedenen Dingen:
(1) tocItem hat ein optionales Argument und ein notwendiges.
Das optionale Argument ist vom Typ symbol-list-or-symbol?. Dieses Prädikat solltest Du dann auch verwenden und nicht string?.
(2) Im Funkions-body rufsts Du es auf mit \markup $s. Damit hast Du wiederum den Typ verändert, einfach $s genügt.

Also:

myHeader =
#(define-music-function (s) (symbol-list-or-symbol?)
  #{ \tocItem $s \markup \bold \fill-line { "Hello World." } #})


Und später dann: \myHeader "akjsldkfj" oder \myHeader akjsldkfj oder \myHeader #'akjsldkfj

Zu den bookparts bin ich noch nicht gekommen.
Aber
ZitatSoll ich in Minimalbeispiel erstellen oder da muss ich mich ein bißchen in Geduld üben, bis das Feature von der Entwicklerversion in die  stablile Version "gewandert" ist?
ist zu blauäugig gedacht.

Wie sollen die "Entwickler"denn wissen, daß es überhaupt etwas zu fixen gibt, wenn es keinen bug-report gibt? Und dazu ist ein Minimalbeispiel erforderlich. ;)

Gruß,
  Harm

YoMannnn

Hallo!

Vielen Dank für die schnelle Antwort. Ich muss die Informationen erstmal sacken lassen, um diese zu verstehen.

Gruß
Stefan

harm6

Zitat von: harm
Eine Sache ist auf jeden Fall:
  \markuplist \table-of-contents { \tocItem \markup \underline "xy" R1 }
Dafür teste ich gerade einen patch.

Siehe:
https://gitlab.com/lilypond/lilypond/-/merge_requests/299

Zitat von: harm
Zu den bookparts bin ich noch nicht gekommen.

Ich habe gestern zwar noch versucht das Problem mit den bookparts zu verstehen, aber ohne wirklichen Erfolg.
Also habe ich selbst auf der internationalen mailing-list gefragt:
http://lilypond.1069038.n5.nabble.com/No-pdf-marks-with-bookparts-td235072.html
Mal sehen, ob was dabei rauskommt.

Gruß,
  Harm

harm6

Wenn Du dem link aus meinem vorangegangenen post folgst, siehst Du, daß ich einen workaround gepostet habe der sowohl mit als auch ohne bookpart funktioniert.
Nicht nur ist das alles andere als hübsch, sondern verlangt auch manuelle Eingriffe in interne files.

Im folgenden eine Version die im file getestet werden kann, also ohne framework-ps.scm physisch zu verändern.
Du wirst vielleicht die (@@ ... ) Syntax bemerken.
Das guile-manual schreibt dazu: "should only be used as a last resort or for debugging" ...

Bevor Du den code für ernsthafte Arbeit verwendest, solltest Du ihn also sorgfältig testen. Es würde mich nicht wundern, wenn irgendwo Kollateralschäden verursacht werden.
Das Ganze funktioniert nicht für mehrere books in einem file oder wenn Du mehrere files in einem Rutsch kompilierst.
Allerdings funktionert das Inhaltsverzeichnis in diesen Fällen sowieso nicht korrekt...


\version "2.21.4"

#(define-public (my-output-framework basename book scopes fields)
  (let* ((port (make-tmpfile basename))
         (tmp-name (port-filename port))
         (outputter (ly:make-paper-outputter port 'ps))
         (paper (ly:paper-book-paper book))
         (header (ly:paper-book-header book))
         (systems (ly:paper-book-systems book))
         (page-stencils (map (@@ (scm framework-ps) page-stencil) (ly:paper-book-pages book)))
         (landscape? (eq? (ly:output-def-lookup paper 'landscape) #t))
         (page-number (1- (ly:output-def-lookup paper 'first-page-number)))
         (page-count (length page-stencils)))
    (cond-expand
      (guile-2 (set-port-encoding! port "Latin1"))
      (else))
    ((@@ (scm framework-ps) initialize-font-embedding))
    (if (ly:get-option 'clip-systems)
        (clip-system-EPSes basename book))
    (if (ly:get-option 'dump-signatures)
        (write-system-signatures basename (ly:paper-book-systems book) 1))
    (output-scopes scopes fields basename)
    (display ((@@ (scm framework-ps) file-header) paper page-count #t) port)
    ;; don't do BeginDefaults PageMedia: A4
    ;; not necessary and wrong
    ((@@ (scm framework-ps) write-preamble) paper #t port)
    ((@@ (scm framework-ps) handle-metadata) header port)
    (for-each
     (lambda (page)
       (set! page-number (1+ page-number))
       ((@@ (scm framework-ps) dump-page) outputter page page-number page-count landscape?))
     page-stencils)
    (if (ly:get-option 'outline-bookmarks)
        ((@@ (scm framework-ps)dump-pdf-bookmarks)
         (let* ((lat (ly:output-def-lookup paper 'label-alist-table)))
           (if (pair? lat)
               lat
               (ly:output-def-lookup
                   (ly:parser-lookup '$defaultpaper)
                   'label-alist-table)))
         (ly:output-def-lookup paper 'label-page-table)
         port))
    (display "%%Trailer\n%%EOF\n" port)
    (ly:outputter-close outputter)
    (postprocess-output book (@@ (scm framework-ps) framework-ps-module) (ly:output-formats)
                        basename tmp-name #f)))
                       
#(module-define! (resolve-module '(scm framework-ps)) 'output-framework my-output-framework)

#(define (set-paper-label-page-table layout pages)
  (let* ((label-table (ly:output-def-lookup layout 'label-page-table)))
    (if (null? label-table)
        (ly:output-def-set-variable!
          $defaultpaper 'label-alist-table
          (append
            (ly:output-def-lookup $defaultpaper 'label-alist-table)
            (toc-items))))))

\book {
  \paper {
    #(define (page-post-process layout pages)
      (set-paper-label-page-table layout pages))
  }
  \bookpart {
    \markuplist \table-of-contents
  }
  \bookpart {
    \tocItem x #"foo"
    \tocItem x.y #"foo-1"
    { R1 }
  }
}


HTH, denn mehr weiß ich momentan nicht...

Gruß,
  Harm