Phil Holmes <email <at> philholmes.net> writes:
I've done the looking into the code that I can manage. I know that
indents
are worked in output-def.cc:line_dimensions_int. This returns a
linewidth
and an indent, with a normal indent when called with second parameter 0,
otherwise it's a short-indent. So it would be easy to add something to
the
indent here to take account of intrument names.
The instrument name is created in instrument-name-engraver.cc. This
makes a
Spanner *text_spanner_; with text_spanner_ = make_spanner
("InstrumentName",
SCM_EOL);
So it appears that there is a Spanner called InstrumentName with the
details
of the instrument name. Is there any way of accessing this within
output-def.cc?
The InstrumentName spanners can change when an instrument changes, or
whenever the user feels like changing the text. The short-indent will
affect line breaking, which could affect which instrument name goes at
the front of each line. Even if output-def.cc can find all the
InstrumentName spanners, it is hard to know which ones to pull information
from.
Maybe each Instrument_name_engraver, one for each staff, could push
information to a central location. I think there is some way for an
engraver to refer to its Output_def, and call its set_variable().
Whenever an engraver sees a new (short)instrumentName (or maybe just
once upon initialization based on instrumentNames set in \with{} blocks)
the engraver could estimate the length of the text, in paper units,
compare
to a layout variable 'instrument_name_length' or 'short_name_length' as
appropriate, and overwrite that variable if the text they will be setting
is longer than the length posted so far.
The layout variable 'indent' might then be initialized to a Scheme
expression that returns the longer of 'instrument_name_length' and
'default_indent'. That way a user can take control by explicitly setting
\layout{ indent = 8\mm }.
Other concerns are, any difference between 'indent' in \layout and \paper
blocks, and making 'default_indent' scale properly with paper size.