• 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ü

Layout-Block in Variable (GELÖST)

Begonnen von ingmar, Sonntag, 24. Januar 2016, 19:15

Vorheriges Thema - Nächstes Thema

ingmar

Ich schleppe immer einen recht umfangreichen \layout-Block mit mir herum und würde diesen gerne in eine Variable auslagern. Leider gelingt es mir nicht:

Minimalbeispiel:
\version "2.18.2"

MUSIC = { c'4 d' e' f' g'1 }

\score {
\new Staff { \MUSIC }
\layout {
indent = 2\cm
\context {
  \StaffGroup
  \override StaffGrouper.staff-staff-spacing.basic-distance = #8
}
\context {
\Voice
\override TextScript.padding = #1
\override Glissando.thickness = #3
}
}
}\


..das kompiliert und zeigt die beabsichtiget Wirkung. Aber ich frage mich, warum folgende Ansätze zu Fehlermeldungen führen - was mach ich falsch?

1.
MUSIC = ...
LAYOUT = \layout {
   indent ...
   \context ...
   \context ...
}

\score {
   \new Staff { \MUSIC }
   \LAYOUT
}


2.
MUSIC = ...
LAYOUT = {
   indent ...
   \context ...
   \context ...
}

\score {
   \new Staff { \MUSIC }
   \layout \LAYOUT
}


Gruß,
--ingmar

fugenkomponist

#1
Du könntest den \layout-Block in eine eigene Datei packen und die da per \include einbinden, wo du ihn brauchst. (Mir ist noch eine zweite Möglichkeit eingefallen, die ohne zusätzliche Datei auskommt, siehe nächster Post).

indent.ily:
\version "2.19.35"

\layout {
  indent = 5\cm
}


test.ly:
\version "2.19.35"

foo = \relative {
  c'4 d e f g2 g
}

\score {
  \foo
  \include "indent.ily"
}

\score {
  \foo
}

fugenkomponist

Oh, es geht natürlich noch einfacher: Du brauchst (ähnlich wie bei \with-Blöcken in Variablen) an beiden Stellen den \layout-Befehl (bei der Definition und bei der Verwendung der Variablen). Damit sparst du dir die zusätzliche Datei.

\version "2.19.35"

foo = \relative {
  c'4 d e f g2 g
}

LAYOUT = \layout {
  indent = 5\cm
}

\score {
  \foo
  \layout { \LAYOUT }
}

\score {
  \foo
}

ingmar

ja, das hatten wir schonmal an ganz anderer Stelle. Das ist etwas, das mir einfach nicht in den Kopf geht. Warum das \layout zweimal kommen muss. *kopfschüttel*

aber vielen dank, ich denke, so komme ich weiter.

--ingmar

fugenkomponist

Ganz genau kann ich dir das auch nicht beantworten, aber es gibt noch mindestens einen weiteren, etwas versteckten Fall:\version "2.19.35"

\relative {
  c' d e f
}
\addlyrics {
  Al -- le mei -- ne
}


bla = \lyricmode {
  Al -- le mei -- ne
}
\relative {
  c' d e f
}
\addlyrics \bla

\addlyrics geht also automatisch in den \lyricmode, aber um Text in ne Variable zu packen, braucht man den \lyricmode auch nochmal. Ein zusätzliches \lyricmode im ersten Beispiel (\addlyrics \lyricmode { ...) wäre wiederum falsch.

Ich nehme mal an, dass an eine Variable nur was syntaktisch vollständiges zugewiesen werden kann, also muss z. B. bei der Zuweisung schon explizit \layout, \with oder \lyricmode stehen. Aber beim Aufruf muss LilyPond anscheinend auch wissen, was sich ungefähr in der Variable befindet, ohne sie auszuwerten. Daher auch an dieser Stelle das zweite Auftreten.

Grundsätzlich muss man sich halt von dem Gedanken verabschieden, dass Variablen wie reine Textersetzung funktionieren (anders als z. B. Dinge, die per #define in C/C++ definiert werden).