\version "2.18.2"

\include "overlay-markup.ily"

%% Ich mag den standard TeX Roman/Serifen Font als Standard Text Font
%% Die Default Werte sind auskommentiert
\paper {
  #(define fonts
     (set-global-fonts
;;      #:music "emmentaler"
;;      #:brace "emmentaler"
;;      #:roman "Century Schoolbook L"
      #:roman "Latin Modern Roman"
;;      #:sans "sans-serif"
;;      #:typewriter "monospace"
      #:factor (/ staff-height pt 20)
  ))
}

%#(define-markup-command (single-hbracket layout props arg arg-for-bracket)
%  (markup? markup? #"\\fontsize #-3 \\italic \" 3 \"")
#(define-markup-command (single-hbracket layout props arg)
  (markup?)
  #:properties ((padding 0)
                (direction UP)
                (right-left-lengthen '(-0.3 . 0.3))
                (potrusion 0.3)
                (arg-for-bracket (markup #:fontsize -3.5 #:italic " 3 ")))
  #:category graphic
  (let* ((th 0.1) ;; todo: take from GROB.
         (m (interpret-markup layout props arg))
         (stil-add (interpret-markup layout props arg-for-bracket)))

   (define
     (add-bracket-to-stencil
       stil add-to-bracket-stil
       axis thick
       protrusion direction
       right-left-lengthen padding)
    "Add a bracket to @var{stil}, producing a new stencil."
    (let* ((ext
             (coord-translate
               (ly:stencil-extent stil axis)
               right-left-lengthen))
           (other-axis (lambda (a) (remainder (+ a 1) 2)))
           (bracket (ly:bracket axis ext thick (* -1 direction  protrusion)))
           (bracket-length
             (interval-length (ly:stencil-extent bracket X)))
           (bracket
             (ly:stencil-add
               bracket
               (stencil-whiteout
                 (ly:stencil-translate-axis
                   (centered-stencil add-to-bracket-stil)
                   (+ (/ bracket-length 2) (car right-left-lengthen))
                   X)))))
      (ly:stencil-combine-at-edge
        stil
        (other-axis axis)
        direction
        bracket
        padding)))

    (add-bracket-to-stencil
      m stil-add
      X th
      (+ potrusion (* 2.5 th)) direction
      right-left-lengthen (+ padding th))))

%%%%%%%%%%%%%%%%%%%%%%%%%
%% EXAMPLES
%%%%%%%%%%%%%%%%%%%%%%%%%


%\markup {
%  \single-hbracket \line { one two three }
%
%  \override #`(arg-for-bracket . ,(markup #:fontsize -3 #:italic " foo "))
%  \single-hbracket threethreethree
%}

#(use-modules (ice-9 regex))

#(define-markup-command (underdot layout props arg)
  (markup?)
"Place a dot below @var{arg} using @code{\\center.column}"
    (interpret-markup layout props
      (markup #:override '(baseline-skip . 0.5) #:center-column (arg "."))))

#(define-markup-command (emphasize layout props strg)(string?)
#:properties ((func make-underdot-markup)
              (indicator "*"))
"Applies @code{func} to substrings of @var{strg}.  Those substrings have to be
marked with @code{indicator}, which defaults to @code{"*"}

@lilypond[verbatim,quote]
\\markup \\column {
  \\emphasize #"a*ä**ö*de*f**ü*"
  \\override #'(indicator . "_") \\emphasize #"a_ä__ö_de_f__ü_"
  \\override #`(func . ,make-underline-markup) \\emphasize #"a*ä**ö*de*f**ü*"
}
@end lilypond
"
  (let* ((indicator-char
           (let ((ls (string->list indicator)))
             (if (not (= (length ls) 1))
                 (ly:error
                   "indicator needs to be (= (string-length indicator) 1)")
                 (car ls))))
         (sub-strings
           (map (lambda(x) (match:substring x 1))
             (list-matches
               (string-concatenate
                 (list (regexp-quote (string indicator-char)) "([^" (regexp-quote (string indicator-char)) "]*)" (regexp-quote (string indicator-char))))
               strg)))
         (strg-ls (string-split strg indicator-char))
         (mrkp
           (make-concat-markup
             (map
               (lambda (x)
                 (if (member x sub-strings)
                     (func x)
                     x))
               strg-ls))))
    (interpret-markup layout props mrkp)))

leftbrace = \set stanza = \markup {
  \hspace #1
  \translate #'(0 . 0.8) \left-brace #45 }

rightbrace = \set stanza = \markup {
  \hspace #1
  \translate #'(0 . 0.8) \right-brace #45 }


dot = \markup { \fontsize #-3.5 • }


vertLine =
\markup \stencil
#(make-connected-path-stencil
  '((0 2.1)  ;; path coordinates
    (0 -0.3))
  0.2  ;; line thickness
  1  ;; X-axis scaling factor
  1  ;; Y-axis scaling factor
;  0.75  ;; Y-axis scaling factor
  #f  ;; auto-connect path to origin point? (0 0)
  #f) % filled path?
vertSepalt = \markup { \hspace #0.5 \vertLine \hspace #0.5 }

vertLineDot =
\markup \stencil
#(make-connected-path-stencil
  '((0 2.1)  ;; path coordinates
    (0 0))
  0.2  ;; line thickness
  1  ;; X-axis scaling factor
  1  ;; Y-axis scaling factor
;  0.75  ;; Y-axis scaling factor
  #f  ;; auto-connect path to origin point? (0 0)
  #f) % filled path?
vertSepDotalt = \markup { \hspace #0.5 \combine \underdot \vertLineDot \hspace #1 }

% für Century Schoolbook
%vertSep = \markup { \general-align #Y #-0.7 \scale #'(1.0 . 1.615) "|" }
%vertSepDot = \markup {
%  \general-align #Y #-0.6
%  \center-column {
%    \scale #'(1.0 . 1.44) "|"
%    \translate-scaled #'(0 . 2.6)
%    "."
%  }
%}
% für Latin Modern Roman
vertSep = \markup { \general-align #Y #-0.7 \scale #'(1.0 . 1.2) "|" }
vertSepDot = \markup {
  \general-align #Y #-0.6
  \center-column {
    \scale #'(1.0 . 1.0) "|"
    \translate-scaled #'(0 . 2.6)
    "."
  }
}

% Macros für die Plazierung der Verse im anglican chant
#(define-markup-command (TwoLines layout props argOne argTwo argThree argOneb argTwob argFour argFourb)
   (markup? markup? markup? markup? markup? markup? markup?)
   (interpret-markup layout props
     #{
       \markup {
         \fontsize #tabFontsize
         \overlay {
           %% verse 1
           \translate #(cons XColOne YPos) \halign #alignColOne $argOne
           \translate #(cons XColTwo YPos) \halign #alignColTwo \italic $argTwo
           \translate #(cons XColThree YPos) \halign #alignColThree $argThree
           \translate #(cons XColFour YPos) \halign #alignColFour $argFour
           \translate #(cons XColOne (- YPos YOffset)) \halign #alignColOne $argOneb
           \translate #(cons XColTwo (- YPos YOffset)) \halign #alignColTwo \italic $argTwob
           \translate #(cons XColFourb (- YPos YOffset)) \halign #alignColFour $argFourb
           \vspace #YSpace
         }
       }
     #}))

#(define-markup-command (ThreeLines layout props argOne argTwo argThree argOneb argTwob argFour argCont argFourb)
   (markup? markup? markup? markup? markup? markup? markup? markup?)
   (interpret-markup layout props
     #{
       \markup {
         \fontsize #tabFontsize
         \overlay {
           %% verse 1
           \translate #(cons XColOne YPos) \halign #alignColOne $argOne
           \translate #(cons XColTwo YPos) \halign #alignColTwo \italic $argTwo
           \translate #(cons XColThree YPos) \halign #alignColThree $argThree
           \translate #(cons XColFour YPos) \halign #alignColFour $argFour
           \translate #(cons XColCont (- YPos YOffset)) \halign #alignColFour $argCont
           \translate #(cons XColOne (- YPos (* 2 YOffset))) \halign #alignColOne $argOneb
           \translate #(cons XColTwo (- YPos (* 2 YOffset))) \halign #alignColTwo \italic $argTwob
           \translate #(cons XColFourb (- YPos (* 2 YOffset))) \halign #alignColFour $argFourb
           \vspace #YSpace
         }
       }
     #}))

#(define-markup-command (ThreeLinesII layout props argOne argTwo argThree argOneb argTwob argFour argFourb argCont)
   (markup? markup? markup? markup? markup? markup? markup? markup?)
   (interpret-markup layout props
     #{
       \markup {
         \fontsize #tabFontsize
         \overlay {
           %% verse 1
           \translate #(cons XColOne YPos) \halign #alignColOne $argOne
           \translate #(cons XColTwo YPos) \halign #alignColTwo \italic $argTwo
           \translate #(cons XColThree YPos) \halign #alignColThree $argThree
           \translate #(cons XColFour YPos) \halign #alignColFour $argFour
           \translate #(cons XColOne (- YPos YOffset)) \halign #alignColOne $argOneb
           \translate #(cons XColTwo (- YPos YOffset)) \halign #alignColTwo \italic $argTwob
           \translate #(cons XColFourb (- YPos YOffset)) \halign #alignColFour $argFourb
           \translate #(cons XColCont (- YPos (* 2 YOffset))) \halign #alignColFour $argCont
           \vspace #YSpace
         }
       }
     #}))

#(define-markup-command (FourLines layout props argOne argTwo argThree argOneb argTwob argFour argCont argFourb argContII)
   (markup? markup? markup? markup? markup? markup? markup? markup? markup?)
   (interpret-markup layout props
     #{
       \markup {
         \fontsize #tabFontsize
         \overlay {
           %% verse 1
           \translate #(cons XColOne YPos) \halign #alignColOne $argOne
           \translate #(cons XColTwo YPos) \halign #alignColTwo \italic $argTwo
           \translate #(cons XColThree YPos) \halign #alignColThree $argThree
           \translate #(cons XColFour YPos) \halign #alignColFour $argFour
           \translate #(cons XColCont (- YPos YOffset)) \halign #alignColFour $argCont
           \translate #(cons XColOne (- YPos (* 2 YOffset))) \halign #alignColOne $argOneb
           \translate #(cons XColTwo (- YPos (* 2 YOffset))) \halign #alignColTwo \italic $argTwob
           \translate #(cons XColFourb (- YPos (* 2 YOffset))) \halign #alignColFour $argFourb
           \translate #(cons XColCont (- YPos (* 3 YOffset))) \halign #alignColFour $argContII
           \vspace #YSpace
         }
       }
     #}))

%% default Werte für die diversen Parameter der Chant-Tabellen
YPos = 0
YOffset = 3.4
%YSpace = 4.6
%YOffset = 0.7
YSpace = 1.13

alignColOne   = #CENTER
alignColTwo   = #RIGHT
alignColThree = #RIGHT
alignColFour  = #LEFT

%XColOne = 11
%XColTwo = 22
%XColThree = 27
%XColFour = 29
%XColFourb = 32.5
%XColCont = 39
XColOne = 4
XColTwo = 16
XColThree = 22
XColFour = 24
XColFourb = 27.5
XColCont = 34

tabFontsize = #0
