From 9a32a7a9d63c685e263389fb8d77f6fc7fce616a Mon Sep 17 00:00:00 2001 From: Karl Berry Date: Sun, 11 Jan 2015 22:50:01 +0000 Subject: leadsheets (11jan15) git-svn-id: svn://tug.org/texlive/trunk@36029 c570f23f-e606-0410-a88d-b1316a301751 --- .../leadsheets.library.chordnames.code.tex | 193 +++++++ .../leadsheets/leadsheets.library.chords.code.tex | 189 ++++++ .../leadsheets.library.musejazz.code.tex | 259 +++++++++ .../leadsheets.library.musicsymbols.code.tex | 104 ++++ .../leadsheets.library.properties.code.tex | 167 ++++++ .../leadsheets.library.shorthands.code.tex | 40 ++ .../leadsheets/leadsheets.library.songs.code.tex | 631 +++++++++++++++++++++ .../leadsheets.library.templates.code.tex | 87 +++ .../leadsheets.library.translations.code.tex | 45 ++ .../leadsheets.library.transposing.code.tex | 211 +++++++ .../texmf-dist/tex/latex/leadsheets/leadsheets.sty | 171 ++++++ 11 files changed, 2097 insertions(+) create mode 100644 Master/texmf-dist/tex/latex/leadsheets/leadsheets.library.chordnames.code.tex create mode 100644 Master/texmf-dist/tex/latex/leadsheets/leadsheets.library.chords.code.tex create mode 100644 Master/texmf-dist/tex/latex/leadsheets/leadsheets.library.musejazz.code.tex create mode 100644 Master/texmf-dist/tex/latex/leadsheets/leadsheets.library.musicsymbols.code.tex create mode 100644 Master/texmf-dist/tex/latex/leadsheets/leadsheets.library.properties.code.tex create mode 100644 Master/texmf-dist/tex/latex/leadsheets/leadsheets.library.shorthands.code.tex create mode 100644 Master/texmf-dist/tex/latex/leadsheets/leadsheets.library.songs.code.tex create mode 100644 Master/texmf-dist/tex/latex/leadsheets/leadsheets.library.templates.code.tex create mode 100644 Master/texmf-dist/tex/latex/leadsheets/leadsheets.library.translations.code.tex create mode 100644 Master/texmf-dist/tex/latex/leadsheets/leadsheets.library.transposing.code.tex create mode 100644 Master/texmf-dist/tex/latex/leadsheets/leadsheets.sty (limited to 'Master/texmf-dist/tex/latex') 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 + -- cgit v1.2.3