Autor Thema: Markup mit automatischem Seitenumbruch - gelöst  (Gelesen 3525 mal)

Manuela

  • Member
Markup mit automatischem Seitenumbruch - gelöst
« am: Sonntag, 9. Oktober 2016, 17:37 »
Im LSR gibt es ein Snippet, dass Markup über Seiten verteilen kann:

Text that can spread over pages is entered with the \markuplines command.

Aus der Doku habe ich folgenden Code für Liederstrophen entnommen:

\version "2.19.37"
Absatz=#0.5
\markup {
  \column {
    \fill-line {
      \hspace #0.1 % moves the column off the left margin;
      % can be removed if space on the page is tight
      \column {
        \line {
          \bold "2."
          \column {
            "This is verse two."
            "It has two lines."
          }
        }
        \vspace #Absatz
        \line {
          \bold "3."
          \column {
            "This is verse three."
            "It has two lines."
          }
        }
      }
      \hspace #0.1 % adds horizontal spacing between columns;
      \column {
        \line {
          \bold "4."
          \column {
            "This is verse four."
            "It has two lines."
          }
        }
        \vspace #Absatz
        \line {
          \bold "5."
          \column {
            "This is verse five."
            "It has two lines."
          }
        }
      }
      \hspace #0.1 % gives some extra space on the right margin;
      % can be removed if page space is tight
    }
    \vspace #Absatz
    \fill-line
    {
      \line {
        \bold { \with-color #white "1" "9." }
        \column {
          "This is a single verse five."
          "centered in the line."
        }
      }
    }
  }
}

Jetzt möchte ich gerne die beiden Codes so komibinieren, dass Lilypond einen automatischen Seitenbruch nach einer Strophe einfügen kann, idealerweiser nach jeder Strophe, bin jedoch daran gescheitert, die Strophen wandern bei meinen Versuchen dorthin, wo ich sie nicht haben will.

Die Notlösung wäre, die Strophen (bei einem Lied 2x14, was auf keine Einzelseite mehr passt) auf mehrere Top-Level Markups aufzuteilen, was jede Menge händischer Nacharbeit bedeutet. Das möchte ich vermeiden, wenn möglich.
« Letzte Änderung: Dienstag, 18. Oktober 2016, 12:47 von Manuela »

harm6

  • Member
Re: Markup mit automatischem Seitenumbruch
« Antwort #1 am: Sonntag, 9. Oktober 2016, 23:53 »
Zitat
Im LSR gibt es ein Snippet, dass Markup über Seiten verteilen kann:

"Text that can spread over pages is entered with the \markuplines command."

Muß natürlich \markuplist heißen, ist wohl beim letzten update übersehen worden, hab ich bereits geändert.
Auch der Titel sollte dahin gehend geändert werden, aber da es es ein doc-snippet ist hab ich lieber erstmal nachgefragt.
http://lists.gnu.org/archive/html/lilypond-devel/2016-10/msg00037.html

Du solltest einen wesentlichen Unterschied zwischen markups und markuplists immer vor Augen haben:
markups geben einen stencil aus, markuplist eine Liste von stencils. Nur deshalb sind markuplist auch zum Seitenumbruch fähig.

Hier liegt dann aber auch gleich das Problem. Diese stencil-list wird nicht durch irgenwelche markup oder markuplist-commands, -overrides oder sonst dergleichen umgebrochen, sondern das macht LilyPond beim Fertigstellen der Seiten. Die hierzu verwendeten proceduren und Bedingungen stehen in cc-files, da hat man keinerlei Zugriff.

Die einzige Chance Einfluß zu nehmen besteht darin, die stencils der Liste so groß zu machen, daß wirklich nicht mehr als einer auf eine Seite paßt.

Das könnte zu folgendem führen (\box steht nur als visueller Marker drin, kann natürlich auskommentiert werden):

\version "2.19.37"

\markuplist
  \box
  {
    \line {
      \bold "2."
      \column {
        "This is verse two."
        "It has two lines."
        \vspace #40
      }
    }
   
    \line {
      \bold "3."
      \column {
        "This is verse three."
        "It has two lines."
        \vspace #40
      }
    }
   
    \line {
      \bold "4."
      \column {
        "This is verse four."
        "It has two lines."
        \vspace #40
      }
    }
   
    \line {
      \bold "5."
      \column {
        "This is verse five."
        "It has two lines."
        \vspace #40
      }
    }
   
    \line {
      \bold "9."
      \column {
        "This is a single verse five."
        "centered in the line."
          \vspace #40
      }
    }
  }

Ob das in irgeneiner Weise hilfreich (im Sinne einer Arbeitszeitverkürzung) sein kann, wage ich zu bezweifeln ...

Gruß,
  Harm

Manuela

  • Member
Re: Markup mit automatischem Seitenumbruch
« Antwort #2 am: Montag, 10. Oktober 2016, 06:25 »

Muß natürlich \markuplist heißen, ist wohl beim letzten update übersehen worden, hab ich bereits geändert.

Du solltest einen wesentlichen Unterschied zwischen markups und markuplists immer vor Augen haben:
markups geben einen stencil aus, markuplist eine Liste von stencils. Nur deshalb sind markuplist auch zum Seitenumbruch fähig.

Hier liegt dann aber auch gleich das Problem. Diese stencil-list wird nicht durch irgenwelche markup oder markuplist-commands, -overrides oder sonst dergleichen umgebrochen, sondern das macht LilyPond beim Fertigstellen der Seiten. Die hierzu verwendeten proceduren und Bedingungen stehen in cc-files, da hat man keinerlei Zugriff.

Die einzige Chance Einfluß zu nehmen besteht darin, die stencils der Liste so groß zu machen, daß wirklich nicht mehr als einer auf eine Seite paßt.


Danke Harm.

Und habe mich schon gefragt, was markuplines eigentlich sind.

Danke für die Ausführungen, die wieder einmal mehr etwas Licht in meine Markup-Finsternis bringen

D.h. ich müsste eine Markuplist basteln, wo jede Strophe einen eigenen Stencil bildet.

Meine Erfahrung, wenn das Markup nicht mehr auf eine Seite passt, ist die, dass der Rest einfach unterhalb des Papierrandes verschwindet.

Probier es einfach selbst aus  ;) (der Text ist gemeinfrei):

Absatz=#0.5
%% Songtext
\markup {
  \column {
    \fill-line {
      \hspace #0.1 % moves the column off the left margin;
      % can be removed if space on the page is tight
      \column {
        \line {
          \bold { \with-color #white "1" "2." }
          \column {
            "Laudis thema specialis"
            "Panis vivus et vitalis"
            "Hodie proponitur."
            "Quem in sacræ mensa cœnæ"
            "Turbæ fratrum duodenæ"
            "Datum non ambigitur."
          }
        }
        \vspace #Absatz
        \line {
          \bold { \with-color #white "1" "3." }
          \column {
            "Sit laus plena, sit sonora;"
            "Sit iucunda, sit decora"
            "Mentis iubilatio,"
            "Dies enim solemnis agitur"
            "In qua mensæ prima recolitur"
            "Huius institutio."
          }
        }
        \vspace #Absatz
        \line {
          \bold { \with-color #white "1" "4." }
          \column {
            "In hac mensa novi Regis"
            "Novum Pascha novæ legis"
            "Phase vetus terminat."
            "Vetustatem novitas,"
            "Umbram fugat veritas,"
            "Noctem lux eliminat."
          }
        }
        \vspace #Absatz
        \line {
          \bold { \with-color #white "1" "5." }
          \column {
            "Quod in cœna Christus gessit,"
            "Faciendum hoc expressit"
            "In sui memoriam:"
            ""
            "Docti sacris institutis"
            "Panem, vinum in salutis"
            "Consecramus hostiam."
          }
        }
        \vspace #Absatz
        \line {
          \bold { \with-color #white "1" "6." }
          \column {
            "Dogma datur Christianis,"
            "Quod in carnem transit panis"
            "Et vinum in sanguinem."
            ""
            "Quod non capis, quod non vides,"
            "Animosa firmat fides"
            "Præter rerum ordinem."
          }
        }
        \vspace #Absatz
        \line {
          \bold { \with-color #white "1" "7." }
          \column {
            "Sub diversis speciebus,"
            "Signis tantum et non rebus,"
            "Latent res eximiæ:"
            ""
            "Caro cibus, sanguis potus,"
            "Manet tamen Christus totus"
            "Sub utraque specie."
          }
        }
        \vspace #Absatz
        \line {
          \bold { \with-color #white "1" "8." }
          \column {
            "A sumente non concisus,"
            "Non confractus, non divisus"
            "Integer accipitur."
            ""
            "Sumit unus, sumunt mille,"
            "Quantum isti, tantum ille,"
            "Nec sumptus consumitur."
          }
        }
        \vspace #Absatz
        \line {
          \bold { \with-color #white "1" "9." }
          \column {
            "Sumunt boni, sumunt mali,"
            "Sorte tamen inæquali,"
            "Vitæ vel interitus."
            ""
            "Mors est malis, vita bonis,"
            "Vide paris sumptionis"
            "Quam sit dispar exitus"
          }
        }
        \vspace #Absatz
        \line {
          \bold "10."
          \column {
            "Fracto demum sacramento,"
            "Ne vacilles, sed memento"
            "Tantum esse sub fragmento,"
            "Quantum toto tegitur."
            ""
            "Nulla rei fit scissura,"
            "Signi tantum fit fractura,"
            "Qua nec status nec statura"
            "Signati minuitur"
          }
        }
        \vspace #Absatz
        \line {
          \bold  "11."
          \column {
            "Ecce panis Angelorum,"
            "Factus cibus viatorum,"
            "Vere panis filiorum,"
            "Non mittendus canibus!"
            ""
            "In figuris praesignatur,"
            "Cum Isaac immolatur,"
            "Agnus Paschæ deputatur,"
            "Datur manna patribus."
          }
        }
        \vspace #Absatz
        \line {
          \bold  "12."
          \column {
            "Bone pastor, panis vere,"
            "Jesu, nostri miserere,"
            "Tu nos pasce, nos tuere,"
            "Tu nos bona fac videre"
            "In terra viventium."
          }
        }
        \vspace #Absatz
        \line {
          \bold  "13."
          \column {
            "Tu qui cuncta scis et vales,"
            "Qui nos pascis hic mortales,"
            "Tuos ibi commensales,"
            "Cohæredes et sodales"
            "Fac sanctorum civium."
          }
        }
   
      }
      \hspace #0.1 % adds horizontal spacing between columns;
      \column {
        \line {
          \bold { \with-color #white "1" "2." }
          \column {

            "Dieses Brot sollst du erheben,"
            "welches lebt und gibt das Leben,"
            "das man heut‘ den Christen weist."
            ""
            "Dieses Brot, mit dem im Saale"
            "Christus bei dem Abendmahle"
            "die zwölf Jünger hat gespeist."
          }
        }
        \vspace #Absatz
        \line {
          \bold { \with-color #white "1" "3." }
          \column {
            "Laut soll unser Lob erschallen"
            "und das Herz in Freude wallen,"
            "denn der Tag hat sich genaht,"
            ""
            "Da der Herr zum Tisch der Gnaden"
            "uns zum ersten Mal geladen"
            "und dies Mahl gestiftet hat."
          }
        }
        \vspace #Absatz
        \line {
          \bold { \with-color #white "1" "4." }
          \column {
            "Neuer König, neue Zeiten,"
            "neue Ostern, neue Freuden,"
            "neues Opfer allzumal!"
            ""
            "Vor der Wahrheit muss das Zeichen,"
            "vor dem Licht der Schatten weichen,"
            "hell erglänzt des Tages Strahl."
          }
        }
        \vspace #Absatz
        \line {
          \bold { \with-color #white "1" "5." }
          \column {
            "Was von Christus dort geschehen,"
            "sollen wir fortan begehen,"
            "seiner eingedenk zu sein."
            ""
            "Treu dem heiligen Befehle"
            "wandeln wir zum Heil der Seele"
            "in sein Opfer Brot und Wein."
          }
        }
        \vspace #Absatz
        \line {
          \bold { \with-color #white "1" "6." }
          \column {
            "Doch wie uns der Glaube kündet,"
            "der Gestalten Wesen schwindet,"
            "Fleisch und Blut wird Brot und Wein."
            ""
            "Was das Auge nicht kann sehen,"
            "der Verstand nicht kann verstehen,"
            "sieht der feste Glaube ein."
          }
        }

        \vspace #Absatz
        \line {
          \bold { \with-color #white "1" "7." }
          \column {
            "Unter beiderlei Gestalten"
            "hohe Dinge sind enthalten,"
            "in den Zeichen tief verhüllt."
            ""
            "Blut ist Trank, und Fleisch ist Speise,"
            "doch der Herr bleibt gleicherweise"
            "ungeteilt in beider Bild."
          }
        }
        \vspace #Absatz
        \line {
          \bold  { \with-color #white "1" "8." }
          \column {
            "Wer ihm nahet voll Verlangen,"
            "darf ihn unversehrt empfangen,"
            "ungemindert, wunderbar."
            ""
            "Einer kommt, und tausend kommen,"
            "doch so viele ihn genommen,"
            "er bleibt immer, der er war."
          }
        }
        \vspace #Absatz
        \line {
          \bold { \with-color #white "1" "9." }
          \column {
            "Gute kommen, Böse kommen,"
            "alle haben ihn genommen,"
            "die zum Leben, die zum Tod."
            ""
            "Bösen wird er Tod und Hölle,"
            "Guten ihres Lebens Quelle,"
            "wie verschieden wirkt dies Brot!"
          }
        }
        \vspace #Absatz
        \line {
          \bold  "10."
          \column {
            "Wird die Hostie auch gespalten,"
            "zweifle nicht an Gottes Walten,"
            "dass die Teile das enthalten,"
            "was das ganze Brot enthält."
            ""
            "Niemals kann das Wesen weichen,"
            "teilen lässt sich nur das Zeichen,"
            "Sach‘ und Wesen sind die gleichen,"
            "beide bleiben unentstellt."
          }
        }
        \vspace #Absatz
        \line {
          \bold  "11."
          \column {
            "Seht das Brot, die Engelspeise!"
            "Auf des Lebens Pilgerreise"
            "nehmt es nach der Kinder Weise,"
            "nicht den Hunden werft es hin!"
            ""
            "Lang im Bild war‘s vorbereitet:"
            "Isaak, der zum Opfer schreitet;"
            "Osterlamm, zum Mahl bereitet;"
            "Manna nach der Väter Sinn."
          }
        }
        \vspace #Absatz
        \line {
          \bold  "12."
          \column {
            "Guter Hirt, du wahre Speise,"
            "Jesus, gnädig dich erweise!"
            "Nähre uns auf deinen Auen,"
            "lass uns deine Wonnen schauen"
            "in des Lebens ewigem Reich!"
          }
        }
        \vspace #Absatz
        \line {
          \bold  "13."
          \column {
            "Du, der alles weiß und leitet,"
            "uns im Tal des Todes weidet,"
            "lass an deinem Tisch uns weilen,"
            "deine Herrlichkeit uns teilen."
            "Deinen Seligen mach uns gleich!"
          }
        }
   
      }
      \hspace #0.1 % gives some extra space on the right margin;
      % can be removed if page space is tight
    }

  }
}
« Letzte Änderung: Montag, 10. Oktober 2016, 10:04 von Manuela »

harm6

  • Member
Re: Markup mit automatischem Seitenumbruch
« Antwort #3 am: Montag, 10. Oktober 2016, 12:35 »
Nun, sobald Du \markup schreibst wird ein stencil ausgegeben. Wenn der nicht auf eine Seite passt, dann wird der nicht umgebrochen.
Um überhaupt den Seitenumbruch möglich zu machen, mußt Du \markuplist verwenden.
Allerdings, gibt Dein erstes verwendetes command, \column, wiederum nur einen stencil aus, da kann auch \markuplist nicht helfen: einen stencil kann man nicht umbrechen, dasselbe für \fill-line.

Um Umbrüche möglich zu machen, ist Dein Anfang:
\markup {
  \column {
    \fill-line {
also völlig untauglich.

Bei den einelnen Strophen, z.B.

        \line {
          \bold { \with-color #white "1" "2." }
          \column {
            "Laudis thema specialis"
            "Panis vivus et vitalis"
            "Hodie proponitur."
            "Quem in sacræ mensa cœnæ"
            "Turbæ fratrum duodenæ"
            "Datum non ambigitur."
          }
willst Du jedoch einen stencil haben, insoweit ist das \line-command, welches alles "einwickelt" und einen stencil erzeugt angezeigt.

Mit anderen Worten um Seitenumbrüche zu haben gehe komplett anders vor. Leider sind markup-list-commands sehr viel unhandlicher.
Z.B.: mit \vspace, \hspace, etc ist da auf gewohnte Art und Weise nichts auszurichten.

Aber hier könnte mein relativ neues table-markup-list-command gute Dienste leisten.
http://lilypond.org/doc/v2.19/Documentation/changes/index.html
Scroll runter zu:
"The markup-list-command \table is now available."
Aus irgeneinem Grund ist die Darstellung in der NR kaputt, keine Ahnung was da passiert ist, muß ich mal nachforschen.

Hier eine Möglichkeit. Einstellmöglichkeiten sind kommentiert (/box dient wieder nur dazu das spacing besser sichtbar zu machen):

\version "2.19.48"

%% make the hspace adjustable, by defining a property for its amount
#(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))))
   

\markuplist {
  %% used to indent the first element of each row:
  \override #'(x-shift . 3)
  %% used to adjust the horizontal distance between the columns:
  \override #'(padding . 24)
  %% used to adjust the vertical distance between the rows
  \override #'(baseline-skip . 5)
  %% the first argument of `table' is a list determining the alignment of
  %% the args for each column
  %% '(-1 -1) means: first column is left aligned, second column as well
  \table #'(-1 -1)
  %% reset needed to prevent the former baseline-skip-override to take action
  %% on the column-markup
  \override #'(baseline-skip . 3)
  \box
    {
        \line {
          \bold  \concat \paragraph { \with-color #white "1" "2." }
          \column {
            "Laudis thema specialis"
            "Panis vivus et vitalis"
            "Hodie proponitur."
            "Quem in sacræ mensa cœnæ"
            "Turbæ fratrum duodenæ"
            "Datum non ambigitur."
          }
        }
       \line {
         \bold \concat { \with-color #white "1" "2." }
         \column {

           "Dieses Brot sollst du erheben,"
           "welches lebt und gibt das Leben,"
           "das man heut‘ den Christen weist."
           ""
           "Dieses Brot, mit dem im Saale"
           "Christus bei dem Abendmahle"
           "die zwölf Jünger hat gespeist."
         }
       }
       
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        \line {
          \bold \concat \paragraph { \with-color #white "1" "3." }
          \column {
            "Sit laus plena, sit sonora;"
            "Sit iucunda, sit decora"
            "Mentis iubilatio,"
            "Dies enim solemnis agitur"
            "In qua mensæ prima recolitur"
            "Huius institutio."
          }
        }
       
        \line {
          \bold \concat { \with-color #white "1" "3." }
          \column {
            "Laut soll unser Lob erschallen"
            "und das Herz in Freude wallen,"
            "denn der Tag hat sich genaht,"
            ""
            "Da der Herr zum Tisch der Gnaden"
            "uns zum ersten Mal geladen"
            "und dies Mahl gestiftet hat."
          }
        }
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        \line {
          \bold \concat \paragraph { \with-color #white "1" "4." }
          \column {
            "In hac mensa novi Regis"
            "Novum Pascha novæ legis"
            "Phase vetus terminat."
            "Vetustatem novitas,"
            "Umbram fugat veritas,"
            "Noctem lux eliminat."
          }
        }
        \line {
          \bold \concat { \with-color #white "1" "4." }
          \column {
            "Neuer König, neue Zeiten,"
            "neue Ostern, neue Freuden,"
            "neues Opfer allzumal!"
            ""
            "Vor der Wahrheit muss das Zeichen,"
            "vor dem Licht der Schatten weichen,"
            "hell erglänzt des Tages Strahl."
          }
        }
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        \line {
          \bold \concat \paragraph { \with-color #white "1" "5." }
          \column {
            "Quod in cœna Christus gessit,"
            "Faciendum hoc expressit"
            "In sui memoriam:"
            ""
            "Docti sacris institutis"
            "Panem, vinum in salutis"
            "Consecramus hostiam."
          }
        }
        \line {
          \bold { \with-color #white "1" "5." }
          \column {
            "Was von Christus dort geschehen,"
            "sollen wir fortan begehen,"
            "seiner eingedenk zu sein."
            ""
            "Treu dem heiligen Befehle"
            "wandeln wir zum Heil der Seele"
            "in sein Opfer Brot und Wein."
          }
        }
%%%%%%%%%%%%%%%%%%%%%%%%
        \line {
          \bold \concat \paragraph { \with-color #white "1" "6." }
          \column {
            "Dogma datur Christianis,"
            "Quod in carnem transit panis"
            "Et vinum in sanguinem."
            ""
            "Quod non capis, quod non vides,"
            "Animosa firmat fides"
            "Præter rerum ordinem."
          }
        }
        \line {
          \bold \concat { \with-color #white "1" "6." }
          \column {
            "Doch wie uns der Glaube kündet,"
            "der Gestalten Wesen schwindet,"
            "Fleisch und Blut wird Brot und Wein."
            ""
            "Was das Auge nicht kann sehen,"
            "der Verstand nicht kann verstehen,"
            "sieht der feste Glaube ein."
          }
        }
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        \line {
          \bold \concat \paragraph { \with-color #white "1" "7." }
          \column {
            "Sub diversis speciebus,"
            "Signis tantum et non rebus,"
            "Latent res eximiæ:"
            ""
            "Caro cibus, sanguis potus,"
            "Manet tamen Christus totus"
            "Sub utraque specie."
          }
        }
        \line {
          \bold \concat { \with-color #white "1" "7." }
          \column {
            "Unter beiderlei Gestalten"
            "hohe Dinge sind enthalten,"
            "in den Zeichen tief verhüllt."
            ""
            "Blut ist Trank, und Fleisch ist Speise,"
            "doch der Herr bleibt gleicherweise"
            "ungeteilt in beider Bild."
          }
        }

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        \line {
          \bold \concat \paragraph { \with-color #white "1" "8." }
          \column {
            "A sumente non concisus,"
            "Non confractus, non divisus"
            "Integer accipitur."
            ""
            "Sumit unus, sumunt mille,"
            "Quantum isti, tantum ille,"
            "Nec sumptus consumitur."
          }
        }
        \line {
          \bold  \concat { \with-color #white "1" "8." }
          \column {
            "Wer ihm nahet voll Verlangen,"
            "darf ihn unversehrt empfangen,"
            "ungemindert, wunderbar."
            ""
            "Einer kommt, und tausend kommen,"
            "doch so viele ihn genommen,"
            "er bleibt immer, der er war."
          }
        }
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        \line {
          \bold \concat \paragraph { \with-color #white "1" "9." }
          \column {
            "Sumunt boni, sumunt mali,"
            "Sorte tamen inæquali,"
            "Vitæ vel interitus."
            ""
            "Mors est malis, vita bonis,"
            "Vide paris sumptionis"
            "Quam sit dispar exitus"
          }
        }
        \line {
          \bold { \with-color #white "1" "9." }
          \column {
            "Gute kommen, Böse kommen,"
            "alle haben ihn genommen,"
            "die zum Leben, die zum Tod."
            ""
            "Bösen wird er Tod und Hölle,"
            "Guten ihres Lebens Quelle,"
            "wie verschieden wirkt dies Brot!"
          }
        }
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        \line {
          \bold \paragraph { "10." }
          \column {
            "Fracto demum sacramento,"
            "Ne vacilles, sed memento"
            "Tantum esse sub fragmento,"
            "Quantum toto tegitur."
            ""
            "Nulla rei fit scissura,"
            "Signi tantum fit fractura,"
            "Qua nec status nec statura"
            "Signati minuitur"
          }
        }
        \line {
          \bold  "10."
          \column {
            "Wird die Hostie auch gespalten,"
            "zweifle nicht an Gottes Walten,"
            "dass die Teile das enthalten,"
            "was das ganze Brot enthält."
            ""
            "Niemals kann das Wesen weichen,"
            "teilen lässt sich nur das Zeichen,"
            "Sach‘ und Wesen sind die gleichen,"
            "beide bleiben unentstellt."
          }
        }
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        \line {
          \bold \paragraph { "11." }
          \column {
            "Ecce panis Angelorum,"
            "Factus cibus viatorum,"
            "Vere panis filiorum,"
            "Non mittendus canibus!"
            ""
            "In figuris praesignatur,"
            "Cum Isaac immolatur,"
            "Agnus Paschæ deputatur,"
            "Datur manna patribus."
          }
        }
        \line {
          \bold  "11."
          \column {
            "Seht das Brot, die Engelspeise!"
            "Auf des Lebens Pilgerreise"
            "nehmt es nach der Kinder Weise,"
            "nicht den Hunden werft es hin!"
            ""
            "Lang im Bild war‘s vorbereitet:"
            "Isaak, der zum Opfer schreitet;"
            "Osterlamm, zum Mahl bereitet;"
            "Manna nach der Väter Sinn."
          }
        }
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        \line {
          \bold \paragraph { "12." }
          \column {
            "Bone pastor, panis vere,"
            "Jesu, nostri miserere,"
            "Tu nos pasce, nos tuere,"
            "Tu nos bona fac videre"
            "In terra viventium."
          }
        }
        \line {
          \bold  "12."
          \column {
            "Guter Hirt, du wahre Speise,"
            "Jesus, gnädig dich erweise!"
            "Nähre uns auf deinen Auen,"
            "lass uns deine Wonnen schauen"
            "in des Lebens ewigem Reich!"
          }
        }
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
        \line {
          \bold \paragraph { "13." }
          \column {
            "Tu qui cuncta scis et vales,"
            "Qui nos pascis hic mortales,"
            "Tuos ibi commensales,"
            "Cohæredes et sodales"
            "Fac sanctorum civium."
          }
        }
        \line {
          \bold  "13."
          \column {
            "Du, der alles weiß und leitet,"
            "uns im Tal des Todes weidet,"
            "lass an deinem Tisch uns weilen,"
            "deine Herrlichkeit uns teilen."
            "Deinen Seligen mach uns gleich!"
          }
        }
      }
}

HTH,
  Harm

Manuela

  • Member
Re: Markup mit automatischem Seitenumbruch
« Antwort #4 am: Montag, 10. Oktober 2016, 13:09 »
Danke Harm, das schaut ziemlich gut aus!  :) Da wäre ich nie selber drauf gekommen.

Manuela

  • Member
Re: Markup mit automatischem Seitenumbruch
« Antwort #5 am: Dienstag, 11. Oktober 2016, 21:11 »
Harm, jetzt hätte ich noch eine dumme Frage.

Gesetzt den Fall, ich will den folgenden Text in Blöcken zu bspw. 6 Zeilen unterteilen, sodass alle 6 Zeilen ein Seitenumbruch möglich ist, aber es soll keine Lücke zwischen den Zeilen aufscheinen, wo die Unterteilung stattfindet, wie muss ich \override #'(baseline-skip . 4) wählen?

"Meine Oma hat im Backenzahn ein Radio"
"Meine Oma bäckt im Kühlschrank eine Torte"
"Meine Oma hat Klosettpapier mit Blümchen"
"Meine Oma hat ne Brille mit Gardine"
"Meine Oma hat ne Glatze mit Geländer"
"Meine Oma hat nen Krückstock mit nem Rücklicht"
"Meine Oma hat nen Goldfisch, der raucht Pfeife"
"Meine Oma hat nen Löffel mit Propeller"
"Meine Oma hat ’nen Kochtopf mit ’nem Lenkrad"
"Meine Oma hat ein Himmelbett mit Brause"
"Meine Oma spielt in Hollywood 'nen Cowboy"
"Meine Oma hat ’nen Nachttopf mit Beleuchtung"
"Meine Oma fährt im Panzer zum Finanzamt"
"Meine Oma hat ’nen Petticoat aus Wellblech"
"Meine Oma fährt im Suppenteller U-Boot"
"Meine Oma hat im Strumpfband ’nen Revolver"
"Meine Oma hat nen Sturzhelm mit Antenne"
"Meine Oma hat ein Waschbecken mit Sprungbrett"
"Meine Oma geht mit Taucherbrille duschen"
"Meine Oma schießt beim Fußball den Elfmeter"
"Meine Oma lernt im Gurkenglas das Schwimmen"
"Meine Oma hat ’nen Papagei mit Bluejeans"
"Meine Oma hat ein Smartphone mit ’nem Couchtisch"
"Meine Oma hat ’nen Dackel, der trägt Höschen"
"Meine Oma guckt die Tagesschau mit ’m Fernrohr"
"Meine Oma hat im Strumpfband ´nen Revolver..."
"Meine Oma hat ´nen Bandwurm, der gibt Pfötchen"
"Meine Oma hat ein Himmelbett mit Auspuff"
"Meine Oma fährt auf Opa's Glatze Schlittschuh"

Ich habe das durch Trial&Error rausgefunden, gibt es da eine Systematik?
\version "2.19.37"

%% make the hspace adjustable, by defining a property for its amount
#(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))))


\markuplist {
  %% used to indent the first element of each row:
  \override #'(x-shift . 3)
  %% used to adjust the horizontal distance between the columns:
  \override #'(padding . 1)
  %% used to adjust the vertical distance between the rows
  \override #'(baseline-skip . 4)
  %% the first argument of `table' is a list determining the alignment of
  %% the args for each column
  %% '(-1 -1) means: first column is left aligned, second column as well
  \table #'(-1 -1)
  %% reset needed to prevent the former baseline-skip-override to take action
  %% on the column-markup
  \override #'(baseline-skip . 3)
  %\box
  {
    \line {
      \bold  \concat \paragraph { \with-color #white "1"  }
      \column {
        "Meine Oma hat im Backenzahn ein Radio"
        "Meine Oma bäckt im Kühlschrank eine Torte"
        "Meine Oma hat Klosettpapier mit Blümchen"
        "Meine Oma hat ne Brille mit Gardine"
        "Meine Oma hat ne Glatze mit Geländer"
        "Meine Oma hat nen Krückstock mit nem Rücklicht"
        "Meine Oma hat nen Goldfisch, der raucht Pfeife"
      }
    }
    \line {
      %% rechte Spalte
       \column {
        " "
      }
    }
    \line {
      \bold \concat \paragraph { \with-color #white "1"  }
      \column {
        "Meine Oma hat nen Löffel mit Propeller"
        "Meine Oma hat ’nen Kochtopf mit ’nem Lenkrad"
        "Meine Oma hat ein Himmelbett mit Brause"
        "Meine Oma spielt in Hollywood 'nen Cowboy"
        "Meine Oma hat ’nen Nachttopf mit Beleuchtung"
        "Meine Oma fährt im Panzer zum Finanzamt"
        "Meine Oma hat ’nen Petticoat aus Wellblech"
      }
    }
    \line {
      %% rechte Spalte
      \column {
        " "
      }
    }
    \line {
      \bold \concat \paragraph  { \with-color #white "1"  }
      \column {
        "Meine Oma fährt im Suppenteller U-Boot"
        "Meine Oma hat im Strumpfband ’nen Revolver"
        "Meine Oma hat nen Sturzhelm mit Antenne"
        "Meine Oma hat ein Waschbecken mit Sprungbrett"
        "Meine Oma geht mit Taucherbrille duschen"
        "Meine Oma schießt beim Fußball den Elfmeter"
        "Meine Oma lernt im Gurkenglas das Schwimmen"
      }
    }
  }
}

harm6

  • Member
Re: Markup mit automatischem Seitenumbruch
« Antwort #6 am: Mittwoch, 12. Oktober 2016, 00:34 »
Manuela, Dein vorheriges Beispiel war kompliziert, da Du offensichtlich immer den lateinischen und den deutschen in zwei Spalten gegenüberstellen wolltest.
Im "Oma"-Beispiel scheinst Du nur eine Spalte haben zu wollen.
Falls das so ist, dann brauchst Du \table eigentlich nicht.

Aber zum eigentlichen Problem, baseline-skip.
In einem minimal siehst Du was passiert:
\markup
  \column {
     \column { a b }
     \column { x y }
  }
Per default findet kein akkurates vertical spacing spacing zwischen den beiden gestapelten Spalten statt. Tatsächlich ist selbst das manuelle setzen schwierig zu bestimmen, probier mal:
\markup
  \column {
     \column { f g }
     \column { x y }
  }
und versuche gleiche baseline-skip-Werte für beide Beispiele zu finden...

Im "Oma"-Beipiel ist der Abstand dieser beiden Zeilen ebenfalls inkonsistent:
"Meine Oma hat ’nen Petticoat aus Wellblech"
"Meine Oma fährt im Suppenteller U-Boot"
Man muß allerdings genau hinschauen ;)

Hier kann column-lines helfen. Ein markup-list-command welches die vertikale Ausdehnung der stencils besser im Griff hat. Es gibt auch einen Nachteil bei diesem Befehl, falls Du drüber stoperst melde Dich. Es funktioniert jedoch meistens out of the box.

Das führt zu:

\version "2.19.37"

%% make the hspace adjustable, by defining a property for its amount
#(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))))


\markuplist {
  %% used to indent the first element of each row:
  \override #'(x-shift . 3)
  %% used to adjust the horizontal distance between the columns:
%  \override #'(padding . 1)
  %% used to adjust the vertical distance between the rows
%  \override #'(baseline-skip . 4)
  %% the first argument of `table' is a list determining the alignment of
  %% the args for each column
  %% '(-1 -1) means: first column is left aligned, second column as well
 
  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  %% The amount of elements determine how many columns are done !!
  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  \table #'(-1)
  %% reset needed to prevent the former baseline-skip-override to take action
  %% on the column-markup
%  \override #'(baseline-skip . 3)
%  \box
  {
    \line {
      \bold  \concat \paragraph { \with-color #white "1"  }
      \column
      \column-lines
      {
        "Meine Oma hat im Backenzahn ein Radio"
        "Meine Oma bäckt im Kühlschrank eine Torte"
        "Meine Oma hat Klosettpapier mit Blümchen"
        "Meine Oma hat ne Brille mit Gardine"
        "Meine Oma hat ne Glatze mit Geländer"
        "Meine Oma hat nen Krückstock mit nem Rücklicht"
        "Meine Oma hat nen Goldfisch, der raucht Pfeife"
      }
    }
    \line {
      \bold \concat \paragraph { \with-color #white "1"  }
      \column
      \column-lines
      {
        "Meine Oma hat nen Löffel mit Propeller"
        "Meine Oma hat ’nen Kochtopf mit ’nem Lenkrad"
        "Meine Oma hat ein Himmelbett mit Brause"
        "Meine Oma spielt in Hollywood 'nen Cowboy"
        "Meine Oma hat ’nen Nachttopf mit Beleuchtung"
        "Meine Oma fährt im Panzer zum Finanzamt"
        "Meine Oma hat ’nen Petticoat aus Wellblech"
      }
    }
    \line {
      \bold \concat \paragraph  { \with-color #white "1"  }
      \column
      \column-lines
      {
        "Meine Oma fährt im Suppenteller U-Boot"
        "Meine Oma hat im Strumpfband ’nen Revolver"
        "Meine Oma hat nen Sturzhelm mit Antenne"
        "Meine Oma hat ein Waschbecken mit Sprungbrett"
        "Meine Oma geht mit Taucherbrille duschen"
        "Meine Oma schießt beim Fußball den Elfmeter"
        "Meine Oma lernt im Gurkenglas das Schwimmen"
      }
    }
  }
}
Beachte, daß das erste Argument von \table jetzt anders ist. Siehe Kommentar.

Das obere ist aber im Endeffekt einfacher zu erreichen mit:

\version "2.19.37"

%% make the hspace adjustable, by defining a property for its amount
#(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))))

\markuplist {
  %% used to indent the first element of each row:
  \override #'(x-shift . 3)
  \column-lines {
    \line {
      \bold  \concat \paragraph { \with-color #white "1"  }
      \column
      \column-lines
      {
        "Meine Oma hat im Backenzahn ein Radio"
        "Meine Oma bäckt im Kühlschrank eine Torte"
        "Meine Oma hat Klosettpapier mit Blümchen"
        "Meine Oma hat ne Brille mit Gardine"
        "Meine Oma hat ne Glatze mit Geländer"
        "Meine Oma hat nen Krückstock mit nem Rücklicht"
        "Meine Oma hat nen Goldfisch, der raucht Pfeife"
      }
    }
    \line {
      \bold \concat \paragraph { \with-color #white "1"  }
      \column
      \column-lines
      {
        "Meine Oma hat nen Löffel mit Propeller"
        "Meine Oma hat ’nen Kochtopf mit ’nem Lenkrad"
        "Meine Oma hat ein Himmelbett mit Brause"
        "Meine Oma spielt in Hollywood 'nen Cowboy"
        "Meine Oma hat ’nen Nachttopf mit Beleuchtung"
        "Meine Oma fährt im Panzer zum Finanzamt"
        "Meine Oma hat ’nen Petticoat aus Wellblech"
      }
    }
    \line {
      \bold \concat \paragraph  { \with-color #white "1"  }
      \column
      \column-lines
      {
        "Meine Oma fährt im Suppenteller U-Boot"
        "Meine Oma hat im Strumpfband ’nen Revolver"
        "Meine Oma hat nen Sturzhelm mit Antenne"
        "Meine Oma hat ein Waschbecken mit Sprungbrett"
        "Meine Oma geht mit Taucherbrille duschen"
        "Meine Oma schießt beim Fußball den Elfmeter"
        "Meine Oma lernt im Gurkenglas das Schwimmen"
      }
    }
  }
}
;)

In meinen Tests war ich allerdings nicht immer einverstanden mit dem von LilyPond gewählten Umbruchspunkt :(

Gruß,
  Harm


Manuela

  • Member
Re: Markup mit automatischem Seitenumbruch
« Antwort #7 am: Mittwoch, 12. Oktober 2016, 08:28 »
Manuela, Dein vorheriges Beispiel war kompliziert, da Du offensichtlich immer den lateinischen und den deutschen in zwei Spalten gegenüberstellen wolltest.
Im "Oma"-Beispiel scheinst Du nur eine Spalte haben zu wollen.
Falls das so ist, dann brauchst Du \table eigentlich nicht.


Genau so ist es, es gibt zwei Varianten, abhängig von der Strophenlänge. Bei den üblichen kürzeren Strophen 2 Spalten, und bei Gstanzln eine Spalte.

In letzterem Fall könnte ich die Schachtelung von column-lines, column und line sogar sparen, das funktioniert auch

\version "2.19.37"

\markuplist {
  \column-lines
  {
        "Meine Oma hat im Backenzahn ein Radio"
        "Meine Oma bäckt im Kühlschrank eine Torte"
        "Meine Oma hat Klosettpapier mit Blümchen"
        "Meine Oma hat ne Brille mit Gardine"
        "Meine Oma hat ne Glatze mit Geländer"
        "Meine Oma hat nen Krückstock mit nem Rücklicht"
        "Meine Oma hat nen Goldfisch, der raucht Pfeife"
        "Meine Oma hat nen Löffel mit Propeller"
        "Meine Oma hat ’nen Kochtopf mit ’nem Lenkrad"
        "Meine Oma hat ein Himmelbett mit Brause"
        "Meine Oma spielt in Hollywood 'nen Cowboy"
        "Meine Oma hat ’nen Nachttopf mit Beleuchtung"
        "Meine Oma fährt im Panzer zum Finanzamt"
        "Meine Oma hat ’nen Petticoat aus Wellblech"
        "Meine Oma fährt im Suppenteller U-Boot"
        "Meine Oma hat im Strumpfband ’nen Revolver"
        "Meine Oma hat nen Sturzhelm mit Antenne"
        "Meine Oma hat ein Waschbecken mit Sprungbrett"
        "Meine Oma geht mit Taucherbrille duschen"
        "Meine Oma schießt beim Fußball den Elfmeter"
        "Meine Oma lernt im Gurkenglas das Schwimmen"
      }
    }
 

Grundsätzlich ist Lilypond jedoch nicht für den Satz von Büchern entworfen, es ergeben sich ständig neue Probleme (z.B. Score-Schusterjungen, obwohl auf der Seite noch genug Platz für eine weitere Systemzeile wäre; aber das muss ich noch näher erforschen), wahrscheinlich werde ich irgendwann um LaTeX nicht herumkommen.
« Letzte Änderung: Mittwoch, 12. Oktober 2016, 08:35 von Manuela »

Manuela

  • Member
Re: Markup mit automatischem Seitenumbruch
« Antwort #8 am: Mittwoch, 12. Oktober 2016, 08:44 »
Und falls ich einen Textblock haben will, der auf einer Seite zusammen bleiben soll, sperre ich ihn in column ein, habe ich das richtig verstanden?

\version "2.19.37"
#(set-global-staff-size 26)
#(set-default-paper-size "a7")
\markuplist {
  \column-lines
  {
        "Meine Oma hat nen Löffel mit Propeller"
        "Meine Oma hat ’nen Kochtopf mit ’nem Lenkrad"
        "Meine Oma hat ein Himmelbett mit Brause"
        "Meine Oma spielt in Hollywood 'nen Cowboy"
        "Meine Oma hat ’nen Nachttopf mit Beleuchtung"
        "Meine Oma fährt im Panzer zum Finanzamt"
        "Meine Oma hat ne Brille mit Gardine"
        "Meine Oma hat ne Glatze mit Geländer"
        "Meine Oma bäckt im Kühlschrank eine Torte"
        "***************************"

   \column
     \column-lines
      {
        "==================================="
        "dieser Textblock soll auf einer Seite zusammen bleiben"
        "Meine Oma hat im Backenzahn ein Radio"
        "Meine Oma bäckt im Kühlschrank eine Torte"
        "Meine Oma hat Klosettpapier mit Blümchen"
        "Meine Oma hat ne Brille mit Gardine"
        "Meine Oma hat ne Glatze mit Geländer"
        "Meine Oma hat nen Krückstock mit nem Rücklicht"
        "Meine Oma hat im Backenzahn ein Radio"
        "Meine Oma bäckt im Kühlschrank eine Torte"
        "Meine Oma hat Klosettpapier mit Blümchen"
        "Meine Oma hat ne Brille mit Gardine"
        "Meine Oma hat nen Krückstock mit nem Rücklicht"
        "***************************"
}
        "Meine Oma hat nen Löffel mit Propeller"
        "Meine Oma hat ’nen Kochtopf mit ’nem Lenkrad"
        "Meine Oma hat ein Himmelbett mit Brause"
        "Meine Oma spielt in Hollywood 'nen Cowboy"
        "Meine Oma hat ’nen Nachttopf mit Beleuchtung"
        "Meine Oma fährt im Panzer zum Finanzamt"
        "Meine Oma hat ’nen Petticoat aus Wellblech"
        "Meine Oma fährt im Suppenteller U-Boot"
        "Meine Oma hat im Strumpfband ’nen Revolver"
        "Meine Oma hat nen Sturzhelm mit Antenne"
        "Meine Oma hat ein Waschbecken mit Sprungbrett"
        "Meine Oma geht mit Taucherbrille duschen"
        "Meine Oma schießt beim Fußball den Elfmeter"
        "Meine Oma lernt im Gurkenglas das Schwimmen"
      }
    }
 

harm6

  • Member
Re: Markup mit automatischem Seitenumbruch
« Antwort #9 am: Mittwoch, 12. Oktober 2016, 15:33 »
Ich hab' noch was am Problem gearbeitet. Z.B. hat mich diese Fummelei bei der Strophennummerierung gestört. Ich habe auch nach Wegen gesucht zwischen ein/zwei/mehrspaltigem layout mit möglichst wenig Aufwand hin- und her zu wechseln.

Hier das Ergebnis:

\version "2.19.37"

%% if in separate bookpart, play around with:
\paper {
%ragged-last-bottom = ##t
%page-breaking = #ly:minimal-breaking
%annotate-spacing = ##t
%markup-markup-spacing.minimum-distance = 40
%markup-markup-spacing.basic-distance = 40
}

%% make the hspace adjustable, by defining a property for its amount
#(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 (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 (numbering lst)
  "Returns a list of custom formated markups for numbers, relying on the length
of @var{lst}, starting with number 2"
  (map
    (lambda (i)
      #{ \markup \concat \paragraph { \bold #(format #f "~a. " i) } #})
    (iota (length lst) 2 1)))
   
pushDownTesting =
#(define-scheme-function (vval)(number?)
  #{
  \markup
    \rounded-box
    \fill-line {
      \column {
        "some-space to push all down"
        #(format #f "arg `vval' has the value: ~a" vval)
        \vspace #vval
      }
    }
#})

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Examples
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%% none of the examples has formating for
%% - \paragraph: hspace-amount
%% - \table:  padding or baseline-skip

%% for page-break testings:
\pushDownTesting #10

%%%%%%%%%%%%%
%% first
%%%%%%%%%%%%%

firstCol =
\markuplist {
  \column
    \column-lines {
      "Laudis thema specialis"
      "Panis vivus et vitalis"
      "Hodie proponitur."
      "Quem in sacræ mensa cœnæ"
      "Turbæ fratrum duodenæ"
      "Datum non ambigitur."
    }
  \column
    \column-lines {
      "Sit laus plena, sit sonora;"
      "Sit iucunda, sit decora"
      "Mentis iubilatio,"
      "Dies enim solemnis agitur"
      "In qua mensæ prima recolitur"
      "Huius institutio."
    }
  \column
    \column-lines {
      "In hac mensa novi Regis"
      "Novum Pascha novæ legis"
      "Phase vetus terminat."
      "Vetustatem novitas,"
      "Umbram fugat veritas,"
      "Noctem lux eliminat."
    }
}

secondCol =
\markuplist {
  \column
    \column-lines {
      "Dieses Brot sollst du erheben,"
      "welches lebt und gibt das Leben,"
      "das man heut‘ den Christen weist."
      "Dieses Brot, mit dem im Saale"
      "Christus bei dem Abendmahle"
      "die zwölf Jünger hat gespeist."
    }
  \column
    \column-lines {
      "Laut soll unser Lob erschallen"
      "und das Herz in Freude wallen,"
      "denn der Tag hat sich genaht,"
      "Da der Herr zum Tisch der Gnaden"
      "uns zum ersten Mal geladen"
      "und dies Mahl gestiftet hat."
    }
%% commented, to test unequal lengths
%  \column
%    \column-lines {
%      "Neuer König, neue Zeiten,"
%      "neue Ostern, neue Freuden,"
%      "neues Opfer allzumal!"
%      "Vor der Wahrheit muss das Zeichen,"
%      "vor dem Licht der Schatten weichen,"
%      "hell erglänzt des Tages Strahl."
%    }
}

\markuplist {
  \rounded-box \fill-line { "first Example" }
  \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 firstCol)
    firstCol
    (numbering secondCol)
    secondCol))
}

%%%%%%%%%%%%%
%% second
%%%%%%%%%%%%%

\markuplist {
  \rounded-box \fill-line { "second Example" }
  \table
#'(1 -1)
#(append (reorder-lists (list (numbering firstCol) firstCol))
         (reorder-lists (list (numbering secondCol) secondCol)))
}


%%%%%%%%%%%%%
%% second
%%%%%%%%%%%%%

omaCol =
\markuplist {
  \column
    \column-lines {
      "Meine Oma hat im Backenzahn ein Radio"
      "Meine Oma bäckt im Kühlschrank eine Torte"
      "Meine Oma hat Klosettpapier mit Blümchen"
      "Meine Oma hat ne Brille mit Gardine"
      "Meine Oma hat ne Glatze mit Geländer"
      "Meine Oma hat nen Krückstock mit nem Rücklicht"
      "Meine Oma hat nen Goldfisch, der raucht Pfeife"
    }
  \column
    \column-lines {
      "Meine Oma hat nen Löffel mit Propeller"
      "Meine Oma hat ’nen Kochtopf mit ’nem Lenkrad"
      "Meine Oma hat ein Himmelbett mit Brause"
      "Meine Oma spielt in Hollywood 'nen Cowboy"
      "Meine Oma hat ’nen Nachttopf mit Beleuchtung"
      "Meine Oma fährt im Panzer zum Finanzamt"
      "Meine Oma hat ’nen Petticoat aus Wellblech"
    }
  \column
    \column-lines {
      "Meine Oma fährt im Suppenteller U-Boot"
      "Meine Oma hat im Strumpfband ’nen Revolver"
      "Meine Oma hat nen Sturzhelm mit Antenne"
      "Meine Oma hat ein Waschbecken mit Sprungbrett"
      "Meine Oma geht mit Taucherbrille duschen"
      "Meine Oma schießt beim Fußball den Elfmeter"
      "Meine Oma lernt im Gurkenglas das Schwimmen"
    }
}
 
\markuplist {
  \rounded-box \fill-line { "third Example" }
  \table
#'(1 -1)
#(reorder-lists
  (list
    ;; numbering is done for each list, because we can't warrant equal
    ;; length of each list
    (numbering omaCol)
    omaCol))
}

HTH,
  Harm

Manuela

  • Member
Re: Markup mit automatischem Seitenumbruch
« Antwort #10 am: Mittwoch, 12. Oktober 2016, 21:06 »
Danke Harm  :)
Das artet ja in Luxus aus  ;)

Ich habe die numbering-funktion ein wenig erweitert, sodass ich einen beliebigen Startwert angeben kann. Dadurch kann ich die Strophen bequem durchnummerieren.  :)
« Letzte Änderung: Mittwoch, 12. Oktober 2016, 21:17 von Manuela »

Manuela

  • Member
Re: Markup mit automatischem Seitenumbruch
« Antwort #11 am: Donnerstag, 13. Oktober 2016, 10:13 »
Harm, es tut mir leid, nochmals lästig fallen zu müssen.
Durch den Seitenumbruch wäre es günstig, die Strophen horizontal zu nummerieren, also 1. Strophe links, 2. Strophe rechts, 3. Strophe links, 4. Strophe rechts etc.

Die Markupliste wie sie jetzt ist schreibt die Strophen 2 bis n in der linken Spalte runter, die Strophen n+1 bis 2n in der rechten Spalte. Ich habe mal ein Beispiel zusammengestellt (abgesehen davon, dass Text am rechten Rand abgeschnitten wird, aber das ist nicht das Problem).

Noch idealer für mich wäre, wenn ich alle Strophen in einer Liste untereinander schreiben könnte, der Spaltenumbruch nach der Hälfte erfolgen würde und eine eventuell vorhandene einzelne Strophe mittig am Schluss angeordnet würde. Grundsätzlich könnte ich mir sowas vermutlich selber basteln, allerdings würde mich das einige Stunden kosten (in denen ich eine Menge Lieder setzen könnte), daher bin ich so unverschämt  :-[

Hier mein Beispiel mit Seitenumbruch:
\version "2.19.37"
#(set-global-staff-size 20)
#(set-default-paper-size "a6")
#(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 (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 (numbering-start lst strt)
   "Returns a list of custom formated markups for numbers, relying on the length
of @var{lst}, starting with number strt"
   (map
    (lambda (i)
      #{ \markup \concat \paragraph { \bold #(format #f "~a. " i) } #})
    (iota (length lst) strt 1)))

firstCol =
\markuplist {
  \column
  \column-lines {
    "Unser Kapitän, der Dicke,"
    "Kaum drei Käse ist er groß,"
    "auf der Brücke eine Schnauze,"
    "Wie’ne Ankerklüse groß."
  }
  \column
  \column-lines {
    "In der Rechten einen Whiskey,"
    "In der Linken einen Köm,"
    "Und die spiegelblanke Glatze,"
    "Das ist unser Kapitän."
  }
  \column
  \column-lines {
    "In der einen Hand die Kanne,"
    "In der andern Hand den Twist,"
    "Und dazu die große Schnauze,"
    "Fertig ist der Maschinist."
  }
  \column
  \column-lines {
    "Und der erste Maschinist,"
    "Ist Chinese, und kein Christ,"
    "und der erste Offizier,"
    "Der trägt Wäsche aus Papier."
  }
  \column
  \column-lines {
    "Und man hat sich dann gewaschen"
    "Und man denkt, nun bist du rein;"
    "Kommt so’n Bootsmannsmaat der Wache:"
    "„Wasch dich noch einmal du Schwein!“"
  }
  \column
  \column-lines {
    "In des Bunkers tiefsten Gründen,"
    "Zwischen Kohlen ganz versteckt,"
    "Pennt der allerfaulste Stoker,"
    "Bis der Obermaat ihn weckt."
  }
  \column
  \column-lines {
    "„Komm mal rauf, mein Herzensjunge,"
    "Komm mal rauf, du altes Schwein,"
    "Nicht mal Kohlen kannst du trimmen"
    "Und ein Heizer willst du sein?“"
  }
}

secondCol =
\markuplist {

  \column
  \column-lines {
    "Und er haut ihm vor’n Dassel,"
    "Daß er in die Kohlen fällt"
    "Und die heilgen zwölf Apostel"
    "Für ’ne Räuberbande hält."
  }
  \column
  \column-lines {
    "Und im Heizraum bei einer Hitze"
    "Von fast über fünfzig Grad"
    "Muß der Stoker feste schwitzen"
    "Und im Luftschacht sitzt der Maat."
  }
  \column
  \column-lines {
    "Und der Koch in der Kombüse,"
    "Diese vollgefressene Sau,"
    "Mit de Beene ins Gemüse,"
    "Mit de Arme im Kakau."
  }
  \column
  \column-lines {
    "Und der Koch in der Kombüse,"
    "Diese zentnerschwere Sau,"
    "Kocht uns alle Tage Pampe,"
    "Uschi, Uschi mit Wauwau."
  }
  \column
  \column-lines {
    "Mit der Fleischbank schwer beladen"
    "Schwankt der Seemann über Deck;"
    "Doch das Fleisch ist voller Maden,"
    "Läuft ihm schon von selber weg."
  }
  \column
  \column-lines {
    "Und die silberweißen Möwen,"
    "Die erfüllen ihren Zweck"
    "Und sie scheissen, scheissen, scheissen"
    "Auf das frischgewaschne Deck."
  }
  \column
  \column-lines {
    "In der Heimat angekommen,"
    "Fängt ein neues Leben an,"
    "Eine Frau wird sich genommen,"
    "Kinder bringt der Weihnachtsmann."
  }
}

\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 firstCol 2)
     firstCol
     (numbering-start secondCol 9)
     secondCol))
}

harm6

  • Member
Re: Markup mit automatischem Seitenumbruch
« Antwort #12 am: Donnerstag, 13. Oktober 2016, 15:11 »
Ich habs nochmal umgeschrieben, dauert auch bei mir ein paar Stunden ;)

Anwendung sollte aus den doc-strings klar werden.
Man kann jetzt mit Änderung eines einzigen Parameters die Anzahl der Spalten bestimmen, wobei bei mehreren Spalten ein evtl. überschüssiges Element zentriert am Schluß gedruckt wird. Aber auch das ist einstellbar.

Falls jede Strophe gleiche Anzahl an Zeilen hat, so wäre auch das zweite Coding möglich.
Auf jeden Fall reicht es jetzt aus alle Strophen in eine markuplist zu packen. Die Nummerierung erfolgt jetzt automatisch.
`reorder-lists' ist deshalb gestrichen.
Falls Du wieder auf die andere Anordnung wechseln willst, d.h.
1 3
2 4
statt
1 2
3 4
mag es wiederum nützlich sein. Hab' ich aber nicht getestet.

\version "2.19.48"

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

#(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 strt"
   (map
    (lambda (i) #{ \markup \bold #(format #f "~a." i) #})
    (iota (length lst) strt 1)))
   
formatAdditionalVerses =
#(define-scheme-function (center-overshoot number-start columns lst)
  ((boolean? #t) index? index? markup-list?)
  "Takes a markup-list.  Returns a table with each markup of @var{lst} numbered,
starting at @var{number-start}. 
If the table is overfull by 1 markup, an additional centered line containing
this markup is printed.  For a multi-column-markup-list this feature can be
disabled setting optional @var{center-overshoot} @code{#f}.
For a one-column-markup-list the last markup is never printed centered. 
The amount of columns for the table is controlled by @var{columns}.
@var{baseline-skip} is hard-coded to value 3."
;; TODO
;; Does it makes sense to turn this into a markup-list-command?
;; Variables `number-start' and `columns' could be done as properties then.

  (let* ((numberings (numbering-start lst number-start))
         (new-list
           (map
             (lambda (x y)
               #{
                   \markup
                     \override #'(baseline-skip . 3)
                     \line {
                      \paragraph {
                         \overlay {
                           \right-align \transparent "222"
                           \right-align $x
                         }
                      }
                      $y
                     }
               #})
             numberings
             lst))
         (lst-lngth (length lst))
         (table-lst
           (if (and (odd? lst-lngth)
                    (= (remainder lst-lngth columns) 1)
                    center-overshoot)
               (drop-right new-list 1)
               new-list))
         (odd-tail
           (if (and (odd? lst-lngth)
                    (= (remainder lst-lngth columns) 1)
                    center-overshoot)
               (take-right new-list 1)
               #f))
         (columns-format-list (make-list columns LEFT))
         (args-list
           #{ \markuplist { \table #columns-format-list #table-lst } #})
         (args-list-rev
           (append
             args-list
             (if odd-tail
                 #{
                  \markuplist
                     \column-lines { \fill-line { \line { #odd-tail } } }
                 #}
                 '()))))
    args-list-rev))

cols =
\markuplist {
  \column
  \column-lines {
    "Unser Kapitän, der Dicke,"
    "Kaum drei Käse ist er groß,"
    "auf der Brücke eine Schnauze,"
    "Wie’ne Ankerklüse groß."
  }
  \column
  \column-lines {
    "In der Rechten einen Whiskey,"
    "In der Linken einen Köm,"
    "Und die spiegelblanke Glatze,"
    "Das ist unser Kapitän."
  }
  \column
  \column-lines {
    "In der einen Hand die Kanne,"
    "In der andern Hand den Twist,"
    "Und dazu die große Schnauze,"
    "Fertig ist der Maschinist."
  }
  \column
  \column-lines {
    "Und der erste Maschinist,"
    "Ist Chinese, und kein Christ,"
    "und der erste Offizier,"
    "Der trägt Wäsche aus Papier."
  }
  \column
  \column-lines {
    "Und man hat sich dann gewaschen"
    "Und man denkt, nun bist du rein;"
    "Kommt so’n Bootsmannsmaat der Wache:"
    "„Wasch dich noch einmal du Schwein!“"
  }
  \column
  \column-lines {
    "In des Bunkers tiefsten Gründen,"
    "Zwischen Kohlen ganz versteckt,"
    "Pennt der allerfaulste Stoker,"
    "Bis der Obermaat ihn weckt."
  }
  \column
  \column-lines {
    "„Komm mal rauf, mein Herzensjunge,"
    "Komm mal rauf, du altes Schwein,"
    "Nicht mal Kohlen kannst du trimmen"
    "Und ein Heizer willst du sein?“"
  }
  \column
  \column-lines {
    "Und er haut ihm vor’n Dassel,"
    "Daß er in die Kohlen fällt"
    "Und die heilgen zwölf Apostel"
    "Für ’ne Räuberbande hält."
  }
  \column
  \column-lines {
    "Und im Heizraum bei einer Hitze"
    "Von fast über fünfzig Grad"
    "Muß der Stoker feste schwitzen"
    "Und im Luftschacht sitzt der Maat."
  }
  \column
  \column-lines {
    "Und der Koch in der Kombüse,"
    "Diese vollgefressene Sau,"
    "Mit de Beene ins Gemüse,"
    "Mit de Arme im Kakau."
  }
  \column
  \column-lines {
    "Und der Koch in der Kombüse,"
    "Diese zentnerschwere Sau,"
    "Kocht uns alle Tage Pampe,"
    "Uschi, Uschi mit Wauwau."
  }
  \column
  \column-lines {
    "Mit der Fleischbank schwer beladen"
    "Schwankt der Seemann über Deck;"
    "Doch das Fleisch ist voller Maden,"
    "Läuft ihm schon von selber weg."
  }
  \column
  \column-lines {
    "Und die silberweißen Möwen,"
    "Die erfüllen ihren Zweck"
    "Und sie scheissen, scheissen, scheissen"
    "Auf das frischgewaschne Deck."
  }
  \column
  \column-lines {
    "In der Heimat angekommen,"
    "Fängt ein neues Leben an,"
    "Eine Frau wird sich genommen,"
    "Kinder bringt der Weihnachtsmann."
  }
  \column
  \column-lines {
    "Test-strophe,"
    "steht hier, allein"
    "zum Zwecke, ungerade"
    "Strophenzahl zu demonstrieren."
  }
}

\markuplist {
\override #'(padding . 10)
\override #'(x-shift . 5)
\override #'(baseline-skip . 5)
\formatAdditionalVerses 
  %% `formatAdditionalVerses' has an optional argument, controlling
  %% whether a possible remaining markup within a multi-column table
  %% should be centered on the line, default is #t, try uncommenting:
  % ##f
  %% additional verses starts with this numbering
  #2
  %% amount of columns
  #2
  \cols
}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% _If_ all verses have the same amount of lines one could do:
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

#(define (equal-sized-splited-list lst n rl)
  "Split @var{lst} in equal sized parts of length @var{n}.
If @var{lst} is finally not empty add the remaining rest."
  (cond ((null? lst) (reverse rl))
        ((< (length lst) n) (reverse (cons lst rl)))
        (else
          (equal-sized-splited-list (drop lst n) n (cons (take lst n) rl)))))

columns-markup-list =
#(define-scheme-function (lines-per-verse ls)(index? markup-list?)
  "Returns a markup-list.  Each markup is done from a subset of @var{ls} under
control of @var{lines-per-verse}.  The markups are custom-formated using
@code{\\column-lines}, @code{\\column} and a hard-coded @code{baseline-skip} of
value 3"
  (let ((splitted-ls (equal-sized-splited-list ls lines-per-verse '())))
    (map
      (lambda (l)
        #{ \markup \override #'(baseline-skip . 3) \column \column-lines $l #})
        splitted-ls) ))

verses =
\markuplist {
    "Unser Kapitän, der Dicke,"
    "Kaum drei Käse ist er groß,"
    "auf der Brücke eine Schnauze,"
    "Wie’ne Ankerklüse groß."
 
    "In der Rechten einen Whiskey,"
    "In der Linken einen Köm,"
    "Und die spiegelblanke Glatze,"
    "Das ist unser Kapitän."
 
    "In der einen Hand die Kanne,"
    "In der andern Hand den Twist,"
    "Und dazu die große Schnauze,"
    "Fertig ist der Maschinist."
 
    "Und der erste Maschinist,"
    "Ist Chinese, und kein Christ,"
    "und der erste Offizier,"
    "Der trägt Wäsche aus Papier."
 
    "Und man hat sich dann gewaschen"
    "Und man denkt, nun bist du rein;"
    "Kommt so’n Bootsmannsmaat der Wache:"
    "„Wasch dich noch einmal du Schwein!“"
 
    "In des Bunkers tiefsten Gründen,"
    "Zwischen Kohlen ganz versteckt,"
    "Pennt der allerfaulste Stoker,"
    "Bis der Obermaat ihn weckt."
 
    "„Komm mal rauf, mein Herzensjunge,"
    "Komm mal rauf, du altes Schwein,"
    "Nicht mal Kohlen kannst du trimmen"
    "Und ein Heizer willst du sein?“"
 
    "Und er haut ihm vor’n Dassel,"
    "Daß er in die Kohlen fällt"
    "Und die heilgen zwölf Apostel"
    "Für ’ne Räuberbande hält."
 
    "Und im Heizraum bei einer Hitze"
    "Von fast über fünfzig Grad"
    "Muß der Stoker feste schwitzen"
    "Und im Luftschacht sitzt der Maat."
 
    "Und der Koch in der Kombüse,"
    "Diese vollgefressene Sau,"
    "Mit de Beene ins Gemüse,"
    "Mit de Arme im Kakau."
 
    "Und der Koch in der Kombüse,"
    "Diese zentnerschwere Sau,"
    "Kocht uns alle Tage Pampe,"
    "Uschi, Uschi mit Wauwau."
 
    "Mit der Fleischbank schwer beladen"
    "Schwankt der Seemann über Deck;"
    "Doch das Fleisch ist voller Maden,"
    "Läuft ihm schon von selber weg."
 
    "Und die silberweißen Möwen,"
    "Die erfüllen ihren Zweck"
    "Und sie scheissen, scheissen, scheissen"
    "Auf das frischgewaschne Deck."
 
    "In der Heimat angekommen,"
    "Fängt ein neues Leben an,"
    "Eine Frau wird sich genommen,"
    "Kinder bringt der Weihnachtsmann."
 
    "Test-strophe,"
    "steht hier, allein"
    "zum Zwecke, ungerade"
    "Strophenzahl zu demonstrieren."
}

\markuplist {
\override #'(padding . 10)
\override #'(x-shift . 5)
\override #'(baseline-skip . 5)
\formatAdditionalVerses 
  %% additional verses starts with this numbering
  #2
  %% amount of columns
  #2
  \columns-markup-list #4 \verses
}


Gruß,
  Harm

Manuela

  • Member
Re: Markup mit automatischem Seitenumbruch
« Antwort #13 am: Donnerstag, 13. Oktober 2016, 17:27 »
Harm, ich weiß nicht, wie ich dir danken soll  :)
Falls du eine Idee hast (ich könnte dir was zum Naschen schicken z.B), dann sag es  :D

Manuela

  • Member
Re: Markup mit automatischem Seitenumbruch
« Antwort #14 am: Freitag, 14. Oktober 2016, 09:34 »
Harm, das ist der Fluch der guten Tat  ;)

Ich habe noch eine kleiner Ergänzung geschrieben für den Fall, dass ich keine Strophennummerierung haben mag. Geht sicher noch einfacher  :)

#(define (numbering-start lst strt)
   "Returns a list of custom formated markups for numbers, relying on the length
of @var{lst}, starting with number strt"
   (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)))
   )