Am Mi., 30. Juli 2025 um 17:11 Uhr schrieb Rip _Mus
<[email protected]>:
>
> Hello,
> about markup, is there a solution similar \fill-line but for the Y axis? I'm
> trying to perfectly center a markup on a page.
>
> Thank you,
> RipMus
\fill-line does not know what is to left (or right) of it.
See:
\markup \column {
\line { \box \fill-line { foo bar buzz } }
\line { fooooooooooo \box \fill-line { foo bar buzz } }
}
If you're fine with similar behaviour for Y-axis, then:
#(define
(justify-column-helper
layout props args text-direction word-space column-height constant-space?)
(let* ((orig-stencils (interpret-markup-list layout props args))
(stencils
(map (lambda (stc)
(if (ly:stencil-empty? stc Y)
(ly:make-stencil (ly:stencil-expr stc)
(ly:stencil-extent stc X) '(0 . 0))
stc))
orig-stencils))
(text-widths
(map (lambda (stc)
(interval-length (ly:stencil-extent stc Y)))
stencils))
(text-width (apply + text-widths))
(word-count (length stencils))
(top-margin (ly:output-def-lookup layout 'top-margin 0))
(bottom-margin (ly:output-def-lookup layout 'bottom-margin 0))
(paper-height (ly:output-def-lookup layout 'paper-height))
(last-bottom-padding
(assoc-get 'padding
(ly:output-def-lookup layout 'last-bottom-spacing) 0))
(top-markup-padding
(assoc-get 'padding
(ly:output-def-lookup layout 'top-markup-spacing) 0))
(column-height
(or column-height
(- paper-height
top-margin
bottom-margin
top-markup-padding
last-bottom-padding)))
(fill-space
(cond
((= word-count 1)
(list
(/ (- column-height text-width) 2)
(/ (- column-height text-width) 2)))
((= word-count 2)
(list
(- column-height text-width)))
(else
((@@ (lily) get-fill-space)
word-count column-height word-space text-widths
constant-space?))))
(column-contents (if (= word-count 1)
(list
point-stencil
(car stencils)
point-stencil)
stencils)))
(if (null? (remove ly:stencil-empty? orig-stencils))
empty-stencil
(begin
(if (= text-direction DOWN)
(set! column-contents (reverse column-contents)))
(set! column-contents
(stack-stencils-padding-list
Y DOWN fill-space column-contents))
(if (> word-count 1)
(set! column-contents
(ly:stencil-translate-axis
column-contents
(- (car (ly:stencil-extent (car stencils) Y)))
Y)))
column-contents))))
#(define-markup-command (fill-column layout props args)(markup-list?)
#:properties ((text-direction DOWN)
(word-space 0)
(column-height #f))
(justify-column-helper
layout props args text-direction word-space column-height #t))
%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% EXAMPLE
%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\paper { tagline = ##f }
%\header { title = "TITLE" subtitle = "SUBTITLE" }
\markup
\override #'(box-padding . 0)
\box
\fill-line {
\fill-column
\vcenter
\override #'(box-padding . 8)
\box
\bold { foo bar buzz }
}
Though, be warned, it's very easy to exceed the printed area (the \box
in the example already do so and a warning is issued).
To see more of it set tagline ##t or uncomment the \header.
I see no way how a markup-command could get the remaining space on a
page to fit in that space.
Cheers,
Harm