\paper { #(define fonts (make-pango-font-tree "TeX Gyre Schola" "TeX Gyre Heros" "TeX Gyre Cursor" 1)) } #(define-markup-command (with-font-feature layout props feats m) ((lambda (x) (or (list? x) (string? x))) markup?) #:properties ((font-features '())) (if (string? feats) (interpret-markup layout `(((font-features . (,feats . ,font-features))) . ,props) m) (interpret-markup layout `(((font-features . ,(append feats font-features))) . ,props) m))) \markup \with-font-feature "smcp" "abcd" #(define-markup-command (with-font-feature layout props feats m) ((lambda (x) (or (list? x) (string-or-symbol? x))) markup?) #:properties ((font-features '())) (define (false-if-empty l) (if (null? l) #f l)) (define (assert-string s) (if (string? s) s (if (symbol? s) (symbol->string s) (format #f "~s" s)))) (if (string-or-symbol? feats) (let ((feat (assert-string feats))) (if (equal? (string-take feat 1) "-") (interpret-markup layout `(((font-features . ,(false-if-empty (delete (string-drop feat 1) font-features)))) . ,props) m) (interpret-markup layout `(((font-features . (,feat . ,font-features))) . ,props) m))) (let* ((string-feats (map assert-string feats)) (remove-features (filter-map (lambda (x) (and (equal? (string-take x 1) "-") (string-drop x 1))) string-feats)) (add-features (filter (lambda (x) (not (equal? (string-take x 1) "-"))) string-feats))) (interpret-markup layout `(((font-features . ,(false-if-empty (append add-features (lset-difference equal? font-features remove-features))))) . ,props) m)))) \markup \with-font-feature "smcp" \with-font-feature "-smcp" "abcd" \markup \with-font-feature #'(smcp lnum) \with-font-feature #'(-smcp lnum) "abcd"