Autor Thema: Layout-Block in Variable (GELÖST)  (Gelesen 1460 mal)

ingmar

  • Member
Layout-Block in Variable (GELÖST)
« am: Sonntag, 24. Januar 2016, 19:15 »
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
« Letzte Änderung: Sonntag, 24. Januar 2016, 22:18 von ingmar »

fugenkomponist

  • Member
Re: Layout-Block in Variable
« Antwort #1 am: Sonntag, 24. Januar 2016, 21:13 »
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
}
« Letzte Änderung: Sonntag, 24. Januar 2016, 21:18 von fugenkomponist »

fugenkomponist

  • Member
Re: Layout-Block in Variable
« Antwort #2 am: Sonntag, 24. Januar 2016, 21:16 »
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

  • Member
re: Layout-Block in Variable
« Antwort #3 am: Sonntag, 24. Januar 2016, 21:55 »
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

  • Member
Re: Layout-Block in Variable
« Antwort #4 am: Sonntag, 24. Januar 2016, 22:13 »
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).