Many thanks for your help! On Thu, 16 Jun 2022 at 08:16, Jean Abou Samra <j...@abou-samra.fr> wrote:
> > > Le 16/06/2022 à 02:36, Valentin Petzel a écrit : > > Of course it would > > theoretically be possible to define a custom replace command that allows > for > > this. > > > Let me throw in a possible solution: > > \version "2.22.2" %% Also tested on 2.23.9 > > #(use-modules (ice-9 regex)) > > #(define cache (make-hash-table)) > > #(define (interpret-string-allowing-markup-replacements layout props str) > (let* ((props-norepl `(((replacement-alist . ())) . ,props)) > (repl (chain-assoc-get 'replacement-alist props '()))) > ;; This needs to be special-cased since we'd otherwise get an > ;; empty regex, which matches an empty substring anywhere, unlike > ;; a true empty alternative matching nothing. It also provides > ;; the base case for the recursion with \concat. > (if (null? repl) > (ly:text-interface::interpret-string layout props-norepl str) > (let* ((pat (or (hashq-ref cache repl) > (let ((p (make-regexp (string-join (map > regexp-quote (map car repl)) > "|")))) > (hashq-set! cache repl p) > p)))) > (let loop ((pos 0) > (acc '())) > (let ((match (regexp-exec pat str pos))) > (if match > (let* ((start (match:start match)) > (end (match:end match)) > (before (substring str pos start)) > (replacement (assoc-get (match:substring match) > repl))) > (loop end (cons* replacement before acc))) > (let* ((last-part (substring str pos)) > (final-acc (reverse! (cons last-part acc)))) > (interpret-markup-allowing-markup-replacements > layout > props-norepl > (make-concat-markup final-acc)))))))))) > > #(define (interpret-markup-allowing-markup-replacements layout props mkup) > (if (string? mkup) > (interpret-string-allowing-markup-replacements layout props mkup) > (apply (car mkup) > layout > props > (cdr mkup)))) > > #(set! interpret-markup interpret-markup-allowing-markup-replacements) > > > \markup \column { > "100" > \bold \italic "abc" > \replace #`(("100" . ,#{ \markup \with-color "red" "100" #})) > { \box "A 100 dpi" } > } > > > Cheers, > Jean > >