Hi Simon,
I can't judge whether this is getting closer to you want, but maybe my
observations can help.
On Wed, Mar 25, 2015 at 9:17 AM, Simon Albrecht <[email protected]>
wrote:
> Hello,
>
> I’m experimenting with an implementation of automatic tagline language
> selection and currently have two problems with the void function \language
> that I adapted from music-functions-init.ly:
> – I can’t get the first, optional argument to work; it needs to be
> explicitly given or Lily will take the string as first argument – although
> it’s required to be a symbol.
>
I haven't succeeded in making this work with the optional argument in the
first position. I moved it last. However, the last argument either must
be specified with a symbol or with \default. Otherwise, the following
expression will be taken as the argument and an error will be raised: in my
rewrite that is '#(newline)'.
– The define in the second clause to cond doesn’t work: there are two
> errors due to output-language being an unbound variable.
>
You need to define output-language as a global variable. Then you can set
it within the music function. In your version, output-language only exists
within the music function's scope, and so it is inaccessible to your format
call, for example.
Note:
I don't think the cond expression within the definition of 'language' is
what you want. Once we hit a true value, we leave the cond expression
entirely. It appears that you want _both_ clauses to be evaluated, so I
used two if expressions.
<https://lists.gnu.org/mailman/listinfo/lilypond-user>Hope this helps,
David
\version "2.19.16"
#(define output-language '())
language =
#(define-void-function (parser location language channel) (string? (symbol? 'general))
(_i "Define languages for input (i.e. set note names for @var{language}),
output (i.e. display tagline and table of contents in @var{language}), or both.")
(display channel) ;; for testing
;(display (not (eq? channel 'input)))
(if
(not (eq? channel 'output))
(note-names-language parser language))
(if (not (eq? channel 'input))
(set! output-language (string->symbol language)))
)
\language "deutsch" general
%\language "deutsch" \default %% works
%\language "deutsch" %% will take '#(newline)' for channel!
#(newline)
#(format #t "Output language has been defined as ~a" output-language)
englishTaglineText = #(format #f
"Music typeset using LilyPond ~a~awww.lilypond.org"
(lilypond-version)
(ly:wide-char->utf-8 #x2014) ;; 2014 = em dash.
)
germanTaglineText = #(format #f
"Noten gesetzt mit LilyPond ~a ~a www.lilypond.org"
(lilypond-version)
(ly:wide-char->utf-8 #x2013) ;;2013 = en dash.
)
#(define taglines
`(
(deutsch . ,germanTaglineText)
(english . ,englishTaglineText)
))
#(define-markup-command (format-tagline layout props text) (markup?)
(interpret-markup layout props
#{
\markup {
\pad-to-box #'(0 . 0) #'(0 . 3)
{
\with-url #"http://lilypond.org/"
$text
}
}
#}))
tagline =
\markup \format-tagline
#(let
((tagl (assoc-get output-language taglines)))
(if tagl
tagl
(begin
(ly:warning (format #f "Tagline for ~a not defined, using English."
(symbol->string output-language)))
(assoc-get 'english taglines))))
\header {
}
{ h'1 }_______________________________________________
lilypond-user mailing list
[email protected]
https://lists.gnu.org/mailman/listinfo/lilypond-user