On Thu, Nov 13, 2025 at 12:08 PM Shane Brandes <[email protected]> wrote:
> Yes, the highest string on the bottom of the tab staff line. Which is > precisely why I don't have a MMW. If I had I wouldn't be asking the > question. I have tried all manner of things that I googled to no > avail. > <snip> > Finally I found this, which if you insert in the layout block for the > tabstaff does the trick, mind you that was after more than an hour of > googling. stringOneTopmost = ##f > Shane, Thank you for your persistence on this. It seems that this is a hard property to find. Whenever you are looking for a property to affect something you are trying to typeset, you should look in the Internals Reference. Looking in the Internals Reference, under the TabStaff context, one can see no reference for stringOneTopmost. One can see the Tab_staff_symbol_engraver, which reads the property stringTunings, for the purpose of determining the number of lines. https://lilypond.org/doc/v2.24/Documentation/internals/tab_005fstaff_005fsymbol_005fengraver However, the documentation makes no mention of the Tab_staff_symbol_engraver doing anything with the pitches, which is understandable. There is no place on the StaffSymbol created by this engraver to place a pitch. So the Tab_staff_symbol_engraver doesn't need to know the value of stringOneTopmost. What does the value of stringOneTopmost affect? The line on which a TabNoteHead is placed. So let's go look in the Internals Reference for TabNoteHead layout object: https://lilypond.org/doc/v2.24/Documentation/internals/tabnotehead There's no mention there of a stringOneTopmost property, but that's not surprising, because this property is not a property of the note head, but of the tab staff. But we can see that TabNoteHead is created by Tab_note_heads_engraver, so let's go look at that. https://lilypond.org/doc/v2.24/Documentation/internals/tab_005fnote_005fheads_005fengraver There we can see that the Tab_note_heads_engraver reads the stringOneTopMost property. Aha -- we have found it! But how to use it? An engraver is not a layout object (grob), so it can't have grob properties. Engravers do not have properties; they read the properties from their enclosing context. So in order for the Tab_note_heads_engraver to decide whether string 1 is on the top or the bottom, it reads the stringOneTopmost property from the TabStaff context (the context containing the Tab_note_heads_engraver). Thus, to put string one on the bottom, you can either do \set TabStaff.stringOneTopmost = ##f in your music, you can set it in your layout block, as you finally found, or you can do \new TabStaff \with { stringOneTopmost = ##f } { % music goes here } I've run through all this to try to show you how you could have worked with the documentation, rather than just trying to google things. As you found out, Googling is not really helpful for hard-to-find properties. But the Internals Reference is auto-generated from the actual LilyPond codebase, so if it's in the codebase, it's almost always in the Internals Reference. Finally, (although I couldn't get any help from it in this case), it's always good to try searching the lilypond-user archives: https://lists.gnu.org/archive/html/lilypond-user/ for detailed help in things like this. HTH, Carl
