• Willkommen im Forum „Archiviertes Lilypond Forum (2017)“.
 

Dies ist das Archiv des alten Forums (bis März 2017). Das aktuelle Forum ist unter lilypondforum.de zu finden.
This is the archive of the old forum (until March 2017). You can find the current forum at lilypondforum.de.

Hauptmenü

2 parallel numerierte Spalten als scheme-function (selber gelöst)

Begonnen von Manuela, Freitag, 28. Oktober 2016, 08:50

Vorheriges Thema - Nächstes Thema

Manuela

Hallo Harm,

ich verwende deine Funktionen aus diesem Thread ständig (kommt das eigentlich in eine der nächsten Releases als Standard rein?).

Jetzt möchte ich die 2-spaltige Variante, wo 2 Numerierungen runterlaufen (wenn der Liedtext beispielsweise 2sprachig ist) als define-scheme-function analog zu der Funktion formatAdditionalVerses.

Es wäre nicht ich, wenn ich nicht irgendwo einen Hund eingebaut hätte  :(

Hier der Code mit meinem misslungenen Versuch:

\version "2.19.42"

leftCol =
\markuplist {
  \column
  \column-lines {
    "Left Verse 1"
  }
  \column
  \column-lines {
    "Left Verse 2"
  }
}

rightCol =
\markuplist {
  \column
  \column-lines {
    "Right Verse 1"
  }
  \column
  \column-lines {
    "Right Verse 2 "
  }
}

#(define (reorder-lists lists)
   ;; TODO better name and DOC
   "Example:
   (reorder-lists '((a) (b c) (d e f)))
   ->'(a b d "" c e "" "" f)"
   (let* ((max-length (apply max 0 (map length lists)))
          (equal-length-lists
           (map
            (lambda (l)
              (let ((length-diff (- max-length (length l))))
                (if (zero? length-diff)
                    l
                    (append l (make-list length-diff "")))))
            lists)))

     (define (new-lists lists rl)
       ;; TODO better name and DOC
       "Example
       (new-lists '((a b c) (d e f) (g h i)) '())
       ->
       '((a d g) (b e h) (c f i))"
       (if (every null? lists)
           (reverse rl)
           (new-lists
            (map cdr lists)
            (cons (map car lists) rl))))

     (apply append '() (new-lists equal-length-lists '()))))

#(define-markup-list-command (paragraph layout props args) (markup-list?)
   #:properties ((x-shift 2))
   (interpret-markup-list layout props
     (make-justified-lines-markup-list (cons (make-hspace-markup x-shift) args))))

#(define (numbering-start lst strt)
   "Returns a list of custom formated markups for numbers, relying on the length
of @var{lst}, starting with number 2"
   (if (eq? strt 0)
       (map
        (lambda (i)
          #{ \markup \concat \paragraph { " " } #})
        (iota (length lst)))
       (map
        (lambda (i)
          #{ \markup \concat \paragraph { \bold #(format #f "~2d. " i) } #})
        (iota (length lst) strt 1))))

%% so funktioniert es (eh klar, stammt von Harm ;) )
\markuplist {
  \table
  #'(1 -1 1 -1)
  #(reorder-lists
    (list
     ;; numbering is done for each list, because we can't warrant equal
     ;; length of each list
     (numbering-start leftCol 2)
     leftCol
     (numbering-start rightCol 2)
     rightCol))
}

%% und jetzt mein Versuch
%% irgendwo ist ein Hund drinnen :( aber wo???
formatTwoColumns =
#(define-scheme-function (r-col r-start l-col l-start)
   (markup-list? index? markup-list? index?)
   #{
     \markuplist {
       \table
       #'(1 -1 1 -1)
       #(reorder-lists
         (list
          ;; numbering is done for each list, because we can't warrant equal
          ;; length of each list
          (numbering-start $r-col $r-start)
          $r-col
          (numbering-start $l-col $l-start)
          $l-col))
     }
   #}
   )

\markuplist
{
  \formatTwoColumns #leftCol #2 #rightCol #2
}


Als Fehlermeldung erhalte ich folgendes:

Parsing...
G:/Lilypond/_Liederheft/Forum/2spaltigalsmarkuplis.ly:97:9: error: GUILE signaled an error for the expression beginning here
       #
        (reorder-lists

G:/Lilypond/_Liederheft/Forum/2spaltigalsmarkuplis.ly:97:8: error: not a markup
       
       #(reorder-lists

G:/Lilypond/_Liederheft/Forum/2spaltigalsmarkuplis.ly:97:8: error: syntax error, unexpected MARKUP_IDENTIFIER, expecting MARKUPLIST_IDENTIFIER
       
       #(reorder-lists

G:/Lilypond/_Liederheft/Forum/2spaltigalsmarkuplis.ly:113:3: error: error in #{ ... #}
 
  \formatTwoColumns #leftCol #2 #rightCol #2

G:/Lilypond/_Liederheft/Forum/2spaltigalsmarkuplis.ly:113:3: error: not a markup
 
  \formatTwoColumns #leftCol #2 #rightCol #2

Manuela

Problem durch Hinschauen gelöst  ;)

Die Dollarzeichen innerhalt der Scheme-Funktion gehören natürlich weg!

Jetzt habe ich doch noch eine Frage: wie kann ich den Abstand zwischen den Strophen vergrößern? \override #'(baseline-skip . 3) wirkt sich auf alle Zeilenabstände aus, nicht nur auf die zwischen den Strophen.

harm6

ZitatAls Fehlermeldung erhalte ich folgendes:
[...]
ZitatProblem durch Hinschauen gelöst
Die Dollarzeichen innerhalt der Scheme-Funktion gehören natürlich weg!

Also, ich erhielt als Fehlermeldung:
Zitaterror: GUILE signaled an error for the expression beginning here
       #
        (reorder-lists
Unbound variable: $r-col
und dann gings weiter wie bei Dir.
Diese Meldung identifiziert das Problem direkt. Hast Du sie nicht so bekommen?

Zitat
Jetzt habe ich doch noch eine Frage: wie kann ich den Abstand zwischen den Strophen vergrößern?

Formatiere die Argumente zuerst, dann ändere baseline-skip beim Aufruf, d.h.:


\version "2.19.42"

leftCol =
\markuplist  {
  \override #'(baseline-skip . 3)
  \column
  \column-lines {
    "Left Verse 1"
    "Left Verse 1a"
  }
  \override #'(baseline-skip . 3)
  \column
  \column-lines {
    "Left Verse 2"
    "Left Verse 2a"
  }
}

rightCol =
\markuplist {
  \override #'(baseline-skip . 3)
  \column
  \column-lines {
    "Right Verse 1"
  }
  \override #'(baseline-skip . 3)
  \column
  \column-lines {
    "Right Verse 2 "
  }
}

#(define (reorder-lists lists)
   ;; TODO better name and DOC
   "Example:
   (reorder-lists '((a) (b c) (d e f)))
   ->'(a b d "" c e "" "" f)"
   (let* ((max-length (apply max 0 (map length lists)))
          (equal-length-lists
           (map
            (lambda (l)
              (let ((length-diff (- max-length (length l))))
                (if (zero? length-diff)
                    l
                    (append l (make-list length-diff "")))))
            lists)))

     (define (new-lists lists rl)
       ;; TODO better name and DOC
       "Example
       (new-lists '((a b c) (d e f) (g h i)) '())
       ->
       '((a d g) (b e h) (c f i))"
       (if (every null? lists)
           (reverse rl)
           (new-lists
            (map cdr lists)
            (cons (map car lists) rl))))

     (apply append '() (new-lists equal-length-lists '()))))

#(define-markup-list-command (paragraph layout props args) (markup-list?)
   #:properties ((x-shift 2))
   (interpret-markup-list layout props
     (make-justified-lines-markup-list (cons (make-hspace-markup x-shift) args))))

#(define (numbering-start lst strt)
   "Returns a list of custom formated markups for numbers, relying on the length
of @var{lst}, starting with number 2"
   (if (eq? strt 0)
       (map
        (lambda (i)
          #{ \markup \concat \paragraph { " " } #})
        (iota (length lst)))
       (map
        (lambda (i)
          #{ \markup \concat \paragraph { \bold #(format #f "~2d. " i) } #})
        (iota (length lst) strt 1))))

%% so funktioniert es (eh klar, stammt von Harm ;) )
%\markuplist {
%  \table
%  #'(1 -1 1 -1)
%  #(reorder-lists
%    (list
%     ;; numbering is done for each list, because we can't warrant equal
%     ;; length of each list
%     (numbering-start leftCol 2)
%     leftCol
%     (numbering-start rightCol 2)
%     rightCol))
%}
%
%% und jetzt mein Versuch
%% irgendwo ist ein Hund drinnen :( aber wo???
formatTwoColumns =
#(define-scheme-function (r-col r-start l-col l-start)
   (markup-list? index? markup-list? index?)
   #{
     \markuplist {
       \table
       #'(1 -1 1 -1)
       #(reorder-lists
         (list
          ;; numbering is done for each list, because we can't warrant equal
          ;; length of each list
          (numbering-start r-col r-start)
          r-col
          (numbering-start l-col l-start)
          l-col))
     }
   #}
   )

\markuplist
  \override-lines #'(baseline-skip . 15)
{
  \formatTwoColumns #leftCol #2 #rightCol #2
}


Zitat
%% so funktioniert es (eh klar, stammt von Harm ;) )
Nun gebe ich mir zwar alle Mühe, jedoch bin ich immer sehr dankbar wenn meine Codings hinterfragt werden, nicht selten kann man Sachen besser machen, hab' ich was übersehen oder dergleichen.

Zitat
ich verwende deine Funktionen aus diesem Thread ständig (kommt das eigentlich in eine der nächsten Releases als Standard rein?).
Das bezweifel ich.
Diese Funktionalität ist massgeschneidert. Es gibt zu wenig Variabilität für andere Erscheinungsbilder, vielleicht ins LSR...

Gruß,
  Harm



Manuela

#3
Zitat von: harm6 am Freitag, 28. Oktober 2016, 11:12

Zitaterror: GUILE signaled an error for the expression beginning here
       #
        (reorder-lists
Unbound variable: $r-col
und dann gings weiter wie bei Dir.
Diese Meldung identifiziert das Problem direkt. Hast Du sie nicht so bekommen?

Jetzt, wo du es schreibst, finde ich diese Meldung im weiteren Fehlertext. Die habe ich glatt übersehen, vll. sollte ich Lilypond etwas weniger geschwätzig bei der Ausgabe machen

Zitat von: harm6 am Freitag, 28. Oktober 2016, 11:12
Das bezweifel ich.
Diese Funktionalität ist massgeschneidert. Es gibt zu wenig Variabilität für andere Erscheinungsbilder, vielleicht ins LSR...

Hmmm, ich finde, die Ausgabe ist sehr flexibel, was Liedsetzung betrifft. Beliebig viele Spalten, Strophenabstände etc., die Strophennummerierung ist automatisch und kann geändert bzw. weggelassen werden (meine Bastelei). Viel besser als das, was im Notations-Handbuch (deutsche Version zur Version 2.19.42, S.288) zum Thema Strophensetzung steht. Ist aber nur meine persönliche Meinung.

Update: jetzt habe ich deinen Code ausprobiert, funktioniert super. Leider sehe ich den Unterschied im Code zu vorher nicht, das Baum-Wald-Problem ;) Aber ich werde es vermutlich in wenigen Minuten herausfinden.

harm6

Zitat
Jetzt, wo du es schreibst, finde ich diese Meldung im weiteren Fehlertext. Die habe ich glatt übersehen, vll. sollte ich Lilypond etwas weniger geschwätzig bei der Ausgabe machen

Bei mir kam diese zuerst, alles weitere sind Folgefehler.

Zitat
ich finde, die Ausgabe ist sehr flexibel, was Liedsetzung betrifft. Beliebig viele Spalten, Strophenabstände etc., die Strophennummerierung ist automatisch und kann geändert bzw. weggelassen werden (meine Bastelei).

Beliebige Spaltenzahl sowie Abstände sind sowieso in \table codiert.
(\table ist aber 2.19.-code, wird also nichts mit dem LSR)
Strophennumerierung natürich nicht aber gerade dort sehe ich fehlende Flexibilität

2. zweite Strophe erste Zeile
   zweite Strophe zweite Zeile
   zweite Strophe dritte Zeile
   zweite Strophe vierte Zeile


bzw
   2. zweite Strophe erste Zeile
   zweite Strophe zweite Zeile
   zweite Strophe dritte Zeile
   zweite Strophe vierte Zeile


bzw
2.
zweite Strophe erste Zeile
zweite Zeile
zweite Strophe dritte längere Zeile
zweite Strophe vierte Zeile

Hab' ich alles schon gesehen.

\formatTwoColumns unterstützt nur die erste Möglichkeit, die dritte mag auch möglich sein, aber die zweite erforderte wohl ein anderes Coding um einen Automatismus zu etablieren.


Zitat
jetzt habe ich deinen Code ausprobiert, funktioniert super. Leider sehe ich den Unterschied im Code zu vorher nicht,

Formatierung der Argumente:
ZitatleftCol =
\markuplist  {
  \override #'(baseline-skip . 3)
  \column
  \column-lines {
    "Left Verse 1"
    "Left Verse 1a"
  }
  ...

Formatierung im finalen Aufruf
Zitat
\markuplist
  \override-lines #'(baseline-skip . 15)
{
  \formatTwoColumns #leftCol #2 #rightCol #2
}

Das erste setzt den Zeilenabstand, das zweite den Strophenabstand. Falls der anfängliche Zeilenabstand ungesetzt bleibt wird der Strophenabstand stattdessen genommen.


HTH,
  Harm