summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/latex/leadsheets
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2015-01-11 22:50:01 +0000
committerKarl Berry <karl@freefriends.org>2015-01-11 22:50:01 +0000
commit9a32a7a9d63c685e263389fb8d77f6fc7fce616a (patch)
tree83e223e01c5b8503036efe14dfc1ea471c91b75e /Master/texmf-dist/tex/latex/leadsheets
parent343b8c08bc86c86208e49112681665dd68e4e9a2 (diff)
leadsheets (11jan15)
git-svn-id: svn://tug.org/texlive/trunk@36029 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex/latex/leadsheets')
-rw-r--r--Master/texmf-dist/tex/latex/leadsheets/leadsheets.library.chordnames.code.tex193
-rw-r--r--Master/texmf-dist/tex/latex/leadsheets/leadsheets.library.chords.code.tex189
-rw-r--r--Master/texmf-dist/tex/latex/leadsheets/leadsheets.library.musejazz.code.tex259
-rw-r--r--Master/texmf-dist/tex/latex/leadsheets/leadsheets.library.musicsymbols.code.tex104
-rw-r--r--Master/texmf-dist/tex/latex/leadsheets/leadsheets.library.properties.code.tex167
-rw-r--r--Master/texmf-dist/tex/latex/leadsheets/leadsheets.library.shorthands.code.tex40
-rw-r--r--Master/texmf-dist/tex/latex/leadsheets/leadsheets.library.songs.code.tex631
-rw-r--r--Master/texmf-dist/tex/latex/leadsheets/leadsheets.library.templates.code.tex87
-rw-r--r--Master/texmf-dist/tex/latex/leadsheets/leadsheets.library.translations.code.tex45
-rw-r--r--Master/texmf-dist/tex/latex/leadsheets/leadsheets.library.transposing.code.tex211
-rw-r--r--Master/texmf-dist/tex/latex/leadsheets/leadsheets.sty171
11 files changed, 2097 insertions, 0 deletions
diff --git a/Master/texmf-dist/tex/latex/leadsheets/leadsheets.library.chordnames.code.tex b/Master/texmf-dist/tex/latex/leadsheets/leadsheets.library.chordnames.code.tex
new file mode 100644
index 00000000000..0843dcddfa0
--- /dev/null
+++ b/Master/texmf-dist/tex/latex/leadsheets/leadsheets.library.chordnames.code.tex
@@ -0,0 +1,193 @@
+\LeadsheetsExplLibrary{chordnames}
+ {2014/08/10 typesetting chord names with easy syntax}
+
+\leadsheets_load_library:n {musicsymbols}
+
+\bool_new:N \l__leadsheets_output_notation_german_bool
+\bool_new:N \l__leadsheets_input_notation_german_bool
+\bool_new:N \l__leadsheets_notation_literal_bool
+\bool_set_true:N \l__leadsheets_notation_literal_bool
+
+\tl_new:N \l__leadsheets_chord_tl
+\tl_new:N \l__leadsheets_tension_tl
+\tl_new:N \l__leadsheets_format_tl
+
+\cs_new_protected:Npn \leadsheets_tension_sym:Nn #1#2
+ { \tl_replace_all:Nnn #1 {#2} { \textsuperscript{#2} } }
+
+\cs_new_protected:Npn \leadsheets_chord_sym:Nnn #1#2#3
+ { \tl_replace_all:Nnn #1 {#2} {#3} }
+
+\tl_new:N \l__leadsheets_sharp_tl
+\tl_new:N \l__leadsheets_flat_tl
+\tl_new:N \l__leadsheets_doublesharp_tl
+\tl_new:N \l__leadsheets_doubleflat_tl
+\tl_new:N \l__leadsheets_full_dim_tl
+\tl_new:N \l__leadsheets_half_dim_tl
+\tl_new:N \l__leadsheets_aug_tl
+\tl_new:N \l__leadsheets_major_tl
+\tl_new:N \l__leadsheets_minor_tl
+\tl_new:N \l__leadsheets_sus_tl
+\tl_new:N \l__leadsheets_dim_tl
+\tl_new:N \l__leadsheets_add_tl
+\tl_new:N \l__leadsheets_major_seven_tl
+
+\tl_set:Nn \l__leadsheets_sharp_tl {\sharp}
+\tl_set:Nn \l__leadsheets_flat_tl {\flat}
+\tl_set:Nn \l__leadsheets_doublesharp_tl {\doublesharp}
+\tl_set:Nn \l__leadsheets_doubleflat_tl {\doubleflat}
+\tl_set:Nn \l__leadsheets_half_dim_tl {\o{}}
+\tl_set:Nn \l__leadsheets_full_dim_tl {o}
+\tl_set:Nn \l__leadsheets_aug_tl {+}
+\tl_set:Nn \l__leadsheets_major_tl {}
+\tl_set:Nn \l__leadsheets_minor_tl {m}
+\tl_set:Nn \l__leadsheets_sus_tl {\textsuperscript{sus}}
+\tl_set:Nn \l__leadsheets_dim_tl {\textsuperscript{dim}}
+\tl_set:Nn \l__leadsheets_add_tl {\textsuperscript{add}}
+\tl_set:Nn \l__leadsheets_major_seven_tl {\textsuperscript{maj7}}
+\tl_set:Nn \l__leadsheets_major_nine_tl {\textsuperscript{maj9}}
+
+\group_begin:
+% for convenient input of sharps:
+\char_set_catcode_other:N \#
+% because ^ is active in the song environment:
+\char_set_catcode_active:N \^
+% # is other so we need another parameter character:
+\char_set_catcode_parameter:N \!
+
+\cs_gset_protected:Npn \leadsheets_chord:
+ {
+ \group_begin:
+ \tl_use:N \l__leadsheets_format_tl
+ \char_set_catcode_other:N \#
+ \char_set_catcode_active:N \^
+ \leadsheets_chord_aux:n
+ }
+
+\cs_gset_protected:Npn \leadsheets_chord_aux:n !1
+ {
+ \tl_set:Nn \l__leadsheets_chord_tl {!1}
+ \leadsheets_chord_sym:Nnn \l__leadsheets_chord_tl {maj7}
+ {\l__leadsheets_major_seven_tl}
+ \leadsheets_chord_sym:Nnn \l__leadsheets_chord_tl {maj9}
+ {\l__leadsheets_major_nine_tl}
+ \leadsheets_chord_sym:Nnn \l__leadsheets_chord_tl {sus}
+ {\l__leadsheets_sus_tl}
+ \leadsheets_chord_sym:Nnn \l__leadsheets_chord_tl {^} {\textsuperscript}
+ \bool_if:NF \l__leadsheets_notation_literal_bool
+ {
+ % convert to English to German input:
+ \bool_if:NT \l__leadsheets_input_notation_german_bool
+ {
+ \leadsheets_chord_sym:Nnn \l__leadsheets_chord_tl {B} {@@@}
+ \leadsheets_chord_sym:Nnn \l__leadsheets_chord_tl {H} {B}
+ \leadsheets_chord_sym:Nnn \l__leadsheets_chord_tl {@@@} {Bb}
+ }
+ % convert to English to German output:
+ \bool_if:NT \l__leadsheets_output_notation_german_bool
+ {
+ \leadsheets_chord_sym:Nnn \l__leadsheets_chord_tl {Bb} {@@@}
+ \leadsheets_chord_sym:Nnn \l__leadsheets_chord_tl {B} {H}
+ \leadsheets_chord_sym:Nnn \l__leadsheets_chord_tl {@@@} {B}
+ \leadsheets_chord_sym:Nnn \l__leadsheets_chord_tl {B#} {H}
+ }
+ }
+ \leadsheets_chord_sym:Nnn \l__leadsheets_chord_tl {#b} {}
+ \leadsheets_chord_sym:Nnn \l__leadsheets_chord_tl {b#} {}
+ \leadsheets_chord_sym:Nnn \l__leadsheets_chord_tl {##}
+ {\l__leadsheets_doublesharp_tl}
+ \leadsheets_chord_sym:Nnn \l__leadsheets_chord_tl {bb}
+ {\l__leadsheets_doubleflat_tl}
+ \leadsheets_chord_sym:Nnn \l__leadsheets_chord_tl {#} {\l__leadsheets_sharp_tl}
+ \leadsheets_chord_sym:Nnn \l__leadsheets_chord_tl {b} {\l__leadsheets_flat_tl}
+ \leadsheets_chord_sym:Nnn \l__leadsheets_chord_tl {dim} {\l__leadsheets_dim_tl}
+ \leadsheets_chord_sym:Nnn \l__leadsheets_chord_tl {add} {\l__leadsheets_add_tl}
+ \leadsheets_tension_sym:Nn \l__leadsheets_chord_tl {0}
+ \leadsheets_tension_sym:Nn \l__leadsheets_chord_tl {1}
+ \leadsheets_tension_sym:Nn \l__leadsheets_chord_tl {2}
+ \leadsheets_tension_sym:Nn \l__leadsheets_chord_tl {3}
+ \leadsheets_tension_sym:Nn \l__leadsheets_chord_tl {4}
+ \leadsheets_tension_sym:Nn \l__leadsheets_chord_tl {5}
+ \leadsheets_tension_sym:Nn \l__leadsheets_chord_tl {6}
+ \leadsheets_tension_sym:Nn \l__leadsheets_chord_tl {7}
+ \leadsheets_tension_sym:Nn \l__leadsheets_chord_tl {8}
+ \leadsheets_tension_sym:Nn \l__leadsheets_chord_tl {9}
+ \leadsheets_chord_sym:Nnn \l__leadsheets_chord_tl {/o}
+ {\textsuperscript{\l__leadsheets_half_dim_tl}}
+ \leadsheets_chord_sym:Nnn \l__leadsheets_chord_tl {o}
+ {\textsuperscript{\l__leadsheets_full_dim_tl}}
+ \leadsheets_chord_sym:Nnn \l__leadsheets_chord_tl {+}
+ {\textsuperscript{\l__leadsheets_aug_tl}}
+ \leadsheets_chord_sym:Nnn \l__leadsheets_chord_tl {(}
+ { \leadsheets_tension:w( }
+ \leadsheets_chord_sym:Nnn \l__leadsheets_chord_tl {mi}
+ {\l__leadsheets_minor_tl}
+ \leadsheets_chord_sym:Nnn \l__leadsheets_chord_tl {ma}
+ {\l__leadsheets_major_tl}
+ \tl_replace_all:Nnn \l__leadsheets_chord_tl
+ {\textsuperscript\textsuperscript}
+ {\textsuperscript}
+ \tl_use:N \l__leadsheets_chord_tl
+ \group_end:
+ }
+
+\group_end:
+
+\cs_new_protected:Npn \leadsheets_tension:w (#1)
+ {
+ \group_begin:
+ \tl_set:Nn \l__leadsheets_tension_tl {#1}
+ \leadsheets_chord_sym:Nnn \l__leadsheets_tension_tl
+ {\textsuperscript}
+ {\use:n}
+ \textsuperscript { ( \tl_use:N \l__leadsheets_tension_tl ) }
+ \group_end:
+ }
+
+\keys_define:nn {leadsheets/chordnames}
+ {
+ format .tl_set:N = \l__leadsheets_format_tl ,
+ sharp .tl_set:N = \l__leadsheets_sharp_tl ,
+ flat .tl_set:N = \l__leadsheets_flat_tl ,
+ double-sharp .tl_set:N = \l__leadsheets_doublesharp_tl ,
+ double-flat .tl_set:N = \l__leadsheets_doubleflat_tl ,
+ half-dim .tl_set:N = \l__leadsheets_half_dim_tl ,
+ full-dim .tl_set:N = \l__leadsheets_full_dim_tl ,
+ aug .tl_set:N = \l__leadsheets_aug_tl ,
+ major .tl_set:N = \l__leadsheets_major_tl ,
+ minor .tl_set:N = \l__leadsheets_minor_tl ,
+ sus .tl_set:N = \l__leadsheets_sus_tl ,
+ add .tl_set:N = \l__leadsheets_add_tl ,
+ dim .tl_set:N = \l__leadsheets_dim_tl ,
+ major-seven .tl_set:N = \l__leadsheets_major_seven_tl ,
+ major-nine .tl_set:N = \l__leadsheets_major_nine_tl ,
+ output-notation .choice: ,
+ output-notation/literal .code:n =
+ \bool_set_false:N \l__leadsheets_input_notation_german_bool
+ \bool_set_false:N \l__leadsheets_output_notation_german_bool
+ \bool_set_true:N \l__leadsheets_notation_literal_bool ,
+ output-notation/german .code:n =
+ \bool_set_true:N \l__leadsheets_output_notation_german_bool
+ \bool_set_false:N \l__leadsheets_notation_literal_bool ,
+ output-notation/english .code:n =
+ \bool_set_false:N \l__leadsheets_output_notation_german_bool
+ \bool_set_false:N \l__leadsheets_notation_literal_bool ,
+ input-notation .choice: ,
+ input-notation/literal .code:n =
+ \bool_set_false:N \l__leadsheets_input_notation_german_bool
+ \bool_set_false:N \l__leadsheets_output_notation_german_bool
+ \bool_set_true:N \l__leadsheets_notation_literal_bool ,
+ input-notation/german .code:n =
+ \bool_set_true:N \l__leadsheets_input_notation_german_bool
+ \bool_set_false:N \l__leadsheets_notation_literal_bool ,
+ input-notation/english .code:n =
+ \bool_set_false:N \l__leadsheets_input_notation_german_bool
+ \bool_set_false:N \l__leadsheets_notation_literal_bool
+ }
+
+\NewDocumentCommand \setchordnames {m}
+ { \keys_set:nn {leadsheets/chordnames} {#1} }
+
+\NewDocumentCommand \chordname {} { \leadsheets_chord: }
+
+\endinput
diff --git a/Master/texmf-dist/tex/latex/leadsheets/leadsheets.library.chords.code.tex b/Master/texmf-dist/tex/latex/leadsheets/leadsheets.library.chords.code.tex
new file mode 100644
index 00000000000..0dce4372717
--- /dev/null
+++ b/Master/texmf-dist/tex/latex/leadsheets/leadsheets.library.chords.code.tex
@@ -0,0 +1,189 @@
+\LeadsheetsExplLibrary{chords}{2014/08/10 printing chords}
+
+\msg_new:nnn {leadsheets} {no-chords}
+ { No~ more~ chords~ left~ for~ verse~ type~ `#1'~ \msg_line_context: }
+
+\tl_new:N \l__leadsheets_current_chord_tl
+\tl_new:N \l__leadsheets_chord_stack_alignment_tl
+\tl_set:Nn \l__leadsheets_chord_stack_alignment_tl {c}
+
+\bool_new:N \l__leadsheets_smash_chords_bool
+\bool_new:N \g__leadsheets_smash_next_chord_bool
+\bool_new:N \l__leadsheets_chord_gobble_after_bool
+\bool_new:N \l__leadsheets_record_chords_bool
+\bool_new:N \l__leadsheets_chord_print_bool
+\bool_set_true:N \l__leadsheets_chord_print_bool
+
+\prop_new:N \g__leadsheets_chords_sequences_prop
+
+\seq_new:N \l__leadsheets_chords_sequences_seq
+
+\dim_new:N \l__leadsheets_empty_chord_dim
+\dim_set:Nn \l__leadsheets_empty_chord_dim {1em}
+
+\cs_new:Npn \leadsheets_chord_print:n #1 {#1}
+\cs_generate_variant:Nn \leadsheets_chord_print:n {V}
+
+\cs_new_protected:Npn \leadsheets_chord:nnn #1#2#3
+ {
+ \leadsheets_if_record_chords:T
+ { \seq_put_right:Nn \l__leadsheets_chords_sequences_seq { {#3} } }
+ \leadsheets_set_chord:nnn
+ {#1}
+ {#2}
+ { \leadsheets_chord_write:n {#3} }
+ }
+
+\cs_new_protected:Npn \leadsheets_set_chord:nnn #1#2#3
+ {
+ \bool_if:NTF #1
+ { \bool_set_true:N \l__leadsheets_chord_gobble_after_bool }
+ { \bool_set_false:N \l__leadsheets_chord_gobble_after_bool }
+ \bool_if:NT #2
+ { \bool_set_true:N \g__leadsheets_smash_next_chord_bool }
+ \__leadsheets_set_chord:nwn {#3}
+ }
+
+\cs_new_protected:Npn \__leadsheets_set_chord:nwn #1#2~#3
+ {
+ \leadsheets_place_above:Vnn
+ \l__leadsheets_chord_stack_alignment_tl
+ {#1}
+ {
+ \tl_if_blank:nTF {#2}
+ {\skip_horizontal:N \l__leadsheets_empty_chord_dim}
+ {#2}
+ }
+ \tl_if_blank:nF {#3}
+ { \bool_if:NF \l__leadsheets_chord_gobble_after_bool {\c_space_tl} }
+ #3
+ }
+
+\cs_new_protected:Npn \leadsheets_chord_write:n #1
+ {
+% \bool_if:NT \l__leadsheets_chord_print_bool
+% {
+ \tl_set:Nn \l__leadsheets_current_chord_tl {#1}
+ \bool_if:nT
+ {
+ \leadsheets_if_property_p:Vn \l_leadsheets_current_song_id_tl {key}
+ &&
+ ( \l__leadsheets_transpose_bool || \l__leadsheets_transpose_capo_bool )
+ }
+ {
+ \leadsheets_transpose:xVN
+ { \leadsheets_get_property:Vn \l_leadsheets_current_song_id_tl {key} }
+ \l__leadsheets_transpose_steps_int
+ \l__leadsheets_current_chord_tl
+ }
+ \bool_if:nTF
+ {
+ ! \leadsheets_if_property_p:Vn \l_leadsheets_current_song_id_tl {key}
+ &&
+ ( \l__leadsheets_transpose_bool || \l__leadsheets_transpose_capo_bool )
+ }
+ {
+ \msg_warning:nnV {leadsheets}
+ {transpose-key}
+ \l_leadsheets_current_song_id_tl
+ }
+ \leadsheets_chord_print:V \l__leadsheets_current_chord_tl
+% }
+ }
+\cs_generate_variant:Nn \leadsheets_chord_write:n { V }
+
+\cs_new_protected:Npn \leadsheets_place_above:nnn #1#2#3
+ {
+ \bool_if:NTF \l__leadsheets_chord_print_bool
+ {
+ \group_begin:
+ \leadsheets_ignore_lines:
+ \bool_if:NT \g__leadsheets_smash_next_chord_bool
+ {
+ \bool_set_true:N \l__leadsheets_smash_chords_bool
+ \bool_gset_false:N \g__leadsheets_smash_next_chord_bool
+ }
+ \linespread{1} \selectfont
+ \begin{tabular} [b] {@{}#1@{}}
+ \bool_if:NTF \l__leadsheets_smash_chords_bool
+ {\makebox[0pt][c]{#2}}
+ {#2} \\
+ #3
+ \end{tabular}
+ \group_end:
+ }
+ {#3}
+ }
+\cs_generate_variant:Nn \leadsheets_place_above:nnn { V }
+
+\keys_define:nn {leadsheets}
+ {
+ smash-chords .bool_set:N = \l__leadsheets_smash_chords_bool ,
+ smash-next-chord .bool_set:N = \g__leadsheets_smash_next_chord_bool ,
+ empty-chord-dim .dim_set:N = \l__leadsheets_empty_chord_dim ,
+ remember-chords .bool_set:N = \l__leadsheets_record_chords_bool ,
+ align-chords .tl_set:N = \l__leadsheets_chord_stack_alignment_tl ,
+ chord-cs .code:n =
+ \cs_set_protected:Npn \leadsheets_chord_print:n {#1} ,
+ chord-cs .initial:n = \chordname ,
+ print-chords .bool_set:N = \l__leadsheets_chord_print_bool
+ }
+
+\NewDocumentCommand \chord {st-m} { \leadsheets_chord:nnn {#1} {#2} {#3} }
+
+\NewDocumentCommand \writechord {m}
+ { \leadsheets_chord_write:n {#1} }
+
+% --------------------------------------------------------------------------
+% record changes for a verse and automatically print them in the next:
+\prg_new_conditional:Npnn \leadsheets_if_record_chords: {T,F,TF}
+ {
+ \bool_if:nTF
+ {
+ \l__leadsheets_record_chords_bool &&
+ ! \prop_if_in_p:NV
+ \g__leadsheets_chords_sequences_prop
+ \l_leadsheets_verse_type_tl &&
+ !\l__leadsheets_measuring_bool
+ }
+ { \prg_return_true: }
+ { \prg_return_false: }
+ }
+
+\prg_new_conditional:Npnn \leadsheets_if_recall_chords: {T,F,TF}
+ {
+ \bool_if:nTF
+ {
+ \l__leadsheets_record_chords_bool &&
+ \prop_if_in_p:NV
+ \g__leadsheets_chords_sequences_prop
+ \l_leadsheets_verse_type_tl
+ &&
+ !\l__leadsheets_measuring_bool
+ }
+ { \prg_return_true: }
+ { \prg_return_false: }
+ }
+
+\cs_new:Npn \leadsheets_remember_or_recall_chords:w
+ {
+ \leadsheets_if_recall_chords:TF
+ { \__leadsheets_recall_chord:w }
+ { \chord }
+ }
+
+\cs_new_protected:Npn \leadsheets_recall_chord:nn #1#2
+ {
+ \seq_pop_left:NNF \l__leadsheets_chords_sequences_seq
+ \l__leadsheets_tmpa_tl
+ { \msg_error:nnV {leadsheets} {no-chords} \l_leadsheets_verse_type_tl }
+ \leadsheets_set_chord:nnn
+ {#1}
+ {#2}
+ { \leadsheets_chord_write:V \l__leadsheets_tmpa_tl }
+ }
+
+\NewDocumentCommand \__leadsheets_recall_chord:w {st-}
+ { \leadsheets_recall_chord:nn {#1} {#2} }
+
+\endinput
diff --git a/Master/texmf-dist/tex/latex/leadsheets/leadsheets.library.musejazz.code.tex b/Master/texmf-dist/tex/latex/leadsheets/leadsheets.library.musejazz.code.tex
new file mode 100644
index 00000000000..f329453c8d6
--- /dev/null
+++ b/Master/texmf-dist/tex/latex/leadsheets/leadsheets.library.musejazz.code.tex
@@ -0,0 +1,259 @@
+\LeadsheetsExplLibrary{musejazz}
+ {2014/08/10 using MuseScore's MuseJazz font for chordnames}
+
+\leadsheets_load_library:n {chordnames}
+
+\msg_new:nnnn { leadsheets } { wrong-engine }
+ {
+ the~ `musejazz'~ library~ needs~ either~ to~ be~ run~ with~ XeLaTeX~ or~
+ with~ LuaLaTeX.
+ }
+ {
+ the~ `musejazz'~ library~ needs~ either~ to~ be~ run~ with~ XeLaTeX~ or~
+ with~ LuaLaTeX.~ Since~ you're~ using~ something~ different~ I~ will~
+ abort!
+ }
+
+\bool_if:nF { \xetex_if_engine_p: || \luatex_if_engine_p: }
+ { \msg_error:nn {leadsheets} {wrong-engine} \tex_endinput:D }
+
+\RequirePackage {fontspec}
+
+\newfontfamily \musejazz {MuseJazz}
+
+\cs_new_protected:Npn \leadsheets_char:Nn #1#2
+ { \cs_set:Npx #1 { \tex_char:D "#2 \scan_stop: } }
+
+
+% give names to the chararacters of the MuseJazz fonts by using their unicode
+% point:
+
+% \leadsheets_char:Nn \leadsheets_quarter: {2669} % viertel
+% \leadsheets_char:Nn \leadsheets_eigth: {266A} % achtel
+\leadsheets_char:Nn \leadsheets_flat: {266D} % b
+\leadsheets_char:Nn \leadsheets_natural: {266E} % auflösung
+\leadsheets_char:Nn \leadsheets_sharp: {266F} % #
+
+% \leadsheets_char:Nn \leadsheets_sharp: {E10C} % #
+% \leadsheets_char:Nn \leadsheets_flat: {E10D} % b
+% \leadsheets_char:Nn \leadsheets_natural: {E10E} % auflösung
+\leadsheets_char:Nn \leadsheets_segno: {E167} % segno
+\leadsheets_char:Nn \leadsheets_coda: {E168} % coda
+
+% \leadsheets_char:Nn \leadsheets_segno: {E177} % segno
+% \leadsheets_char:Nn \leadsheets_coda: {E178} % coda
+
+\leadsheets_char:Nn \leadsheets_major: {E180} % ma
+\leadsheets_char:Nn \leadsheets_minor: {E181} % mi
+\leadsheets_char:Nn \leadsheets_tension_eleven: {E182} % ^11
+\leadsheets_char:Nn \leadsheets_tension_thirteen: {E183} % ^13
+\leadsheets_char:Nn \leadsheets_tension_dim: {E184} % ^dim
+\leadsheets_char:Nn \leadsheets_sus: {E185} % sus
+\leadsheets_char:Nn \leadsheets_tension_aug_symbol: {E186} % ^+
+\leadsheets_char:Nn \leadsheets_tension_dim_symbol: {E187} % ^o
+\leadsheets_char:Nn \leadsheets_tension_flat: {E188} % ^b
+\leadsheets_char:Nn \leadsheets_tension_sharp: {E189} % ^#
+\leadsheets_char:Nn \leadsheets_major_seven: {E18A} % Delta
+\leadsheets_char:Nn \leadsheets_tension_add: {E18B} % ^add
+\leadsheets_char:Nn \leadsheets_tension_add_eleven: {E18C} % ^(add 11)
+\leadsheets_char:Nn \leadsheets_sus_four: {E18D} % sus4
+\leadsheets_char:Nn \leadsheets_dim_symbol: {E18E} % o
+\leadsheets_char:Nn \leadsheets_half_dim_symbol: {E18F} % ø
+
+\leadsheets_char:Nn \leadsheets_tension_zero: {E190} % ^0
+\leadsheets_char:Nn \leadsheets_tension_one: {E191} % ^1
+\leadsheets_char:Nn \leadsheets_tension_two: {E192} % ^2
+\leadsheets_char:Nn \leadsheets_tension_three: {E193} % ^3
+\leadsheets_char:Nn \leadsheets_tension_four: {E194} % ^4
+\leadsheets_char:Nn \leadsheets_tension_five: {E195} % ^5
+\leadsheets_char:Nn \leadsheets_tension_six: {E196} % ^6
+\leadsheets_char:Nn \leadsheets_tension_seven: {E197} % ^7
+\leadsheets_char:Nn \leadsheets_tension_eight: {E198} % ^8
+\leadsheets_char:Nn \leadsheets_tension_nine: {E199} % ^9
+
+\leadsheets_char:Nn \leadsheets_do: {E201} % Do
+\leadsheets_char:Nn \leadsheets_re: {E202} % Re
+\leadsheets_char:Nn \leadsheets_mi: {E203} % Mi
+\leadsheets_char:Nn \leadsheets_fa: {E204} % Fa
+\leadsheets_char:Nn \leadsheets_sol: {E205} % Sol
+\leadsheets_char:Nn \leadsheets_la: {E206} % La
+\leadsheets_char:Nn \leadsheets_si: {E207} % Si
+\leadsheets_char:Nn \leadsheets_ut: {E208} % Ut
+\leadsheets_char:Nn \leadsheets_so: {E209} % So
+\leadsheets_char:Nn \leadsheets_ti: {E20A} % Ti
+
+% \leadsheets_char:Nn \leadsheets_segno: {1D10B} % segno
+% \leadsheets_char:Nn \leadsheets_coda: {1D10C} % coda
+\leadsheets_char:Nn \leadsheets_whole: {1D15D} % ganze
+\leadsheets_char:Nn \leadsheets_half: {1D15E} % halbe
+\leadsheets_char:Nn \leadsheets_quarter: {1D15F} % viertel
+\leadsheets_char:Nn \leadsheets_eighth: {1D160} % achtel
+\leadsheets_char:Nn \leadsheets_sixteenth: {1D161} % sechzenhtel
+\leadsheets_char:Nn \leadsheets_dot: {1D16D} % punkt
+
+\RenewDocumentCommand \flat {} { \leadsheets_flat: }
+\RenewDocumentCommand \sharp {} { \leadsheets_sharp: }
+\RenewDocumentCommand \natural {} { \leadsheets_natural: }
+\NewDocumentCommand \segno {} { \leadsheets_segno: }
+\NewDocumentCommand \coda {} { \leadsheets_coda: }
+\RenewDocumentCommand \dim {} { \leadsheets_dim_symbol: }
+\NewDocumentCommand \halfdim {} { \leadsheets_half_dim_symbol: }
+\NewDocumentCommand \wholenote {} { \leadsheets_whole: }
+\NewDocumentCommand \halfnote {} { \leadsheets_half: }
+\NewDocumentCommand \quarternote {} { \leadsheets_quarter: }
+\NewDocumentCommand \eigthnote {} { \leadsheets_eighth: }
+\NewDocumentCommand \sixteenthnote {} { \leadsheets_sixteenth: }
+\NewDocumentCommand \musicdot {} { \leadsheets_dot: }
+
+\tl_set:Nn \l__leadsheets_sharp_tl {\leadsheets_sharp:}
+\tl_set:Nn \l__leadsheets_flat_tl {\leadsheets_flat:}
+\tl_set:Nn \l__leadsheets_doublesharp_tl {\doublesharp}
+\tl_set:Nn \l__leadsheets_doubleflat_tl {\doubleflat}
+\tl_set:Nn \l__leadsheets_half_dim_tl {\leadsheets_half_dim_symbol:}
+\tl_set:Nn \l__leadsheets_full_dim_tl {\leadsheets_dim_symbol:}
+\tl_set:Nn \l__leadsheets_aug_tl {\leadsheets_tension_aug_symbol:}
+\tl_set:Nn \l__leadsheets_major_tl {\leadsheets_major:}
+\tl_set:Nn \l__leadsheets_minor_tl {\leadsheets_minor:}
+\tl_set:Nn \l__leadsheets_sus_tl {\leadsheets_sus:}
+\tl_set:Nn \l__leadsheets_dim_tl {\leadsheets_tension_dim:}
+\tl_set:Nn \l__leadsheets_add_tl {\leadsheets_tension_add:}
+\tl_set:Nn \l__leadsheets_major_seven_tl {\leadsheets_major_seven:}
+\tl_set:Nn \l__leadsheets_major_nine_tl {\leadsheets_major_seven:\leadsheets_tension_nine:}
+
+\group_begin:
+% for convenient input of sharps:
+\char_set_catcode_other:N \#
+% because ^ is active in the song environment:
+\char_set_catcode_active:N \^
+% # is other so we need another parameter character:
+\char_set_catcode_parameter:N \!
+
+\cs_gset_protected:Npn \leadsheets_chord:
+ {
+ \group_begin:
+ \tl_use:N \l__leadsheets_format_tl
+ \musejazz
+ \char_set_catcode_other:N \#
+ \char_set_catcode_active:N \^
+ \leadsheets_chord_aux:n
+ }
+
+\cs_gset_protected:Npn \leadsheets_chord_aux:n !1
+ {
+ \tl_set:Nn \l__leadsheets_chord_tl {!1}
+ \leadsheets_chord_sym:Nnn \l__leadsheets_chord_tl {maj7}
+ {\l__leadsheets_major_seven_tl}
+ \leadsheets_chord_sym:Nnn \l__leadsheets_chord_tl {maj9}
+ {\l__leadsheets_major_nine_tl}
+ \leadsheets_chord_sym:Nnn \l__leadsheets_chord_tl {sus4}
+ {\leadsheets_sus_four:}
+ \leadsheets_chord_sym:Nnn \l__leadsheets_chord_tl {sus}
+ {\l__leadsheets_sus_tl}
+ \leadsheets_chord_sym:Nnn \l__leadsheets_chord_tl {^} {\textsuperscript}
+ \bool_if:NF \l__leadsheets_notation_literal_bool
+ {
+ % convert to English to German input:
+ \bool_if:NT \l__leadsheets_input_notation_german_bool
+ {
+ \leadsheets_chord_sym:Nnn \l__leadsheets_chord_tl {B} {@@@}
+ \leadsheets_chord_sym:Nnn \l__leadsheets_chord_tl {H} {B}
+ \leadsheets_chord_sym:Nnn \l__leadsheets_chord_tl {@@@} {Bb}
+ }
+ % convert to English to German output:
+ \bool_if:NT \l__leadsheets_output_notation_german_bool
+ {
+ \leadsheets_chord_sym:Nnn \l__leadsheets_chord_tl {Bb} {@@@}
+ \leadsheets_chord_sym:Nnn \l__leadsheets_chord_tl {B} {H}
+ \leadsheets_chord_sym:Nnn \l__leadsheets_chord_tl {@@@} {B}
+ \leadsheets_chord_sym:Nnn \l__leadsheets_chord_tl {B#} {H}
+ }
+ }
+ \leadsheets_chord_sym:Nnn \l__leadsheets_chord_tl {#b} {}
+ \leadsheets_chord_sym:Nnn \l__leadsheets_chord_tl {b#} {}
+ \leadsheets_chord_sym:Nnn \l__leadsheets_chord_tl {##}
+ {\l__leadsheets_doublesharp_tl}
+ \leadsheets_chord_sym:Nnn \l__leadsheets_chord_tl {bb}
+ {\l__leadsheets_doubleflat_tl}
+ \leadsheets_chord_sym:Nnn \l__leadsheets_chord_tl {#} {\l__leadsheets_sharp_tl}
+ \leadsheets_chord_sym:Nnn \l__leadsheets_chord_tl {b} {\l__leadsheets_flat_tl}
+ \leadsheets_chord_sym:Nnn \l__leadsheets_chord_tl {dim} {\l__leadsheets_dim_tl}
+ \leadsheets_chord_sym:Nnn \l__leadsheets_chord_tl {add} {\l__leadsheets_add_tl}
+ % those need to be taken care of:
+ \leadsheets_chord_sym:Nnn \l__leadsheets_chord_tl {11} {\leadsheets_tension_eleven:}
+ \leadsheets_chord_sym:Nnn \l__leadsheets_chord_tl {13} {\leadsheets_tension_thirteen:}
+ \leadsheets_chord_sym:Nnn \l__leadsheets_chord_tl {0} {\leadsheets_tension_zero:}
+ \leadsheets_chord_sym:Nnn \l__leadsheets_chord_tl {1} {\leadsheets_tension_one:}
+ \leadsheets_chord_sym:Nnn \l__leadsheets_chord_tl {2} {\leadsheets_tension_two:}
+ \leadsheets_chord_sym:Nnn \l__leadsheets_chord_tl {3} {\leadsheets_tension_three:}
+ \leadsheets_chord_sym:Nnn \l__leadsheets_chord_tl {4} {\leadsheets_tension_four:}
+ \leadsheets_chord_sym:Nnn \l__leadsheets_chord_tl {5} {\leadsheets_tension_five:}
+ \leadsheets_chord_sym:Nnn \l__leadsheets_chord_tl {6} {\leadsheets_tension_six:}
+ \leadsheets_chord_sym:Nnn \l__leadsheets_chord_tl {7} {\leadsheets_tension_seven:}
+ \leadsheets_chord_sym:Nnn \l__leadsheets_chord_tl {8} {\leadsheets_tension_eight:}
+ \leadsheets_chord_sym:Nnn \l__leadsheets_chord_tl {9} {\leadsheets_tension_nine:}
+ % as do those:
+ \leadsheets_chord_sym:Nnn \l__leadsheets_chord_tl {/o}
+ {\l__leadsheets_half_dim_tl}
+ \leadsheets_chord_sym:Nnn \l__leadsheets_chord_tl {o}
+ {\l__leadsheets_full_dim_tl}
+ \leadsheets_chord_sym:Nnn \l__leadsheets_chord_tl {+}
+ {\l__leadsheets_aug_tl}
+ \leadsheets_chord_sym:Nnn \l__leadsheets_chord_tl {(}
+ { \leadsheets_tension:w( }
+ \leadsheets_chord_sym:Nnn \l__leadsheets_chord_tl {mi}
+ {\l__leadsheets_minor_tl}
+ \leadsheets_chord_sym:Nnn \l__leadsheets_chord_tl {ma}
+ {\l__leadsheets_major_tl}
+ \tl_replace_all:Nnn \l__leadsheets_chord_tl
+ {\textsuperscript\textsuperscript}
+ {\textsuperscript}
+ \tl_replace_all:Nnn \l__leadsheets_chord_tl
+ {\textsuperscript}
+ {\leadsheets_chord_tension:n}
+ \tl_use:N \l__leadsheets_chord_tl
+ \group_end:
+ }
+
+\group_end:
+
+\cs_new:Npn \leadsheets_chord_tension:n #1
+ {
+ \group_begin:
+ \tl_set:Nn \l__leadsheets_tension_tl {#1}
+ \leadsheets_chord_sym:Nnn \l__leadsheets_tension_tl
+ {\textsuperscript}
+ {\use:n}
+ \tl_set:Nn \l__leadsheets_sharp_tl {\leadsheets_tension_sharp:}
+ \tl_set:Nn \l__leadsheets_flat_tl {\leadsheets_tension_flat:}
+ \l__leadsheets_tension_tl
+ \group_end:
+ }
+
+\cs_set_protected:Npn \leadsheets_tension:w (#1)
+ {
+ \group_begin:
+ \tl_set:Nn \l__leadsheets_tension_tl {#1}
+ \leadsheets_chord_sym:Nnn \l__leadsheets_tension_tl
+ {\textsuperscript}
+ {\use:n}
+ \tl_set:Nn \l__leadsheets_sharp_tl {\leadsheets_tension_sharp:}
+ \tl_set:Nn \l__leadsheets_flat_tl {\leadsheets_tension_flat:}
+ \textsuperscript {(}
+ \l__leadsheets_tension_tl
+ \textsuperscript {)}
+ % \textsuperscript { ( \tl_use:N \l__leadsheets_tension_tl ) }
+ \group_end:
+ }
+
+\cs_new_protected:Npn \mjc_tension:w (#1)
+ {
+ \group_begin:
+ \tl_set:Nn \l__leadsheets_sharp_tl {\leadsheets_tension_sharp:}
+ \tl_set:Nn \l__leadsheets_flat_tl {\leadsheets_tension_flat:}
+ \textsuperscript {(}
+ #1
+ \textsuperscript {)}
+ \group_end:
+ }
+
+\tex_endinput:D
diff --git a/Master/texmf-dist/tex/latex/leadsheets/leadsheets.library.musicsymbols.code.tex b/Master/texmf-dist/tex/latex/leadsheets/leadsheets.library.musicsymbols.code.tex
new file mode 100644
index 00000000000..82a515786a3
--- /dev/null
+++ b/Master/texmf-dist/tex/latex/leadsheets/leadsheets.library.musicsymbols.code.tex
@@ -0,0 +1,104 @@
+\LeadsheetsLibrary{musicsymbols}{2014/08/10 musical symbols}
+\RequirePackage{etoolbox}
+
+% define a LaTeX font that uses the `musix' font from MusiXTeX:
+\DeclareFontFamily{U}{musix}{}%
+\DeclareFontShape{U}{musix}{m}{n}{%
+ <-12> musix11
+ <12-15> musix13
+ <15-18> musix16
+ <18-23> musix20
+ <23-> musix29
+}{}%
+
+% a font switch command:
+\newrobustcmd*\musix{\usefont{U}{musix}{m}{n}\selectfont}
+% a text font command:
+\DeclareTextFontCommand{\textmusix}{\musix}
+
+% the `symbol' command: raises the symnol since most symbols are too low for
+% use in normal text:
+\newrobustcmd*\musicsymbol[2][0pt]{%
+ \raisebox{\dimexpr.5ex+(#1)\relax}{\textmusix{#2}}%
+}
+
+% define the symbol
+\renewrobustcmd*\sharp {\musicsymbol[.2ex]{4}\kern-.06em}
+\renewrobustcmd*\flat {\kern-.05em\musicsymbol{2}\kern-.06em}
+\renewrobustcmd*\natural {\musicsymbol{6}\kern-.06em}
+\newrobustcmd*\doublesharp {\musicsymbol{5}\kern-.05em}
+\newrobustcmd*\doubleflat {\kern-.05em\musicsymbol{3}\kern-.06em}
+\newrobustcmd*\trebleclef {\musicsymbol{H}}
+\newrobustcmd*\bassclef {\musicsymbol{J}}
+\newrobustcmd*\altoclef {\musicsymbol{K}}
+\newrobustcmd*\allabreve {\kern-.15em\musicsymbol{R}}
+\newrobustcmd*\meterC {\kern-.15em\musicsymbol{S}}
+\newrobustcmd*\wholerest {\musicsymbol{<}}
+\newrobustcmd*\halfrest {\musicsymbol{=}}
+\newrobustcmd*\quarterrest {\musicsymbol[-1ex]{>}\kern.25em}
+\newrobustcmd*\eighthrest {\musicsymbol[-1ex]{?}\kern.33em}
+\newrobustcmd*\sixteenthrest {\musicsymbol[-1ex]{@}\kern.33em}
+
+\newcommand*\leadsheets@size{\f@size pt}
+\newlength\leadsheets@barheight
+
+\newrobustcmd*\genericbar[1]{%
+ \setlength\leadsheets@barheight\leadsheets@size
+ \rule[-.2\leadsheets@barheight]{#1}{\leadsheets@barheight}%
+}
+
+\newcommand*\normalbarwidth{.02em}
+\newcommand*\thickbarwidth{.15em}
+\newcommand*\interbarwidth{.1em}
+
+\newrobustcmd*\leadsheets@thickbar{%
+ \genericbar{\thickbarwidth}%
+}
+
+\newrobustcmd*\leadsheets@repeatcolon{%
+ \leavevmode
+ \setlength\leadsheets@barheight\leadsheets@size
+ \raise.1\leadsheets@barheight\hbox{:}%
+}
+
+\newrobustcmd*\leadsheets@interbar{\kern\interbarwidth\relax}
+
+\newrobustcmd*\normalbar{%
+ \genericbar{\normalbarwidth}%
+}
+
+\newrobustcmd*\leftrepeat{%
+ \leadsheets@thickbar
+ \leadsheets@interbar
+ \normalbar
+ \leadsheets@repeatcolon
+}
+
+\newrobustcmd*\rightrepeat{%
+ \leadsheets@repeatcolon
+ \normalbar
+ \leadsheets@interbar
+ \leadsheets@thickbar
+}
+
+\newrobustcmd*\leftrightrepeat{%
+ \leadsheets@repeatcolon
+ \leadsheets@thickbar
+ \leadsheets@interbar
+ \leadsheets@thickbar
+ \leadsheets@repeatcolon
+}
+
+\newrobustcmd*\doublebar{%
+ \normalbar
+ \leadsheets@interbar
+ \normalbar
+}
+
+\newrobustcmd*\stopbar{%
+ \normalbar
+ \leadsheets@interbar
+ \leadsheets@thickbar
+}
+
+\endinput
diff --git a/Master/texmf-dist/tex/latex/leadsheets/leadsheets.library.properties.code.tex b/Master/texmf-dist/tex/latex/leadsheets/leadsheets.library.properties.code.tex
new file mode 100644
index 00000000000..b904d2320ba
--- /dev/null
+++ b/Master/texmf-dist/tex/latex/leadsheets/leadsheets.library.properties.code.tex
@@ -0,0 +1,167 @@
+\LeadsheetsExplLibrary{properties}{2014/08/10 song properties}
+
+\cs_generate_variant:Nn \tl_if_eq:nnTF {x}
+
+\seq_new:N \l__leadsheets_song_properties_seq
+\prop_new:N \l__leadsheets_duplicate_properties_prop
+
+\cs_new_protected:Npn \leadsheets_define_property:n #1
+ {
+ \prop_new:c {l__leadsheets_songs_#1_prop}
+ \seq_put_right:Nn \l__leadsheets_song_properties_seq {#1}
+ }
+
+\cs_new_protected:Npn \leadsheets_set_property:nnn #1#2#3
+ { \prop_gput:cnn {l__leadsheets_songs_#2_prop} {#1} {#3} }
+\cs_generate_variant:Nn \leadsheets_set_property:nnn { nnx }
+
+\cs_new:Npn \leadsheets_get_property:nn #1#2
+ { \prop_item:cn {l__leadsheets_songs_#2_prop} {#1} }
+\cs_generate_variant:Nn \leadsheets_get_property:nn { V }
+
+\prg_new_conditional:Npnn \leadsheets_if_property:nn #1#2 {p,T,F,TF}
+ {
+ \prop_if_in:cnTF {l__leadsheets_songs_#2_prop} {#1}
+ { \prg_return_true: }
+ { \prg_return_false: }
+ }
+\cs_generate_variant:Nn \leadsheets_if_property:nnTF { V }
+\cs_generate_variant:Nn \leadsheets_if_property:nnT { V }
+\cs_generate_variant:Nn \leadsheets_if_property_p:nn { V }
+
+\prg_new_conditional:Npnn \leadsheets_if_measuring: {T,F,TF}
+ {
+ \bool_if:NTF \l__leadsheets_measuring_bool
+ { \prg_return_true: }
+ { \prg_return_false: }
+ }
+
+\prg_new_protected_conditional:Npnn \leadsheets_if_properties_eq:nnn #1#2#3 {T,F,TF}
+ {
+ \tl_if_eq:xxTF
+ { \leadsheets_get_property:nn {#1} {#2} }
+ { \leadsheets_get_property:nn {#1} {#3} }
+ { \prg_return_true: }
+ { \prg_return_false: }
+ }
+\cs_generate_variant:Nn \leadsheets_if_properties_eq:nnnTF { V }
+
+\prg_new_protected_conditional:Npnn \leadsheets_if_property_eq:nnn #1#2#3 {T,F,TF}
+ {
+ \tl_if_eq:xnTF
+ { \leadsheets_get_property:nn {#1} {#2} }
+ { #3 }
+ { \prg_return_true: }
+ { \prg_return_false: }
+ }
+\cs_generate_variant:Nn \leadsheets_if_property_eq:nnnTF { V }
+
+\cs_new_protected:Npn \leadsheets_copy_property:nnn #1#2#3
+ {
+ \bool_if:nT
+ {
+ !\leadsheets_if_property_p:nn {#1} {#3}
+ &&
+ \leadsheets_if_property_p:nn {#1} {#2}
+ }
+ {
+ \leadsheets_set_property:nnx {#1} {#3}
+ { \leadsheets_get_property:nn {#1} {#2} }
+ }
+ }
+
+\cs_new_protected:Npn \leadsheets_duplicate_property:nn #1#2
+ { \prop_put:Nnn \l__leadsheets_duplicate_properties_prop {#1} {#2} }
+
+\cs_new_protected:Npn \leadsheets_set_duplicate_properties:n #1
+ {
+ \prop_map_inline:Nn \l__leadsheets_duplicate_properties_prop
+ { \leadsheets_copy_property:nnn {#1} {##1} {##2} }
+ }
+
+\cs_new_protected:Npn \leadsheets_print_property_list:nnnnnn #1#2#3#4#5#6
+ {
+ \seq_set_split:Nnx \l__leadsheets_tmpa_seq {~and~}
+ { \leadsheets_get_property:nn {#1} {#2} }
+ \seq_clear:N \l__leadsheets_tmpb_seq
+ \seq_map_inline:Nn \l__leadsheets_tmpa_seq
+ { \seq_put_right:Nn \l__leadsheets_tmpb_seq { #3 {##1} } }
+ \seq_use:Nnnn \l__leadsheets_tmpb_seq {#4} {#5} {#6}
+ }
+\cs_generate_variant:Nn \leadsheets_print_property_list:nnnnnn { V }
+
+\cs_new_protected:Npn \leadsheets_use_property_list:nnnn #1#2#3#4
+ {
+ \seq_set_split:Nnx \l__leadsheets_tmpa_seq {~and~}
+ { \leadsheets_get_property:nn {#1} {#2} }
+ \seq_clear:N \l__leadsheets_tmpb_seq
+ \seq_map_inline:Nn \l__leadsheets_tmpa_seq
+ { \seq_put_right:Nn \l__leadsheets_tmpb_seq { #3 {##1} } }
+ \seq_use:Nn \l__leadsheets_tmpb_seq {#4}
+ }
+\cs_generate_variant:Nn \leadsheets_use_property_list:nnnn { V }
+
+\cs_new:Npn \leadsheets_for_property_list:nn #1#2
+ { \__leadsheets_for_property_list_aux:nww {#2} #1 ~and~ \q_stop }
+\cs_generate_variant:Nn \leadsheets_for_property_list:nn { f }
+
+\cs_new:Npn \__leadsheets_for_property_list_aux:nww #1#2 ~and~ #3 \q_stop
+ {
+ #1 { #2 }
+ \tl_if_blank:nF {#3}
+ { \__leadsheets_for_property_list_aux:nww {#1} #3 \q_stop }
+ }
+
+\DeclareExpandableDocumentCommand \songproperty {m}
+ { \leadsheets_get_property:Vn \l_leadsheets_current_song_id_tl {#1} }
+
+% #1: command that formats every entry in list
+% #2: property
+% #3: separator between two
+% #4: separator between more than tow
+% #5: separator between last two
+\NewDocumentCommand \printsongpropertylist {O{\use:n}mmmm}
+ {
+ \leadsheets_print_property_list:Vnnnnn \l_leadsheets_current_song_id_tl
+ {#2} {#1} {#3} {#4} {#5}
+ }
+
+% #1: command that formats every entry in list
+% #2: property
+% #3: separator
+\NewDocumentCommand \usesongpropertylist {O{\use:n}mm}
+ {
+ \leadsheets_use_property_list:Vnnn \l_leadsheets_current_song_id_tl
+ {#2} {#1} {#3}
+ }
+
+% #1: command that formats every entry in list
+% #2: property
+\DeclareExpandableDocumentCommand \forsongpropertylist {mm}
+ {
+ \leadsheets_for_property_list:fn
+ { \leadsheets_get_property:Vn \l_leadsheets_current_song_id_tl {#1} }
+ {#2}
+ }
+
+\DeclareExpandableDocumentCommand \ifsongproperty {m}
+ { \leadsheets_if_property:VnTF \l_leadsheets_current_song_id_tl {#1} }
+
+\DeclareExpandableDocumentCommand \ifsongmeasuring {}
+ { \leadsheets_if_measuring:TF }
+
+\NewDocumentCommand \ifsongpropertiesequal {mm}
+ { \leadsheets_if_properties_eq:VnnTF \l_leadsheets_current_song_id_tl {#1} {#2} }
+
+\NewDocumentCommand \ifsongpropertyequal {mm}
+ { \leadsheets_if_property_eq:VnnTF \l_leadsheets_current_song_id_tl {#1} {#2} }
+
+\NewDocumentCommand \definesongproperty {m}
+ { \leadsheets_define_property:n {#1} }
+\@onlypreamble\definesongproperty
+
+\NewDocumentCommand \copysongproperty {mm}
+ { \leadsheets_duplicate_property:nn {#1} {#2} }
+\@onlypreamble\copysongproperty
+
+\endinput
diff --git a/Master/texmf-dist/tex/latex/leadsheets/leadsheets.library.shorthands.code.tex b/Master/texmf-dist/tex/latex/leadsheets/leadsheets.library.shorthands.code.tex
new file mode 100644
index 00000000000..3766ddcc0b3
--- /dev/null
+++ b/Master/texmf-dist/tex/latex/leadsheets/leadsheets.library.shorthands.code.tex
@@ -0,0 +1,40 @@
+\LeadsheetsExplLibrary{shorthands}
+ {2014/08/10 definition and activation of shorthands}
+
+\seq_new:N \l__leadsheets_shorthands_seq
+
+\group_begin:
+\char_set_catcode_active:N \~
+
+\cs_new_protected:Npn \leadsheets_define_shorthand:Npn #1
+ {
+ \seq_if_in:NnF \l__leadsheets_shorthands_seq {#1}
+ { \seq_put_right:Nn \l__leadsheets_shorthands_seq {#1} }
+ \group_begin:
+ \__leadsheets_define_shorthand_aux_i:np {#1}
+ }
+
+\cs_new_protected:Npn \__leadsheets_define_shorthand_aux_i:np #1#2#{
+ \char_set_lccode:nn {`~} {`#1}
+ \__leadsheets_define_shorthand_aux_ii:nn {#2}
+ }
+
+\cs_new_protected:Npn \__leadsheets_define_shorthand_aux_ii:nn #1#2
+ { \tl_to_lowercase:n { \group_end: \cs_set:Npn ~ } #1 {#2} }
+\group_end:
+
+\cs_new_protected:Npn \leadsheets_activate_shorthands:n #1
+ {
+ \tl_map_inline:nn {#1}
+ {
+ \seq_if_in:NnT \l__leadsheets_shorthands_seq {##1}
+ { \char_set_catcode_active:N ##1 }
+ }
+ }
+\cs_new_protected:Npn \leadsheets_activate_all_shorthands:
+ {
+ \seq_map_inline:Nn \l__leadsheets_shorthands_seq
+ { \char_set_catcode_active:N ##1 }
+ }
+
+\endinput
diff --git a/Master/texmf-dist/tex/latex/leadsheets/leadsheets.library.songs.code.tex b/Master/texmf-dist/tex/latex/leadsheets/leadsheets.library.songs.code.tex
new file mode 100644
index 00000000000..a669e3cdb8e
--- /dev/null
+++ b/Master/texmf-dist/tex/latex/leadsheets/leadsheets.library.songs.code.tex
@@ -0,0 +1,631 @@
+\LeadsheetsExplLibrary{songs}{2014/08/10 typesetting songs}
+
+% --------------------------------------------------------------------------
+% messages:
+\msg_new:nnn {leadsheets} {unknown-verse-type}
+ {
+ The~ verse~ type~ `#1'~ is~ unknown.~ Using~ `verse'~ instead~
+ \msg_line_context:
+ }
+
+\msg_new:nnn {leadsheets} {song-defined}
+ {
+ A~ song~ with~ the~ ID~ `#1'~ has~ already~ been~ defined! Check~ your~
+ source~ \msg_line_context:
+ }
+
+\msg_new:nnn {leadsheets} {transpose-key}
+ {
+ You~ need~ to~ specify~ the~ `key'~ property~ for~ song~ `#1'~
+ ( \leadsheets_get_property:nn {#1} {title} )~ in~ order~ to~ use~ the~
+ transposing~ mechanism~ \msg_line_context:
+ }
+
+% --------------------------------------------------------------------------
+% variables:
+\tl_const:Nn \c_leadsheets_sharp_tl {sharp}
+\tl_const:Nn \c_leadsheets_flat_tl {flat}
+
+\tl_new:N \l__leadsheets_songtext_format_tl
+\tl_new:N \l__leadsheets_song_format_tl
+\tl_new:N \l_leadsheets_current_song_id_tl
+\tl_new:N \l_leadsheets_verse_type_tl
+\tl_set:Nn \l_leadsheets_verse_type_tl {verse}
+\tl_new:N \l__leadsheets_verses_format_tl
+\tl_new:N \l__leadsheets_verses_label_format_tl
+\tl_new:N \l__leadsheets_verses_after_label_tl
+\tl_set:Nn \l__leadsheets_verses_after_label_tl {:}
+\tl_new:N \l__leadsheets_enharmonic_tl
+\tl_new:N \l__leadsheets_capo_number_format_tl
+\tl_new:N \l__leadsheets_recall_verse_type_tl
+\tl_new:N \l__leadsheets_song_body_tl
+
+\bool_new:N \l__leadsheets_print_selected_bool
+\bool_new:N \l__leadsheets_transpose_bool
+\bool_new:N \l__leadsheets_transpose_capo_bool
+\bool_new:N \l__leadsheets_enharmonic_bool
+\bool_new:N \l__leadsheets_obey_lines_bool
+\bool_new:N \l__leadsheets_bar_shorthands_bool
+\bool_new:N \l__leadsheets_measuring_bool
+
+\clist_new:N \l__leadsheets_print_tags_clist
+
+\seq_new:N \l__leadsheets_defined_songs_seq
+\seq_new:N \l__leadsheets_songs_print_seq
+\seq_new:N \l__leadsheets_reset_counters_seq
+
+\int_new:N \l__leadsheets_transpose_steps_int
+\int_new:N \l__leadsheets_capo_int
+\int_new:N \g__leadsheets_song_id_int
+
+\skip_new:N \l__leadsheets_obey_parskip_skip
+
+% --------------------------------------------------------------------------
+% load necessary libraries:
+\leadsheets_load_libraries:n
+ {
+ musicsymbols,
+ chordnames,
+ chords,
+ shorthands,
+ properties,
+ transposing,
+ templates,
+ translations
+ }
+
+% --------------------------------------------------------------------------
+% define shorthands
+\leadsheets_define_shorthand:Npn ^ {\leadsheets_remember_or_recall_chords:w}
+\leadsheets_define_shorthand:Npn _ {\writechord}
+\leadsheets_define_shorthand:Npn | #1
+ {
+ \str_case:nnF {#1}
+ {
+ {:} {\leftrepeat}
+ {|} {\__leadsheets_checkbartype:}
+ }
+ {\normalbar\space #1}
+ }
+\cs_new_protected:Npn \__leadsheets_checkbartype:
+ {
+ \peek_charcode_remove:NTF |
+ {\stopbar}
+ {\doublebar}
+ }
+
+\leadsheets_define_shorthand:Npn :
+ {
+ \peek_charcode_remove:NTF |
+ {\__leadsheets_checkrepeat:}
+ {\token_to_str:N :}
+ }
+\cs_new_protected:Npn \__leadsheets_checkrepeat:
+ {
+ \peek_charcode_remove:NTF :
+ {\leftrightrepeat}
+ {\rightrepeat}
+ }
+
+% --------------------------------------------------------------------------
+% the `song' environment:
+\NewDocumentEnvironment {song} { O{}m }
+ {
+ \int_gincr:N \g__leadsheets_song_id_int
+ \tl_set:Nx \l__leadsheets_tmpa_tl
+ { song-\int_to_arabic:n { \g__leadsheets_song_id_int } }
+ \leadsheets_startsong:nVn {#1} \l__leadsheets_tmpa_tl {#2}
+ }
+ {}
+
+% some hacks for the `obey-lines' option:
+\group_begin:
+\ExplSyntaxOff
+\catcode`\:=11
+\catcode`\_=11
+\cs_new:Npn \__leadsheets_active_eol: { \catcode`\^^M=\active }
+
+\__leadsheets_active_eol: %
+\tl_const:Nn \c__leadsheets_eol_tl {^^M}%
+\cs_new_protected:Npn \leadsheets_obey_lines: {%
+ \skip_set_eq:NN \l__leadsheets_obey_parskip_skip \parskip
+ \cs_set:Npn ^^M{%
+ \peek_meaning:NTF ^^M%
+ {\par \skip_vertical:N \l__leadsheets_obey_parskip_skip}%
+ {\par}%
+ }%
+}%
+\cs_new_protected:Npn \leadsheets_ignore_lines:{%
+ \cs_set:Npn ^^M{%
+ \peek_meaning:NTF^^M%
+ {\par}%
+ {\c_space_tl}%
+ }%
+}%
+\group_end:
+
+% #1: options
+% #2: ID
+% #3: properties
+\cs_new_protected:Npn \leadsheets_startsong:nnn #1#2#3
+ {
+ \leadsheets_song_define:nn {#2} {#3}
+ \leadsheets_set_duplicate_properties:n {#2}
+ \leadsheets_check_print:n {#2}
+ \prop_gclear:N \g__leadsheets_chords_sequences_prop
+ \group_begin:
+ \keys_set:nn {leadsheets} {#1}
+ \leadsheets_specials:
+ \tl_use:N \l__leadsheets_song_format_tl
+ \leadsheets_ignore_lines:
+ \leadsheets_print_song:nwn {#2}
+ }
+\cs_generate_variant:Nn \leadsheets_startsong:nnn { nV }
+
+\cs_new_protected:Npn \leadsheets_specials:
+ {
+ \leadsheets_activate_shorthands:n {^_}
+ \bool_if:NT \l__leadsheets_bar_shorthands_bool
+ { \leadsheets_activate_shorthands:n {:|} }
+ \char_set_catcode_other:N \#
+ \bool_if:NT \l__leadsheets_obey_lines_bool
+ { \__leadsheets_active_eol: }
+ }
+
+% --------------------------------------------------------------------------
+% define song properties:
+\definesongproperty {title}
+\definesongproperty {subtitle}
+\definesongproperty {short-title}
+\definesongproperty {sort-title}
+\definesongproperty {sort-short-title}
+\definesongproperty {composer}
+\definesongproperty {sort-composer}
+\definesongproperty {music}
+\definesongproperty {sort-music}
+\definesongproperty {lyrics}
+\definesongproperty {sort-lyrics}
+\definesongproperty {arr}
+\definesongproperty {sort-arr}
+\definesongproperty {band}
+\definesongproperty {sort-band}
+\definesongproperty {genre}
+\definesongproperty {interpret}
+\definesongproperty {sort-interpret}
+\definesongproperty {key}
+\definesongproperty {capo}
+\definesongproperty {tempo}
+\definesongproperty {tags}
+\definesongproperty {counter}
+\definesongproperty {ID}
+
+% properties that should take the value of another property if they're not set
+% explicitly:
+\copysongproperty {composer} {sort-composer}
+\copysongproperty {lyrics} {sort-lyrics}
+\copysongproperty {music} {sort-music}
+\copysongproperty {title} {sort-title}
+\copysongproperty {short-title} {sort-short-title}
+\copysongproperty {arr} {sort-arr}
+\copysongproperty {interpret} {sort-interpret}
+
+% --------------------------------------------------------------------------
+% defining a new song:
+\cs_new_protected:Npn \leadsheets_song_define:nn #1#2
+ {
+ \seq_if_in:NnTF \l__leadsheets_defined_songs_seq {#1}
+ { \msg_error:nnn {leadsheets} {song-defined} {#1} }
+ { \seq_put_right:Nn \l__leadsheets_defined_songs_seq {#1} }
+ \leadsheets_define_song_properties:n {#1}
+ \keys_set:nn {leadsheets/song/#1} {#2}
+ \leadsheets_set_property:nnn {#1} {ID} {#1}
+ \leadsheets_set_property:nnx {#1} {counter}
+ { \int_to_arabic:n {\g__leadsheets_song_id_int} }
+ }
+
+\cs_new_protected:Npn \leadsheets_define_song_properties:n #1
+ {
+ \seq_map_inline:Nn \l__leadsheets_song_properties_seq
+ {
+ \keys_define:nn {leadsheets/song/#1}
+ { ##1 .code:n = \leadsheets_set_property:nnn {#1} {##1} {####1} }
+ }
+ }
+
+% --------------------------------------------------------------------------
+\cs_new:Npn \leadsheets_print_song:nwn #1#2\end#3
+ {
+ \tl_clear:N \l__leadsheets_song_body_tl
+ \leadsheets_if_print_song:nT {#1}
+ {
+ \tl_set:Nn \l_leadsheets_current_song_id_tl {#1}
+ \tl_put_right:Nn \l__leadsheets_song_body_tl
+ {
+ \leadsheets_songtitle:
+ \leadsheets_check_capo:
+ \tl_use:N \l__leadsheets_songtext_format_tl
+ #2
+ }
+ }
+ \tl_if_eq:nnTF {#3} {song}
+ {
+ \leadsheets_if_print_song:nT {#1}
+ { \leadsheets_end_song:n {#1} }
+ \group_end:
+ \end{song}
+ }
+ {
+ \tl_put_right:Nn \l__leadsheets_song_body_tl { \end{#3} }
+ \__leadsheets_continue_song:nwn {#1}
+ }
+ }
+
+\cs_new:Npn \__leadsheets_continue_song:nwn #1#2\end#3
+ {
+ \leadsheets_if_print_song:nT {#1}
+ { \tl_put_right:Nn \l__leadsheets_song_body_tl {#2} }
+ \tl_if_eq:nnTF {#3} {song}
+ {
+ \leadsheets_if_print_song:nT {#1}
+ { \leadsheets_end_song:n {#1} }
+ \group_end:
+ \end{song}
+ }
+ {
+ \tl_put_right:Nn \l__leadsheets_song_body_tl { \end{#3} }
+ \__leadsheets_continue_song:nwn {#1}
+ }
+ }
+
+\cs_new:Npn \leadsheets_end_song:n #1
+ {
+ \bool_set_true:N \l__leadsheets_measuring_bool
+ \leadsheets_reset_counters:
+ \box_clear:N \l__leadsheets_tmpa_box
+ \vbox_set:NV \l__leadsheets_tmpa_box \l__leadsheets_song_body_tl
+ \leadsheets_set_property:nnx {#1} {height}
+ {
+ \dim_to_decimal:n
+ {
+ \box_ht:N \l__leadsheets_tmpa_box +
+ \box_dp:N \l__leadsheets_tmpa_box
+ }
+ pt
+ }
+ \bool_set_false:N \l__leadsheets_measuring_bool
+ \leadsheets_reset_counters:
+ \tl_use:N \l__leadsheets_song_body_tl
+ }
+
+\cs_new_protected:Npn \leadsheets_add_to_reset:n #1
+ { \seq_put_right:Nn \l__leadsheets_reset_counters_seq {#1} }
+
+\cs_new_protected:Npn \leadsheets_reset_counters:
+ {
+ \seq_map_inline:Nn \l__leadsheets_reset_counters_seq
+ { \setcounter {##1} {0} }
+ }
+
+\prg_new_conditional:Npnn \leadsheets_if_print_song:n #1 {T,F,TF}
+ {
+ \seq_if_in:NnTF \l__leadsheets_songs_print_seq {#1}
+ { \prg_return_true: }
+ { \prg_return_false: }
+ }
+
+\cs_new_protected:Npn \leadsheets_check_print:n #1
+ {
+ \leadsheets_if_print_tags:nT {#1}
+ { \seq_put_right:Nn \l__leadsheets_songs_print_seq {#1} }
+ }
+
+\prg_new_protected_conditional:Npnn \leadsheets_if_print_tags:n #1 {T,F,TF}
+ {
+ \bool_if:NTF \l__leadsheets_print_selected_bool
+ {
+ \leadsheets_if_property:nnTF {#1} {tags}
+ {
+ \bool_set_false:N \l__leadsheets_tmpa_bool
+ \tl_set:Nx \l__leadsheets_tmpa_tl
+ { \leadsheets_get_property:nn {#1} {tags} }
+ \clist_map_inline:Nn \l__leadsheets_print_tags_clist
+ {
+ \clist_if_in:NnT \l__leadsheets_tmpa_tl {##1}
+ {
+ \bool_set_true:N \l__leadsheets_tmpa_bool
+ \clist_map_break:
+ }
+ }
+ \bool_if:NTF \l__leadsheets_tmpa_bool
+ { \prg_return_true: }
+ { \prg_return_false: }
+ }
+ { \prg_return_false: }
+ }
+ { \prg_return_true: }
+ }
+
+\keys_define:nn { leadsheets }
+ {
+ print-tags .code:n =
+ \bool_set_true:N \l__leadsheets_print_selected_bool
+ \clist_set:Nn \l__leadsheets_print_tags_clist {#1}
+ }
+
+% --------------------------------------------------------------------------
+% predefined title templates
+\definesongtitletemplate {minimal}
+ { \section*{ \songproperty {title} } }
+
+\definesongtitletemplate {tabular}
+ {
+ \ifsongmeasuring
+ { \section* }
+ { \section }
+ { \songproperty {title} }
+ \begingroup\footnotesize
+ \begin{tabular}{
+ @{}
+ >{\raggedright\arraybackslash}p{.5\linewidth}
+ @{}
+ >{\raggedleft\arraybackslash}p{.5\linewidth}
+ @{}
+ }
+ \ifsongproperty{interpret}
+ {\GetTranslation{leadsheets/interpret}}
+ {}
+ \ifsongproperty{composer}
+ {
+ & \GetTranslation{leadsheets/composer}:~
+ \printsongpropertylist{composer}{~\&~}{,~}{~\&~}
+ \ifsongproperty{lyrics}
+ {\\ & \GetTranslation{leadsheets/lyrics}:~
+ \printsongpropertylist{lyrics}{~\&~}{,~}{~\&~}
+ }
+ {}
+ }
+ {}
+ \ifsongproperty{interpret}{\\}{\ifsongproperty{composer}{\\}{}}
+ \ifsongproperty{genre}
+ {& Genre:~ \songproperty{genre} \\}
+ {}
+ \ifsongproperty{tempo}
+ {& Tempo:~ \songproperty{tempo} \\}
+ {}
+ \ifsongproperty{key}
+ {
+ &
+ \setchordnames{
+ major = -\GetTranslation{leadsheets/major} ,
+ minor = -\GetTranslation{leadsheets/minor}
+ }
+ \GetTranslation{leadsheets/key}:~
+ \expandcode{\writechord{\songproperty{key}}} \\
+ }
+ {}
+ \end{tabular}
+ \par\endgroup
+ }
+
+% --------------------------------------------------------------------------
+% capo settings:
+\cs_new_protected:Npn \leadsheets_check_capo:
+ {
+ \leadsheets_if_property:VnTF \l_leadsheets_current_song_id_tl {capo}
+ {
+ \int_set:Nn \l__leadsheets_capo_int
+ { \leadsheets_get_property:Vn \l_leadsheets_current_song_id_tl {capo} }
+ }
+ { \int_zero:N \l__leadsheets_capo_int }
+ \int_set:Nn \l__leadsheets_transpose_steps_int
+ {
+ \bool_if:NTF \l__leadsheets_transpose_bool
+ { \l__leadsheets_transpose_steps_int }
+ {12}
+ - \l__leadsheets_capo_int
+ }
+ }
+
+\cs_new:Npn \leadsheets_capo_number_print:n #1 {#1.}
+
+\cs_new_protected:Npn \leadsheets_capo:
+ {
+ \leadsheets_if_property:VnT \l_leadsheets_current_song_id_tl {capo}
+ {
+ \leadsheets_translation:n {capo} :~
+ \leadsheets_capo_number_print:n
+ {
+ \use:c {int_to_ \l__leadsheets_capo_number_format_tl :n}
+ { \l__leadsheets_capo_int }
+ }
+ \nobreakspace
+ \leadsheets_translation:n {fret}
+ }
+ }
+
+\NewDocumentCommand \capo {} { \leadsheets_capo: }
+
+% --------------------------------------------------------------------------
+% verses and the like:
+\cs_new_protected:Npn \leadsheets_verse_label:n #1
+ {
+ \bool_if:cF {l__leadsheets_#1_empty_bool}
+ {
+ \tl_use:c {l__leadsheets_#1_label_format_tl}
+ \bool_if:cT {l__leadsheets_#1_named_bool}
+ {
+ \leadsheets_translation:n {#1}
+ \bool_if:cT {l__leadsheets_#1_numbered_bool} { ~ }
+ }
+ \bool_if:cT {l__leadsheets_#1_numbered_bool}
+ { \use:c {the#1} }
+ \tl_use:c {l__leadsheets_#1_after_label_tl}
+ }
+ }
+
+\cs_new_protected:Npn \leadsheets_verse_begin:n #1
+ {
+ \stepcounter {#1}
+ \tl_set:Nn \verselabel { \leadsheets_verse_label:n {#1} }
+ \tl_set:Nn \verselabelformat
+ { \tl_use:c {l__leadsheets_#1_label_format_tl} }
+ \tl_set:Nn \versenumber { \use:c {the#1} }
+ \tl_set:Nn \verseafterlabel { \tl_use:c {l__leadsheets_#1_after_label_tl} }
+ \tl_set:Nn \versename { \leadsheets_translation:n {#1} }
+ \tl_set:Nn \ifversestarred { \bool_if:cTF {l__leadsheets_#1_empty_bool} }
+ \tl_set:Nn \ifversenamed { \bool_if:cTF {l__leadsheets_#1_named_bool} }
+ \tl_set:Nn \ifversenumbered
+ { \bool_if:cTF {l__leadsheets_#1_numbered_bool} }
+ \leadsheets_obey_lines:
+ \leadsheets_use_verse_template:nn {begin} {#1}
+ }
+
+\cs_new_protected:Npn \leadsheets_verse_end:n #1
+ {
+ \leadsheets_ignore_lines:
+ \leadsheets_use_verse_template:nn {end} {#1}
+ \ignorespacesafterend
+ }
+
+\cs_new_protected:Npn \leadsheets_new_verse_type:Nnn #1#2#3
+ {
+ \bool_new:c {l__leadsheets_#2_empty_bool}
+ \bool_new:c {l__leadsheets_#2_numbered_bool}
+ \bool_new:c {l__leadsheets_#2_named_bool}
+ \bool_set_true:c {l__leadsheets_#2_named_bool}
+ \bool_if:NTF #1
+ { \bool_set_true:c {l__leadsheets_#2_empty_bool} }
+ { \bool_set_false:c {l__leadsheets_#2_empty_bool} }
+ \tl_new:c {l__leadsheets_#2_format_tl}
+ \tl_new:c {l__leadsheets_#2_template_tl}
+ \tl_new:c {l__leadsheets_#2_label_format_tl}
+ \tl_new:c {l__leadsheets_#2_after_label_tl}
+ \newcounter {#2}
+ \leadsheets_add_to_reset:n {#2}
+ \tl_set:cn {the#2} { \arabic {#2} . }
+ \keys_define:nn {leadsheets/#2}
+ {
+ numbered .bool_set:c = {l__leadsheets_#2_numbered_bool} ,
+ named .bool_set:c = {l__leadsheets_#2_named_bool} ,
+ format .code:n =
+ \tl_set:cn {l__leadsheets_#2_format_tl} {##1} ,
+ format .initial:n = \l__leadsheets_verses_format_tl ,
+ label-format .code:n =
+ \tl_set:cn {l__leadsheets_#2_label_format_tl} {##1} ,
+ label-format .initial:n = \l__leadsheets_verses_label_format_tl ,
+ after-label .code:n =
+ \tl_set:cn {l__leadsheets_#2_after_label_tl} {##1} ,
+ after-label .initial:n = \l__leadsheets_verses_after_label_tl ,
+ template .code:n =
+ \tl_set:cn {l__leadsheets_#2_template_tl} {##1} ,
+ template .initial:n = itemize ,
+ recall-chords .tl_set:N = \l__leadsheets_recall_verse_type_tl ,
+ name .code:n =
+ \@trnslt@declare@translation {leadsheets/#2} {fallback} {##1}
+ \@trnslt@declare@translation {leadsheets/#2} {English} {##1}
+ }
+ \NewDocumentEnvironment {#2} {O{}}
+ {
+ \par
+ \tl_set:Nn \l_leadsheets_verse_type_tl {#2}
+ \tl_set:Nn \l__leadsheets_recall_verse_type_tl {#2}
+ \keys_set:nn {leadsheets/#2} {##1}
+ \leadsheets_if_record_chords:T
+ { \seq_clear:N \l__leadsheets_chords_sequences_seq }
+ \leadsheets_if_recall_chords:T
+ {
+ \prop_get:NVN
+ \g__leadsheets_chords_sequences_prop
+ \l__leadsheets_recall_verse_type_tl
+ \l__leadsheets_tmpa_tl
+ \seq_clear:N \l__leadsheets_chords_sequences_seq
+ \tl_map_inline:Nn \l__leadsheets_tmpa_tl
+ { \seq_put_right:Nn \l__leadsheets_chords_sequences_seq {####1} }
+ }
+ \leadsheets_verse_begin:n {#2}
+ \tl_use:c {l__leadsheets_#2_format_tl}
+ }
+ {
+ \leadsheets_if_record_chords:T
+ {
+ \prop_gput:NVf \g__leadsheets_chords_sequences_prop
+ \l_leadsheets_verse_type_tl
+ { \seq_use:Nn \l__leadsheets_chords_sequences_seq {} }
+ }
+ \leadsheets_verse_end:n {#2}
+ \par
+ }
+ \@trnslt@declare@translation {leadsheets/#2} {fallback} {}
+ \@trnslt@declare@translation {leadsheets/#2} {English} {}
+ \keys_set:nn {leadsheets/#2} {#3}
+ }
+
+\NewDocumentCommand \newversetype {smO{}}
+ { \leadsheets_new_verse_type:Nnn #1 {#2} {#3} }
+
+\cs_undefine:N \verse
+\cs_undefine:N \endverse
+
+\newversetype {verse} [ name=Verse, named=false, after-label= ]
+\newversetype*{verse*}
+\newversetype {chorus} [ name=Chorus ]
+\newversetype*{chorus*}
+\newversetype {intro} [ name=Intro ]
+\newversetype*{intro*} [ name=Intro ]
+\newversetype {outro} [ name=Outro ]
+\newversetype {interlude} [ name=Interlude ]
+\newversetype {bridge} [ name=Bridge ]
+\newversetype*{info}
+\newversetype*{solo*}
+\newversetype {solo} [ name=Solo ]
+
+% --------------------------------------------------------------------------
+% predefined verse templates:
+\defineversetypetemplate {itemize}
+ {
+ \itemize
+ \int_zero:N \@itemdepth
+ \bool_if:NT \l__leadsheets_obey_lines_bool
+ {
+ \dim_zero:N \parskip
+ \keys_set:nn {leadsheets}
+ { obey-lines-parskip = \parsep }
+ }
+ \item[{\verselabel}]
+ }
+ { \enditemize }
+
+% --------------------------------------------------------------------------
+
+\keys_define:nn { leadsheets }
+ {
+ title-template .tl_set:N = \l__leadsheets_songtitle_template_tl ,
+ title-template .initial:n = minimal ,
+ text-format .tl_set:N = \l__leadsheets_songtext_format_tl ,
+ song-format .tl_set:N = \l__leadsheets_song_format_tl ,
+ verse/type .choice: ,
+ verse/type/verse .code:n =
+ \tl_set:Nn \l_leadsheets_verse_type_tl {verse} ,
+ verse/type/unknown .code:n =
+ \msg_warning:nnn {leadsheets} {unknown-verse-type} {#1}
+ \tl_set:Nn \l_leadsheets_verse_type_tl {verse} ,
+ verse/format .tl_set:N = \l__leadsheets_verse_format_tl ,
+ verse/format .initial:n = \l__leadsheets_verses_format_tl ,
+ verse/label-format .tl_set:N = \l__leadsheets_verse_label_format_tl ,
+ verse/label-format .initial:n = \l__leadsheets_verses_label_format_tl ,
+ verses-format .tl_set:N = \l__leadsheets_verses_format_tl ,
+ verses-label-format .tl_set:N = \l__leadsheets_verses_label_format_tl ,
+ verses-after-label .tl_set:N = \l__leadsheets_verses_after_label_tl ,
+ obey-lines .bool_set:N = \l__leadsheets_obey_lines_bool ,
+ obey-lines-parskip .skip_set:N = \l__leadsheets_obey_parskip_skip ,
+ bar-shortcuts .bool_set:N = \l__leadsheets_bar_shorthands_bool ,
+ capo-nr-format .choices:nn =
+ { arabic , roman , Roman }
+ { \tl_set:NV \l__leadsheets_capo_number_format_tl \l_keys_choice_tl } ,
+ capo-nr-format .initial:n = {Roman} ,
+ capo-nr .code:n =
+ \cs_set_protected:Npn \leadsheets_capo_number_print:n ##1 {#1} ,
+ capo-nr .initial:n = #1.
+ }
+
+\endinput
diff --git a/Master/texmf-dist/tex/latex/leadsheets/leadsheets.library.templates.code.tex b/Master/texmf-dist/tex/latex/leadsheets/leadsheets.library.templates.code.tex
new file mode 100644
index 00000000000..618350e1deb
--- /dev/null
+++ b/Master/texmf-dist/tex/latex/leadsheets/leadsheets.library.templates.code.tex
@@ -0,0 +1,87 @@
+\LeadsheetsExplLibrary{templates}
+ {2014/08/10 template mechanism for song titles and verses}
+
+\msg_new:nnn {leadsheets} {unknown-template}
+ { Unknown~ #1~ template~ `#2'~ \msg_line_context: }
+
+\tl_new:N \l__leadsheets_songtitle_template_tl
+\prop_new:N \l__leadsheets_songtitle_template_prop
+
+\NewDocumentCommand \songtitle {} { \leadsheets_songtitle: }
+
+% the following is shamelessly adapted from the `needspace' package by
+% Peter Wilson and Herries Press:
+\cs_new:Npn \leadsheets_needspace:n #1
+ {
+ \group_begin:
+ \dim_set:Nn \l__leadsheets_tmpa_dim { #1 }
+ \skip_vertical:n { \c_zero_dim + \l__leadsheets_tmpa_dim }
+ \tex_penalty:D -100
+ \skip_vertical:n { \c_zero_dim - \l__leadsheets_tmpa_dim }
+ \skip_vertical:N \l__leadsheets_tmpa_dim
+ \tex_penalty:D 9999
+ \skip_vertical:n { - \l__leadsheets_tmpa_dim }
+ \skip_vertical:N \c_zero_dim
+ \group_end:
+ }
+
+\cs_new_protected:Npn \leadsheets_songtitle:
+ {
+ \leadsheets_use_songtitle_template:V \l__leadsheets_songtitle_template_tl
+ \leadsheets_needspace:n { 3\baselineskip }
+ }
+
+\cs_new_protected:Npn \leadsheets_use_songtitle_template:n #1
+ {
+ \prop_get:NnNTF \l__leadsheets_songtitle_template_prop
+ {#1}
+ \l__leadsheets_tmpa_tl
+ { \l__leadsheets_tmpa_tl }
+ { \msg_error:nnnn {leadsheets} {unknown-template} {songtitle} {#1} }
+ }
+\cs_generate_variant:Nn \leadsheets_use_songtitle_template:n { V }
+
+\cs_new_protected:Npn \leadsheets_define_songtitle_template:nn #1#2
+ { \prop_put:Nnn \l__leadsheets_songtitle_template_prop {#1} {#2} }
+
+
+\NewDocumentCommand \definesongtitletemplate {m+m}
+ { \leadsheets_define_songtitle_template:nn {#1} {#2} }
+
+\NewDocumentCommand \expandcode {+m} { \use:x {#1} }
+
+
+% verse-type templates
+\prop_new:N \l__leadsheets_verse_begin_template_prop
+\prop_new:N \l__leadsheets_verse_end_template_prop
+
+% #1: template name
+% #2: begin code
+% #3: end code
+\cs_new_protected:Npn \leadsheets_define_verse_template:nnn #1#2#3
+ {
+ \prop_put:Nnn \l__leadsheets_verse_begin_template_prop {#1} {#2}
+ \prop_put:Nnn \l__leadsheets_verse_end_template_prop {#1} {#3}
+ }
+
+\cs_new_protected:Npn \leadsheets_use_verse_template:nn #1#2
+ {
+ \exp_args:Nnc
+ \prop_get:cVNTF {l__leadsheets_verse_#1_template_prop}
+ {l__leadsheets_#2_template_tl}
+ \l__leadsheets_tmpa_tl
+ { \tl_use:N \l__leadsheets_tmpa_tl }
+ {
+ \msg_error:nnxx {leadsheets} {unknown-template}
+ {verse-type}
+ {\use:c{l__leadsheets_#2_template_tl}}
+ }
+ }
+
+\DeclareExpandableDocumentCommand \ifobeylines {}
+ { \bool_if:NTF \l__leadsheets_obey_lines_bool }
+
+\NewDocumentCommand \defineversetypetemplate {m+m+m}
+ { \leadsheets_define_verse_template:nnn {#1} {#2} {#3} }
+
+\endinput
diff --git a/Master/texmf-dist/tex/latex/leadsheets/leadsheets.library.translations.code.tex b/Master/texmf-dist/tex/latex/leadsheets/leadsheets.library.translations.code.tex
new file mode 100644
index 00000000000..afbb8d0a1ec
--- /dev/null
+++ b/Master/texmf-dist/tex/latex/leadsheets/leadsheets.library.translations.code.tex
@@ -0,0 +1,45 @@
+\LeadsheetsExplLibrary{translations}{2014/08/10 dictionary for leadsheets}
+
+\cs_new:Npn \leadsheets_translation:n #1
+ { \GetTranslation{leadsheets/#1} }
+\cs_generate_variant:Nn \leadsheets_translation:n { V }
+
+\DeclareTranslation {German} {leadsheets/chorus} {Refrain}
+\DeclareTranslation {German} {leadsheets/verse} {Strophe}
+
+\DeclareTranslationFallback {leadsheets/composer} {Composer}
+\DeclareTranslation {English} {leadsheets/composer} {Composer}
+\DeclareTranslation {German} {leadsheets/composer} {Komponist}
+
+\DeclareTranslationFallback {leadsheets/lyrics} {Lyrics}
+\DeclareTranslation {English} {leadsheets/lyrics} {Lyrics}
+\DeclareTranslation {German} {leadsheets/lyrics} {Text}
+
+\DeclareTranslationFallback {leadsheets/key} {Key}
+\DeclareTranslation {English} {leadsheets/key} {Key}
+\DeclareTranslation {German} {leadsheets/key} {Tonart}
+
+\DeclareTranslationFallback {leadsheets/interpret}
+ {as~ interpreted~ by~ \printsongpropertylist{interpret}{~\&~}{,~}{~\&~}}
+\DeclareTranslation {English} {leadsheets/interpret}
+ {as~ interpreted~ by~ \printsongpropertylist{interpret}{~\&~}{,~}{~\&~}}
+\DeclareTranslation {German} {leadsheets/interpret}
+ {wie~ von~ \printsongpropertylist{interpret}{~\&~}{,~}{~\&~}~ interpretiert}
+
+\DeclareTranslationFallback {leadsheets/major} {major}
+\DeclareTranslation {English} {leadsheets/major} {major}
+\DeclareTranslation {German} {leadsheets/major} {Dur}
+
+\DeclareTranslationFallback {leadsheets/minor} {minor}
+\DeclareTranslation {English} {leadsheets/minor} {minor}
+\DeclareTranslation {German} {leadsheets/minor} {Moll}
+
+\DeclareTranslationFallback {leadsheets/capo} {Capo}
+\DeclareTranslation {English} {leadsheets/capo} {Capo}
+\DeclareTranslation {German} {leadsheets/capo} {Kapo}
+
+\DeclareTranslationFallback {leadsheets/fret} {fret}
+\DeclareTranslation {English} {leadsheets/fret} {fret}
+\DeclareTranslation {German} {leadsheets/fret} {Bund}
+
+\endinput
diff --git a/Master/texmf-dist/tex/latex/leadsheets/leadsheets.library.transposing.code.tex b/Master/texmf-dist/tex/latex/leadsheets/leadsheets.library.transposing.code.tex
new file mode 100644
index 00000000000..f70cec60748
--- /dev/null
+++ b/Master/texmf-dist/tex/latex/leadsheets/leadsheets.library.transposing.code.tex
@@ -0,0 +1,211 @@
+\LeadsheetsExplLibrary{transposing}{2014/08/10 transposing of chord symbols}
+
+\prop_new:N \l__leadsheets_pitches_prop
+\prop_new:N \l__leadsheets_prefer_key_prop
+\seq_new:N \l__leadsheets_sharps_seq
+\seq_new:N \l__leadsheets_flats_seq
+
+\cs_new_protected:Npn \leadsheets_define_key:nnn #1#2#3
+ {
+ \seq_new:c {g__leadsheets_key_#1_#2_seq}
+ \prop_new:c {g__leadsheets_key_#1_#2_prop}
+ \seq_gset_from_clist:cn {g__leadsheets_key_#1_#2_seq} {#3}
+ }
+
+% pitches:
+\prop_put:Nnn \l__leadsheets_pitches_prop {C} {0}
+\prop_put:Nnn \l__leadsheets_pitches_prop {Cma} {0}
+\prop_put:Nnn \l__leadsheets_pitches_prop {Ami} {0}
+\prop_put:Nnn \l__leadsheets_pitches_prop {C#} {1}
+\prop_put:Nnn \l__leadsheets_pitches_prop {C#ma} {1}
+\prop_put:Nnn \l__leadsheets_pitches_prop {A#mi} {1}
+\prop_put:Nnn \l__leadsheets_pitches_prop {Db} {1}
+\prop_put:Nnn \l__leadsheets_pitches_prop {Dbma} {1}
+\prop_put:Nnn \l__leadsheets_pitches_prop {Bbmi} {1}
+\prop_put:Nnn \l__leadsheets_pitches_prop {D} {2}
+\prop_put:Nnn \l__leadsheets_pitches_prop {Dma} {2}
+\prop_put:Nnn \l__leadsheets_pitches_prop {Bmi} {2}
+\prop_put:Nnn \l__leadsheets_pitches_prop {D#} {3}
+\prop_put:Nnn \l__leadsheets_pitches_prop {D#ma} {3}
+\prop_put:Nnn \l__leadsheets_pitches_prop {F#mi} {3}
+\prop_put:Nnn \l__leadsheets_pitches_prop {Eb} {3}
+\prop_put:Nnn \l__leadsheets_pitches_prop {Ebma} {3}
+\prop_put:Nnn \l__leadsheets_pitches_prop {Cmi} {3}
+\prop_put:Nnn \l__leadsheets_pitches_prop {E} {4}
+\prop_put:Nnn \l__leadsheets_pitches_prop {Ema} {4}
+\prop_put:Nnn \l__leadsheets_pitches_prop {C#mi} {4}
+\prop_put:Nnn \l__leadsheets_pitches_prop {Fb} {4}
+\prop_put:Nnn \l__leadsheets_pitches_prop {Fbma} {4}
+\prop_put:Nnn \l__leadsheets_pitches_prop {Dbmi} {4}
+\prop_put:Nnn \l__leadsheets_pitches_prop {F} {5}
+\prop_put:Nnn \l__leadsheets_pitches_prop {Fma} {5}
+\prop_put:Nnn \l__leadsheets_pitches_prop {Dmi} {5}
+\prop_put:Nnn \l__leadsheets_pitches_prop {F#} {6}
+\prop_put:Nnn \l__leadsheets_pitches_prop {F#ma} {6}
+\prop_put:Nnn \l__leadsheets_pitches_prop {D#mi} {6}
+\prop_put:Nnn \l__leadsheets_pitches_prop {Gb} {6}
+\prop_put:Nnn \l__leadsheets_pitches_prop {Gbma} {6}
+\prop_put:Nnn \l__leadsheets_pitches_prop {Ebmi} {6}
+\prop_put:Nnn \l__leadsheets_pitches_prop {G} {7}
+\prop_put:Nnn \l__leadsheets_pitches_prop {Gma} {7}
+\prop_put:Nnn \l__leadsheets_pitches_prop {Emi} {7}
+\prop_put:Nnn \l__leadsheets_pitches_prop {G#} {8}
+\prop_put:Nnn \l__leadsheets_pitches_prop {G#ma} {8}
+\prop_put:Nnn \l__leadsheets_pitches_prop {E#mi} {8}
+\prop_put:Nnn \l__leadsheets_pitches_prop {Ab} {8}
+\prop_put:Nnn \l__leadsheets_pitches_prop {Abma} {8}
+\prop_put:Nnn \l__leadsheets_pitches_prop {Fmi} {8}
+\prop_put:Nnn \l__leadsheets_pitches_prop {A} {9}
+\prop_put:Nnn \l__leadsheets_pitches_prop {Ama} {9}
+\prop_put:Nnn \l__leadsheets_pitches_prop {F#mi} {9}
+\prop_put:Nnn \l__leadsheets_pitches_prop {A#} {10}
+\prop_put:Nnn \l__leadsheets_pitches_prop {A#ma} {10}
+\prop_put:Nnn \l__leadsheets_pitches_prop {F##mi} {10}
+\prop_put:Nnn \l__leadsheets_pitches_prop {Bb} {10}
+\prop_put:Nnn \l__leadsheets_pitches_prop {Bbma} {10}
+\prop_put:Nnn \l__leadsheets_pitches_prop {Gmi} {10}
+\prop_put:Nnn \l__leadsheets_pitches_prop {B} {11}
+\prop_put:Nnn \l__leadsheets_pitches_prop {Bma} {11}
+\prop_put:Nnn \l__leadsheets_pitches_prop {G#mi} {11}
+
+\seq_set_from_clist:Nn \l__leadsheets_sharps_seq
+ {C,Ami,G,Emi,D,Bmi,A,F#mi,E,C#mi,B,G#mi,F#,D#mi}
+\seq_set_from_clist:Nn \l__leadsheets_flats_seq
+ {C,Ami,F,Dmi,Bb,Gmi,Eb,Cmi,Ab,Fmi,Db,Bbmi,Gb,Ebmi}
+
+\prop_put:Nnn \l__leadsheets_prefer_key_prop {0} {sharp} % C
+\prop_put:Nnn \l__leadsheets_prefer_key_prop {1} {flat} % Db
+\prop_put:Nnn \l__leadsheets_prefer_key_prop {2} {sharp} % D
+\prop_put:Nnn \l__leadsheets_prefer_key_prop {3} {flat} % Eb
+\prop_put:Nnn \l__leadsheets_prefer_key_prop {4} {sharp} % E
+\prop_put:Nnn \l__leadsheets_prefer_key_prop {5} {flat} % F
+\prop_put:Nnn \l__leadsheets_prefer_key_prop {6} {sharp} % F#
+\prop_put:Nnn \l__leadsheets_prefer_key_prop {7} {sharp} % G
+\prop_put:Nnn \l__leadsheets_prefer_key_prop {8} {flat} % Ab
+\prop_put:Nnn \l__leadsheets_prefer_key_prop {9} {sharp} % A
+\prop_put:Nnn \l__leadsheets_prefer_key_prop {10} {flat} % Bb
+\prop_put:Nnn \l__leadsheets_prefer_key_prop {11} {sharp} % B
+
+\group_begin:
+\char_set_catcode_other:N \#
+\leadsheets_define_key:nnn {sharp} {0} {C, D, E, F, G, A, B} % C
+\leadsheets_define_key:nnn {flat} {0} {C, D, E, F, G, A, B} % C
+
+\leadsheets_define_key:nnn {sharp} {1} {C#, D#, E#, F#, G#, A#, B#} % C#
+\leadsheets_define_key:nnn {flat} {1} {Db, Eb, F, Gb, Ab, Bb, C} % Db
+
+\leadsheets_define_key:nnn {sharp} {2} {D, E, F#, G, A, B, C#} % D
+\leadsheets_define_key:nnn {flat} {2} {Ebb,Fb, Gb, Abb,Bbb,Cb, Db} % Ebb
+
+\leadsheets_define_key:nnn {sharp} {3} {D#, E#, F##,G#, A#, B#, C##}% Eb
+\leadsheets_define_key:nnn {flat} {3} {Eb, F, G, Ab, Bb, C, D} % Eb
+
+\leadsheets_define_key:nnn {sharp} {4} {E, F#, G#, A, B, C#, D#} % E
+\leadsheets_define_key:nnn {flat} {4} {Fb, Gb, Ab, Bbb,Cb, Db, Eb} % Fb
+
+\leadsheets_define_key:nnn {sharp} {5} {E#, F##,G##,A#, B#, C##,D##}% E#
+\leadsheets_define_key:nnn {flat} {5} {F, G, A, Bb, C, D, E} % F
+
+\leadsheets_define_key:nnn {sharp} {6} {F#, G#, A#, B, C#, D#, E#} % F#
+\leadsheets_define_key:nnn {flat} {6} {Gb, Ab, Bb, Cb, Db, Eb, F} % Gb
+
+\leadsheets_define_key:nnn {sharp} {7} {G, A, B, C, D, E, F#} % G
+\leadsheets_define_key:nnn {flat} {7} {Abb,Bbb,Cb, Dbb,Ebb,Fb, Gb} % Abb
+
+\leadsheets_define_key:nnn {sharp} {8} {G#, A#, B#, C#, D#, E#, F##}% G#
+\leadsheets_define_key:nnn {flat} {8} {Ab, Bb, C, Db, Eb, F, G} % Ab
+
+\leadsheets_define_key:nnn {sharp} {9} {A, B, C#, D, E, F#, G#} % A
+\leadsheets_define_key:nnn {flat} {9} {Bbb,Cb, Db, Ebb,Fb, Gb, Ab} % Bbb
+
+\leadsheets_define_key:nnn {sharp} {10} {A#, B#, C##,D#, E#, F##,G##}% A#
+\leadsheets_define_key:nnn {flat} {10} {Bb, C, D, Eb, F, G, A} % Bb
+
+\leadsheets_define_key:nnn {sharp} {11} {B, C#, D#, E, F#, G#, A#} % B
+\leadsheets_define_key:nnn {flat} {11} {Cb, Db, Eb, Fb, Gb, Ab, Bb} % Cb
+\group_end:
+
+% #1: key
+% #2: semitone steps
+% #3: chord
+\cs_new_protected:Npn \leadsheets_transpose:nnN #1#2#3
+ {
+ \int_set:Nn \l__leadsheets_tmpa_int {0}
+ % \l__leadsheets_tmpa_int holds the C pitch
+ \seq_if_in:NnTF \l__leadsheets_sharps_seq {#1}
+ { \tl_set:Nn \l__leadsheets_tmpa_tl {sharp} }
+ { \tl_set:Nn \l__leadsheets_tmpa_tl {flat} }
+ % \l__leadsheets_tmpa_tl holds the `sharp' or `flat' preference
+ \int_set:Nn \l__leadsheets_tmpb_int {#2}
+ \int_while_do:nNnn { \l__leadsheets_tmpb_int } < { 0 }
+ { \int_set:Nn \l__leadsheets_tmpb_int { \l__leadsheets_tmpb_int + 12 } }
+ % \l__leadsheets_tmpb_int holds the new pitch number relatice to C
+ \bool_if:NTF \l__leadsheets_enharmonic_bool
+ { \tl_set_eq:NN \l__leadsheets_tmpb_tl \l__leadsheets_enharmonic_tl }
+ {
+ \tl_set:Nx \l__leadsheets_tmpb_tl
+ {
+ \prop_item:NV
+ \l__leadsheets_prefer_key_prop
+ \l__leadsheets_tmpb_int
+ }
+ }
+ % \l__leadsheets_tmpb_tl holds the `sharp' or `flat' preference
+ % of the new key
+ \seq_set_split:NnV \l__leadsheets_tmpa_seq {/} #3
+ \tl_clear:N #3
+ \seq_clear:N \l__leadsheets_tmpb_seq
+ \seq_map_inline:Nn \l__leadsheets_tmpa_seq
+ {
+ \tl_set:Nn \l__leadsheets_tmpc_tl {##1} % the chord
+ \int_zero:N \l__leadsheets_tmpc_int
+ \int_zero:N \l__leadsheets_tmpc_int
+ \seq_map_inline:cn
+ {
+ g__leadsheets_key_
+ \l__leadsheets_tmpb_tl _
+ \int_to_arabic:V \l__leadsheets_tmpa_int
+ _seq
+ }
+ {
+ \int_incr:N \l__leadsheets_tmpc_int
+ \tl_if_in:NnT \l__leadsheets_tmpc_tl {####1}
+ {
+ \tl_set:Nx \l__leadsheets_tmpd_tl
+ {
+ \seq_item:cV
+ {
+ g__leadsheets_key_
+ \l__leadsheets_tmpb_tl _
+ \int_to_arabic:V \l__leadsheets_tmpb_int
+ _seq
+ }
+ \l__leadsheets_tmpc_int
+ }
+ \tl_replace_once:NnV \l__leadsheets_tmpc_tl
+ {####1}
+ \l__leadsheets_tmpd_tl
+ \seq_map_break:
+ }
+ }
+ \seq_put_right:NV \l__leadsheets_tmpb_seq \l__leadsheets_tmpc_tl
+ }
+ \tl_set:Nx #3 { \seq_use:Nn \l__leadsheets_tmpb_seq {/} }
+ }
+\cs_generate_variant:Nn \leadsheets_transpose:nnN { xV }
+
+\keys_define:nn {leadsheets}
+ {
+ transpose .code:n =
+ \bool_set_true:N \l__leadsheets_transpose_bool
+ \int_set:Nn \l__leadsheets_transpose_steps_int {#1} ,
+ transpose-capo .bool_set:N = \l__leadsheets_transpose_capo_bool ,
+ enharmonic .choices:nn =
+ { sharp , flat }
+ {
+ \tl_set_eq:NN \l__leadsheets_enharmonic_tl \l_keys_choice_tl
+ \bool_set_true:N \l__leadsheets_enharmonic_bool
+ }
+ }
+
+\endinput
diff --git a/Master/texmf-dist/tex/latex/leadsheets/leadsheets.sty b/Master/texmf-dist/tex/latex/leadsheets/leadsheets.sty
new file mode 100644
index 00000000000..21e744f36d0
--- /dev/null
+++ b/Master/texmf-dist/tex/latex/leadsheets/leadsheets.sty
@@ -0,0 +1,171 @@
+% --------------------------------------------------------------------------
+% required packages:
+\RequirePackage{expl3,l3keys2e,xparse,translations}
+
+% --------------------------------------------------------------------------
+% package information:
+\ExplSyntaxOn
+\tl_const:Nx \c_leadsheets_date_tl {2015/01/11}
+\tl_const:Nx \c_leadsheets_version_tl {0.1}
+\tl_const:Nx \c_leadsheets_info_tl {Typesetting leadsheets and songbooks}
+
+\ProvidesExplPackage
+ {leadsheets}
+ {\c_leadsheets_date_tl}
+ {\c_leadsheets_version_tl}
+ {\c_leadsheets_info_tl \c_space_tl (CN)}
+
+% --------------------------------------------------------------------------
+% messages:
+\msg_new:nnn {leadsheets} {library-missing}
+ {
+ You've~ requested~ the~ leadsheets~ library~ `#1'~ but~ it~ appears~ to~
+ be~ missing~ on~ your~ system.~ Maybe~ you've~ misspelled~ the~ name?~
+ Loading~ the~ library~ will~ abort~ \msg_line_context:
+ }
+
+\msg_new:nnn {leadsheets} {loading-library}
+ {
+ (leadsheets) \c_space_tl \c_space_tl \c_space_tl \c_space_tl
+ Loading~ library~ `#1'...
+ }
+
+% --------------------------------------------------------------------------
+% variants of kernel functions:
+\cs_generate_variant:Nn \tl_if_eq:nnTF { xx , V }
+\cs_generate_variant:Nn \seq_set_split:Nnn { Nnx }
+\cs_generate_variant:Nn \prop_item:Nn { NV }
+\cs_generate_variant:Nn \seq_item:Nn { cV }
+\cs_generate_variant:Nn \int_to_arabic:n { V }
+\cs_generate_variant:Nn \tl_replace_once:Nnn { NnV }
+\cs_generate_variant:Nn \prop_gput:Nnn { cxx , NVf }
+\cs_generate_variant:Nn \msg_error:nnn { nnV }
+\cs_generate_variant:Nn \msg_warning:nnn { nnV }
+\cs_generate_variant:Nn \vbox_set:Nn { NV }
+
+% --------------------------------------------------------------------------
+% temporary variables:
+\tl_new:N \l__leadsheets_tmpa_tl
+\tl_new:N \l__leadsheets_tmpb_tl
+\tl_new:N \l__leadsheets_tmpc_tl
+\tl_new:N \l__leadsheets_tmpd_tl
+\bool_new:N \l__leadsheets_tmpa_bool
+\dim_new:N \l__leadsheets_tmpa_dim
+\seq_new:N \l__leadsheets_tmpa_seq
+\seq_new:N \l__leadsheets_tmpb_seq
+\int_new:N \l__leadsheets_tmpa_int
+\int_new:N \l__leadsheets_tmpb_int
+\int_new:N \l__leadsheets_tmpc_int
+\box_new:N \l__leadsheets_tmpa_box
+
+% --------------------------------------------------------------------------
+% library mechanism:
+\tl_const:Nn \c__leadsheets_library_extension_tl {code.tex}
+\tl_const:Nn \c__leadsheets_library_prefix_tl {leadsheets.library}
+
+\cs_new_protected:Npn \leadsheets_load_libraries:n #1
+ { \clist_map_inline:nn {#1} { \leadsheets_load_library:n {##1} } }
+
+\cs_new_protected:Npn \leadsheets_load_library:n #1
+ {
+ \tl_set:Nx \l__leadsheets_tmpa_tl { \tl_trim_spaces:n {#1} }
+ \__leadsheets_load_library:V \l__leadsheets_tmpa_tl
+ }
+
+\cs_new_protected:Npn \__leadsheets_load_library:n #1
+ {
+ \cs_if_exist:cF {leadsheets-library-#1-loaded}
+ {
+ \file_if_exist:nTF
+ {\c__leadsheets_library_prefix_tl.#1.\c__leadsheets_library_extension_tl}
+ {
+ \msg_log:nnn {leadsheets} {loading-library} {#1}
+ \@onefilewithoptions
+ {\c__leadsheets_library_prefix_tl.#1}[][]
+ \c__leadsheets_library_extension_tl
+ }
+ { \msg_warning:nnn {leadsheets} {library-missing} {#1} }
+ }
+ }
+\cs_generate_variant:Nn \__leadsheets_load_library:n { V }
+
+\cs_new_protected:Npn \__leadsheets_library:nn #1#2
+ {
+ \cs_new:cpn {leadsheets-library-#1-loaded} {leadsheets:~`#1'~library}
+ \ProvidesFile
+ {\c__leadsheets_library_prefix_tl.#1.\c__leadsheets_library_extension_tl}
+ [
+ \c_leadsheets_date_tl
+ \c_space_tl
+ v \c_leadsheets_version_tl
+ \c_space_tl
+ leadsheets~ library~ `#1'~ #2
+ ]
+ }
+
+% --------------------------------------------------------------------------
+% one of those defines a leadsheets library, either using expl syntax or 2e
+% package syntax:
+\NewDocumentCommand \LeadsheetsExplLibrary {mm}
+ { \__leadsheets_library:nn {#1} {#2} \ExplSyntaxOn }
+
+\NewDocumentCommand \LeadsheetsLibrary {mm}
+ { \__leadsheets_library:nn {#1} {#2} }
+
+% --------------------------------------------------------------------------
+% commands for loading libraries:
+\NewDocumentCommand \useleadsheetslibraries {m}
+ { \leadsheets_load_libraries:n {#1} }
+
+\NewDocumentCommand \useleadsheetslibrary {m}
+ { \leadsheets_load_library:n {#1} }
+
+% --------------------------------------------------------------------------
+% a setup command:
+\NewDocumentCommand \setleadsheets {m}
+ { \keys_set:nn {leadsheets} {#1} }
+
+% --------------------------------------------------------------------------
+% package options:
+\bool_new:N \l__leadsheets_with_options_bool
+
+\keys_define:nn {leadsheets}
+ {
+ musicsymbols .code:n =
+ \bool_set_true:N \l__leadsheets_with_options_bool
+ \leadsheets_load_library:n {musicsymbols} ,
+ chordnames .code:n =
+ \bool_set_true:N \l__leadsheets_with_options_bool
+ \leadsheets_load_library:n {chordnames} ,
+ musejazz .code:n =
+ \bool_set_true:N \l__leadsheets_with_options_bool
+ \leadsheets_load_library:n {musejazz} ,
+ songs .code:n =
+ \bool_set_true:N \l__leadsheets_with_options_bool
+ \leadsheets_load_library:n {songs} ,
+ minimal .code:n =
+ \bool_set_true:N \l__leadsheets_with_options_bool ,
+ full .code:n =
+ \bool_set_true:N \l__leadsheets_with_options_bool
+ \leadsheets_load_libraries:n
+ {
+ musicsymbols ,
+ chordnames ,
+ songs ,
+ chords ,
+ shorthands ,
+ properties ,
+ transposing ,
+ templates ,
+ translations
+ }
+ }
+\ProcessKeysOptions{leadsheets}
+
+\bool_if:NF \l__leadsheets_with_options_bool
+ { \leadsheets_load_library:n {songs} }
+
+
+% --------------------------------------------------------------------------
+\tex_endinput:D
+