On 2020-03-12 11:49 am, Noeck wrote:
Thanks Francisco! That's great news!
It also works across separate header blocks and even from within
included files. And it is easier to turn it into a string than for the
\fromproperty mechanism. So this works for me:
\header {
title = "my title"
composer = "will be replaced"
}
% can also be included via \include
\header {
composer = \markup { Composer of \italic
#(string-append "»" (markup->string title) "«") }
% instead of string-append, I can now work with the string
}
% end of include
{ b }
It may be your intention, but markup->string strips out formatting. For
markup that is just simple text, you would not notice any loss. But it
is best to keep markup as markup in order to preserve formatting. You
never know when your simple text today needs to become more complex
later.
Next, why use strings and string-append at all? \markup already
supports the ability to concatenate multiple arguments into one. A
simple markup list (i.e. #{ \markup { one two three } #}) joins items
using word-space to separate them. If no spacing is desired, use
\concat. Anything more complex should really be done with custom markup
functions, so as to preserve the formatting and flexibility of markup
over pure text.
Finally, \fromproperty is important as it defers the evaluation of the
property. Using \title would give you the current value whereas
\fromproperty #'header:title can accommodate changes to the property.
Consider the following:
%%%%
\version "2.20.0"
\header {
title = "Title"
subtitle = \markup { Sub \title }
subsubtitle = \markup { Subsub \fromproperty #'header:title }
}
\header { title = "Title (changed)" }
\markup { Lorem ipsum dolor sit amet }
%%%%
In the above, the subtitle does not reflect the change to the title. In
general, you should prefer to use \fromproperty so that the order of
defining properties does not matter. However, if you can ensure
properties are set properly, there should be nothing wrong with using
\title directly.
-- Aaron Hill