Fußnote mit mehreren Bezugspunkten

Begonnen von ValidUserName, Donnerstag, 12. Dezember 2019, 17:21

« vorheriges - nächstes »

ValidUserName

Hier ein Bischen äußerst mangelhaften Ausgangscodes:
\version "2.19.83"

\new \Staff {
  \footnote "*" #'(0 . 5) "Note this note of note" c'
  \footnote "*" #'(0 . 1) "Note this note of note" c''
}


Nun habe ich folgende Fragen/Probleme:

  • Warum wird der Stern (oder welches Symbol auch immer) nicht in der Fußzeile angezeigt?
  • Wie kann ich nur eine Fußnote mit mehreren Referenzpunkten im Notentext erzeugen?
  • Idealerweise würde ich die Fußnote dann auch nur einmal vorweg als z.B. fnI = ...   spezifizieren müssen und si dann einfach im Notentext an den entsprechenden Stellen aufrufen.
  • Wie kann ich die Verbindungslinie loswerden, so dass ich nur den Stern über oder unter der Note stehen habe?
  • Jedesmal eine relative Position angeben zu müssen ist auch ein wenig lästig. Für meine Zwecke wäre es besser, wenn der Stern einfach jedes Mal in einem festen Abstand über/unter dem Notensystem stünde.

harm6

#1
Hallo,

Fußnoten sind ein schwieriges Thema, sieht man ja schon an der überwältigenden Anzahl der bislang eingegangenen Antworten.

Das Problem besteht u.a. darin, daß die Fußnoten in der Musik angegeben werden, aber am unteren Ende der Seite auftauchen sollen.

Also haben wir nicht nur mit dem grob FootnoteItem bzw FootnoteSpanner zu tun, sondern auch mit dem Seitenlayout.
Tatsächlich drehen sich in page-layout-problem.cc die ersten 400 Zeilen (und damit rund ein drittel des gesamten files) um footnotes.

Da das ja in C++ passiert haben wir kaum Möglichkeiten Dinge zu modifizieren.
Bei meiner Recherche habe ich auch nicht herausfinden können wie, wann und wo ich Sachen wie 'footnote-stencil, 'in-note-stencil, 'number-footnote-table, 'footnotes auch nur auslesen kann.

Zahlreiches ist auch undokumentiert, wie
footnote-padding
footnote-footer-padding
footnote-number-raise
footnote-separator-markup ist Dank Malte jetzt dokumentiert.
Aber für nichts davon gibt es regression-tests.
Für footnote-numbering-function gibt es immerhin einen regtest, aber es ist wiederum undokumentiert, daß es zum default `numbered-footnotes` die vordefinierte Alternative `symbol-footnotes` gibt.
Apropos regression-test, für gewöhnlich such ich die docs durch, dann den source-code, erst scm-files dann die regtest und wenn nichts hilft mitunter auch die cc-files.
Ich mußte feststellen, daß diverse regtest für FootnoteItem/Spanner nicht mehr wie gewollt arbeiten und hab dann einen patch geschrieben
https://sourceforge.net/p/testlilyissues/issues/5640/
(hilft Dir hier aber nicht)
Ich könnte noch ne zeitlang so weiter machen...

Aber zusammenfassend kann man sagen, es ist viel zu viel nicht dokumentiert.

Ansonsten ist die Ganze Implementierung schwerfällig, nicht umsonst gibt es:
https://sourceforge.net/p/testlilyissues/issues/2561/

Aber jetzt konkreter zu Deinen Fragen:
ZitatWarum wird der Stern (oder welches Symbol auch immer) nicht in der Fußzeile angezeigt?
Kurz gesagt: das ist nicht vorgesehen, siehe die definition von \footnote in music-functions-init.ly
Sobald Du eine eigene "mark" (den Stern) verwendest, erscheint diese in der Musik, aber nicht am Seitenende
Die NR zeigt eine Art workaround (ohne es solchen zu kennzeichnen)
Man muß die footnote-numbering-function austricksen, die Nummer der Fußnote nicht zu schreiben. Obs besser geht weiß ich nicht, ich häng schon Stunden an diesem Problem und brauch ne Pause (ich schreib nur noch diesen post fertig)

ZitatWie kann ich nur eine Fußnote mit mehreren Referenzpunkten im Notentext erzeugen?
Da hab' ich noch wie vor keine gute Idee

ZitatIdealerweise würde ich die Fußnote dann auch nur einmal vorweg als z.B. fnI = ...   spezifizieren müssen und si dann einfach im Notentext an den entsprechenden Stellen aufrufen.
fnI = \footnote #'(0 . 1) "A note" \etc

ZitatWie kann ich die Verbindungslinie loswerden, so dass ich nur den Stern über oder unter der Note stehen habe?
\override Score.FootnoteItem.annotation-line = ##f

ZitatJedesmal eine relative Position angeben zu müssen ist auch ein wenig lästig. Für meine Zwecke wäre es besser, wenn der Stern einfach jedes Mal in einem festen Abstand über/unter dem Notensystem stünde.
Geht vielleicht in fnI
Aber die fixen Werte werden kollisionsanfällig sein


Soweit erstmal, Gruß,
  Harm










ValidUserName

Danke erst einmal für deine ausführliche Befassung mit dem Problem.

Klingt, als wären Fußnoten in der bisherignen Lilypondentwicklung äußerst stiefmütterlich behandelt worden, dabei sind doch viele Notenausgaben voll davon.

Zitat von: harm6 am Samstag, 14. Dezember 2019, 15:38
ZitatWarum wird der Stern (oder welches Symbol auch immer) nicht in der Fußzeile angezeigt?
Kurz gesagt: das ist nicht vorgesehen, siehe die definition von \footnote in music-functions-init.ly
Sobald Du eine eigene "mark" (den Stern) verwendest, erscheint diese in der Musik, aber nicht am Seitenende
Die NR zeigt eine Art workaround (ohne es solchen zu kennzeichnen)
Man muß die footnote-numbering-function austricksen, die Nummer der Fußnote nicht zu schreiben. Obs besser geht weiß ich nicht, ich häng schon Stunden an diesem Problem und brauch ne Pause (ich schreib nur noch diesen post fertig)

ZitatWie kann ich nur eine Fußnote mit mehreren Referenzpunkten im Notentext erzeugen?
Da hab' ich noch wie vor keine gute Idee
Für meine (und wahrscheinlich die meisten Zwecke) erst einmal ausreichend (und wahrscheinlich wesentlich zweckmäßiger als das, was Lilypond sich offenbar unter Fußnoten vorstellt) wäre folgende Implementation mit einer Dummy-Fußnote, und einfachen Markups als Verweise im Notentext. Ist nur eben eher nicht im Sinne von WYGIWYM... :
\version "2.19.83"

\new \Staff {
  \override Score.FootnoteItem.annotation-line = ##f
  \footnote "" #'(0 . 5) "* Note this note of note" c'^"*" c''^"*"
}


Zitat
ZitatIdealerweise würde ich die Fußnote dann auch nur einmal vorweg als z.B. fnI = ...   spezifizieren müssen und si dann einfach im Notentext an den entsprechenden Stellen aufrufen.
fnI = \footnote #'(0 . 1) "A note" \etc
So einfach geht es leider nicht.

\version "2.19.83"

fn = \footnote "*" #'(0 . 5) "Note this note of note"

\new \Staff {
  \fn c'
  \fn c''
}
schmeißt beispielsweise einen ganzen Haufen Fehlermeldungen raus:
Starting lilypond 2.19.83 [Untitled (2)]...
Processing `/tmp/frescobaldi-viq0x42o/tmp21mol4js/document.ly'
Parsing...
/tmp/frescobaldi-viq0x42o/tmp21mol4js/document.ly:5:6: error: unknown escaped string: `\Staff'
\new
     \Staff {
/tmp/frescobaldi-viq0x42o/tmp21mol4js/document.ly:6:3: error: unknown escaped string: `\fn'
 
  \fn c'
/tmp/frescobaldi-viq0x42o/tmp21mol4js/document.ly:6:3: error: string outside of text script or \lyricmode
 
  \fn c'
/tmp/frescobaldi-viq0x42o/tmp21mol4js/document.ly:7:3: error: unknown escaped string: `\fn'
 
  \fn c''
/tmp/frescobaldi-viq0x42o/tmp21mol4js/document.ly:7:3: error: string outside of text script or \lyricmode
 
  \fn c''
/tmp/frescobaldi-viq0x42o/tmp21mol4js/document.ly:3:6: error: Cannot \propertyTweak
fn =
     \footnote "*" #'(0 . 5) "Note this note of note"
/tmp/frescobaldi-viq0x42o/tmp21mol4js/document.ly:5:1: untweakable

\new \Staff {
/tmp/frescobaldi-viq0x42o/tmp21mol4js/document.ly:6:3: warning: Cannot apply \once to timed music
 
  \fn c'
/tmp/frescobaldi-viq0x42o/tmp21mol4js/document.ly:6:7: warning: Cannot apply \once to timed music
  \fn
      c'
/tmp/frescobaldi-viq0x42o/tmp21mol4js/document.ly:7:3: warning: Cannot apply \once to timed music
 
  \fn c''
/tmp/frescobaldi-viq0x42o/tmp21mol4js/document.ly:7:7: warning: Cannot apply \once to timed music
  \fn
      c''
fatal error: failed files: "/tmp/frescobaldi-viq0x42o/tmp21mol4js/document.ly"
Exited with return code 1.

Das Problem ist, dass Fußnoten zwingend ein music-Argument benötigen. Man müsste das also als music function implementieren. Bei meiner jetzigen pragmatischen Lösung aber auch zu Viel des Guten...

Zitat
ZitatJedesmal eine relative Position angeben zu müssen ist auch ein wenig lästig. Für meine Zwecke wäre es besser, wenn der Stern einfach jedes Mal in einem festen Abstand über/unter dem Notensystem stünde.
Geht vielleicht in fnI
Aber die fixen Werte werden kollisionsanfällig sein
Meine Markup-Lösung löst dieses Problem natürliuch mit. Aber Fußnoten sollten meiner Meinung nach irgend eine Art von eigener interner Kollisionsvermeidung implementiert haben.

harm6

Zitat von: ValidUserName am Samstag, 14. Dezember 2019, 18:13

Zitat von: Harm
Zitat von: ValidUserNameIdealerweise würde ich die Fußnote dann auch nur einmal vorweg als z.B. fnI = ...   spezifizieren müssen und si dann einfach im Notentext an den entsprechenden Stellen aufrufen.
fnI = \footnote #'(0 . 1) "A note" \etc
So einfach geht es leider nicht.

\version "2.19.83"

fn = \footnote "*" #'(0 . 5) "Note this note of note"

\new \Staff {
  \fn c'
  \fn c''
}
schmeißt beispielsweise einen ganzen Haufen Fehlermeldungen raus:
Starting lilypond 2.19.83 [Untitled (2)]...
Processing `/tmp/frescobaldi-viq0x42o/tmp21mol4js/document.ly'
Parsing...
/tmp/frescobaldi-viq0x42o/tmp21mol4js/document.ly:5:6: error: unknown escaped string: `\Staff'
\new
     \Staff {
/tmp/frescobaldi-viq0x42o/tmp21mol4js/document.ly:6:3: error: unknown escaped string: `\fn'
 
  \fn c'
/tmp/frescobaldi-viq0x42o/tmp21mol4js/document.ly:6:3: error: string outside of text script or \lyricmode
 
  \fn c'
/tmp/frescobaldi-viq0x42o/tmp21mol4js/document.ly:7:3: error: unknown escaped string: `\fn'
 
  \fn c''
/tmp/frescobaldi-viq0x42o/tmp21mol4js/document.ly:7:3: error: string outside of text script or \lyricmode
 
  \fn c''
/tmp/frescobaldi-viq0x42o/tmp21mol4js/document.ly:3:6: error: Cannot \propertyTweak
fn =
     \footnote "*" #'(0 . 5) "Note this note of note"
/tmp/frescobaldi-viq0x42o/tmp21mol4js/document.ly:5:1: untweakable

\new \Staff {
/tmp/frescobaldi-viq0x42o/tmp21mol4js/document.ly:6:3: warning: Cannot apply \once to timed music
 
  \fn c'
/tmp/frescobaldi-viq0x42o/tmp21mol4js/document.ly:6:7: warning: Cannot apply \once to timed music
  \fn
      c'
/tmp/frescobaldi-viq0x42o/tmp21mol4js/document.ly:7:3: warning: Cannot apply \once to timed music
 
  \fn c''
/tmp/frescobaldi-viq0x42o/tmp21mol4js/document.ly:7:7: warning: Cannot apply \once to timed music
  \fn
      c''
fatal error: failed files: "/tmp/frescobaldi-viq0x42o/tmp21mol4js/document.ly"
Exited with return code 1.

Das Problem ist, dass Fußnoten zwingend ein music-Argument benötigen. Man müsste das also als music function implementieren. Bei meiner jetzigen pragmatischen Lösung aber auch zu Viel des Guten...

Doch. Vorausgesetzt Du löschst nichts, in diesem Fall das \etc, und die sonstige Synatx ist korrekt. Es heißt natürlich \new Staff und nicht \new \Staff. ;)

fn = \footnote "*" #'(0 . 5) "Note this note of note" \etc

\new Staff {
  \fn c'
  \fn c''
}

compiliert tadellos

Gruß,
  Harm

P.S. den Rest schau ich mir später noch mal an

ValidUserName


harm6

Zitat von: ValidUserNameWie kann ich nur eine Fußnote mit mehreren Referenzpunkten im Notentext erzeugen?
Zitat von: HarmDa hab' ich noch wie vor keine gute Idee

Also, es geht:

\version "2.19.83"

#(set-default-paper-size "a6")

noVisibleFootnote = {
%% only the mark in notes and probably the annotation-line
    \once \override Score.FootnoteItem.footnote-text = ""
    \once \override Score.FootnoteItem.footnote = ##f
    \once \override Score.FootnoteItem.automatically-numbered = ##f
}

{
\override Score.FootnoteItem.annotation-line = ##f
\footnote "*" #'(0 . -1) "*  NoteHead" b4
\noVisibleFootnote \footnote "*" #'(0 . -1) "NoteHead" b4
\noVisibleFootnote \footnote "*" #'(0 . -1) "NoteHead" b4
\footnote #'(0 . 2) \markup \translate #'(1 . 0) "  footnote" b'4
\noVisibleFootnote \footnote "*" #'(0 . -1) "NoteHead" b4
\noVisibleFootnote \footnote "*" #'(0 . -1) "NoteHead" b4
\noVisibleFootnote \footnote "*" #'(0 . -1) "NoteHead" b4
\noVisibleFootnote \footnote "*" #'(0 . -1) "NoteHead" b4
\noVisibleFootnote \footnote "*" #'(0 . -1) "NoteHead" b4
\footnote #'(0 . 2) \markup \translate #'(1 . 0) "  footnote" b'4
\noVisibleFootnote \footnote "*" #'(0 . -1) "NoteHead" b4
\noVisibleFootnote \footnote "*" #'(0 . -1) "NoteHead" b4
}


`noVisibleFootnote` setzt drei properties.
Leider gibt es nur für 'footnote ein Code-Beispiel in den regression-test (und dieser Test ist fehlerhaft, u.a. deshalb mein oben erwähnter patch). Für die beiden anderen gibt es gar nichts, von Erwähnungen in diversen Listen mal abgesehen).
Ich hoffe es gibt nirgendwo spacing-Probleme. Mußt Du halt testen.

Ansonsten:
Zitat von: ValidUserNameAber Fußnoten sollten meiner Meinung nach irgend eine Art von eigener interner Kollisionsvermeidung implementiert haben.
Da bin ich anderer Meinung.
Fußnoten brauchen häufig die annotation-line, sonst ist ja nicht klar, ob Du bei einer Achtelnote irgendwas zum Notenkopf, Notenhals oder Fähnchen/Balken anmerken willst.
Aber der sonstige Notensatz sollte nicht beeinflußt werden, imho.
Also generell keine Kollisionsvermeidung und der Linie wegen ist es auch nicht sinnvoll.
Dein Anwendungsfall mag zugegebenermaßen anders aussehen ...

Mich stört vielmehr, daß ich kaum eine Möglichkeit habe das Aussehen der Fußnoten am Seiten ende zu beinflussen.
Siehe das schon erwähnte
https://sourceforge.net/p/testlilyissues/issues/2561/
Insoweit habe ich auch ein paar Klimmzüge in obigem code unternommen um zu einem akzeptablen Ergebnis zu kommen,

Man kann natürlich die music-function `footnote` umdefinieren, z.B.:

\version "2.19.83"

#(set-default-paper-size "a6")

footnote =
#(define-music-function (mark offset footnote item)
   ((markup?) number-pair? markup? symbol-list-or-music?)
   (let ((mus (make-music
               'FootnoteEvent
               'X-offset (car offset)
               'Y-offset (cdr offset)
               'automatically-numbered (not mark)
               'text (or mark (make-null-markup))
               'footnote-text
                 (if mark
                     (make-line-markup (list mark footnote))
                     footnote))))
     (once (propertyTweak 'footnote-music mus item))))

noVisibleFootnote = {
%% only the mark in notes and probably the annotation-line
    \once \override Score.FootnoteItem.footnote-text = ""
    \once \override Score.FootnoteItem.footnote = ##f
    \once \override Score.FootnoteItem.automatically-numbered = ##f
}

{
\override Score.FootnoteItem.annotation-line = ##f
\footnote "*" #'(0 . -1) "NoteHead" b4
\noVisibleFootnote \footnote "*" #'(0 . -1) "NoteHead" b4
\noVisibleFootnote \footnote "*" #'(0 . -1) "NoteHead" b4
\footnote #'(0 . 2) \markup \translate #'(1 . 0) "  footnote" b'4
\noVisibleFootnote \footnote "*" #'(0 . -1) "NoteHead" b4
\noVisibleFootnote \footnote "*" #'(0 . -1) "NoteHead" b4
\noVisibleFootnote \footnote "*" #'(0 . -1) "NoteHead" b4
\noVisibleFootnote \footnote "*" #'(0 . -1) "NoteHead" b4
\noVisibleFootnote \footnote "*" #'(0 . -1) "NoteHead" b4
\footnote #'(0 . 2) \markup \translate #'(1 . 0) "  footnote" b'4
\noVisibleFootnote \footnote "*" #'(0 . -1) "NoteHead" b4
\noVisibleFootnote \footnote "*" #'(0 . -1) "NoteHead" b4
}

Mit einem Klimmzug weniger.

Ich bin mir aber nicht sicher, ob das nicht irgendwo aus dem Ruder läuft.
Auch das mußt Du testen, falls Du es verwenden willst.


Gruß,
  Harm