Autor Thema: 2 parallel numerierte Spalten als scheme-function (selber gelöst)  (Gelesen 2305 mal)

Manuela

  • Gast
2 parallel numerierte Spalten als scheme-function (selber gelöst)
« am: Freitag, 28. Oktober 2016, 08:50 »
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
« Letzte Änderung: Freitag, 28. Oktober 2016, 09:06 von Manuela »

Manuela

  • Gast
Re: 2 parallel numerierte Spalten - mein Versuch als scheme-function scheitert
« Antwort #1 am: Freitag, 28. Oktober 2016, 08:55 »
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.
« Letzte Änderung: Freitag, 28. Oktober 2016, 09:04 von Manuela »

harm6

  • Gast
Re: 2 parallel numerierte Spalten als scheme-function (selber gelöst)
« Antwort #2 am: Freitag, 28. Oktober 2016, 11:12 »
Zitat
Als Fehlermeldung erhalte ich folgendes:
[...]
Zitat
Problem durch Hinschauen gelöst
Die Dollarzeichen innerhalt der Scheme-Funktion gehören natürlich weg!

Also, ich erhielt als Fehlermeldung:
Zitat
error: 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

  • Gast
Re: 2 parallel numerierte Spalten als scheme-function (selber gelöst)
« Antwort #3 am: Freitag, 28. Oktober 2016, 11:46 »

Zitat
error: 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

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.
« Letzte Änderung: Freitag, 28. Oktober 2016, 11:49 von Manuela »

harm6

  • Gast
Re: 2 parallel numerierte Spalten als scheme-function (selber gelöst)
« Antwort #4 am: Samstag, 29. Oktober 2016, 12:09 »
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:
Zitat
leftCol =
\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