From 2639cda39baf8b76bc02b0e2cd4e426570ee46d5 Mon Sep 17 00:00:00 2001 From: Karl Berry Date: Fri, 19 Aug 2016 21:44:56 +0000 Subject: leadsheets (19aug16) git-svn-id: svn://tug.org/texlive/trunk@41890 c570f23f-e606-0410-a88d-b1316a301751 --- .../texmf-dist/tex/latex/leadsheets/leadsheet.cls | 187 ++++++++++++++ .../leadsheets.library.chordnames.code.tex | 74 ++++-- .../leadsheets/leadsheets.library.chords.code.tex | 68 +++--- .../leadsheets.library.external.code.tex | 181 ++++++++++++++ .../leadsheets.library.musejazz.code.tex | 1 - .../leadsheets.library.musicsymbols.code.tex | 32 ++- .../leadsheets.library.properties.code.tex | 43 +++- .../leadsheets.library.shorthands.code.tex | 48 ++-- .../leadsheets/leadsheets.library.songs.code.tex | 270 +++++++++++++-------- .../leadsheets.library.templates.code.tex | 15 +- .../leadsheets.library.translations.code.tex | 73 +++--- .../leadsheets.library.transposing.code.tex | 1 - .../texmf-dist/tex/latex/leadsheets/leadsheets.sty | 84 ++++++- 13 files changed, 835 insertions(+), 242 deletions(-) create mode 100644 Master/texmf-dist/tex/latex/leadsheets/leadsheet.cls create mode 100644 Master/texmf-dist/tex/latex/leadsheets/leadsheets.library.external.code.tex (limited to 'Master/texmf-dist/tex/latex/leadsheets') diff --git a/Master/texmf-dist/tex/latex/leadsheets/leadsheet.cls b/Master/texmf-dist/tex/latex/leadsheets/leadsheet.cls new file mode 100644 index 00000000000..ab584ee80dd --- /dev/null +++ b/Master/texmf-dist/tex/latex/leadsheets/leadsheet.cls @@ -0,0 +1,187 @@ +% -------------------------------------------------------------------------- +% the LEADSHEETS package +% +% typesetting leadsheets and songbooks +% +% -------------------------------------------------------------------------- +% Clemens Niederberger +% E-Mail: contact@mychemistry.eu +% -------------------------------------------------------------------------- +% Copyright 2014-2016 Clemens Niederberger +% +% This work may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either version 1.3 +% of this license or (at your option) any later version. +% The latest version of this license is in +% http://www.latex-project.org/lppl.txt +% and version 1.3 or later is part of all distributions of LaTeX +% version 2005/12/01 or later. +% +% This work has the LPPL maintenance status `maintained'. +% +% The Current Maintainer of this work is Clemens Niederberger. +% -------------------------------------------------------------------------- +\ProvidesClass{leadsheet}[2016/07/21 v0.5 leadsheets class (part of the leadsheets package)] +\LoadClassWithOptions{scrartcl} + +\RequirePackage{leadsheets} + +\RequirePackage{etoolbox} +\RequirePackage{translations} + +\defleadsheetstranslation{Fallback}{page}{page} +\defleadsheetstranslation{Fallback}{of}{of} +\defleadsheetstranslation{Fallback}{music}{music} +\defleadsheetstranslation{Fallback}{text}{text} +\defleadsheetstranslation{Fallback}{as-played-by}{as played by} +\defleadsheetstranslation{Fallback}{choir}{choir} + +\defleadsheetstranslation{German}{page}{Seite} +\defleadsheetstranslation{German}{of}{von} +\defleadsheetstranslation{German}{music}{Musik} +\defleadsheetstranslation{German}{text}{Text} +\defleadsheetstranslation{German}{as-played-by}{wie gespielt von} +\defleadsheetstranslation{German}{choir}{Chor} + +\providecommand*\ls@songtitle{} +\providecommand*\ls@songinterpret{} + +\definesongproperty{language} + +\newbool{ls@comma} +\newrobustcmd*\ls@addcomma{% + \ifbool{ls@comma}{, }{}% + \boolfalse{ls@comma}% +} + +\newrobustcmd*\ls@printproperty[2]{% + \ifsongproperty{#1}{% + \ls@addcomma + #2% + \booltrue{ls@comma}% + }{}% +} + +\definesongtitletemplate{leadsheet}{% + \section*{% + \songproperty{title}% + \ifsongproperty{subtitle}{ (\songproperty{subtitle})}{}% + } + \xdef\ls@songtitle{\songproperty{title}}% + \ifsongproperty{composer} + {% + \ifsongproperty{lyrics} + {% + \leadsheetstranslate{lyrics}: + \printsongpropertylist{lyrics}{ \& }{, }{ \& }, + \booltrue{ls@comma}% + } + {}% + \leadsheetstranslate{music}: + \printsongpropertylist{composer}{ \& }{, }{ \& }% + \booltrue{ls@comma}% + } + {% + \ifsongproperty{lyrics} + {% + \leadsheetstranslate{lyrics}: + \printsongpropertylist{lyrics}{ \& }{, }{ \& }% + \ifsongproperty{music}{, }{}% + \booltrue{ls@comma}% + } + {}% + \ifsongproperty{music} + {% + \ifsongproperty{lyrics} + {} + {\leadsheetstranslate{lyrics} \& }% + \leadsheetstranslate{music}: + \printsongpropertylist{music}{ \& }{, }{ \& }% + \booltrue{ls@comma}% + } + {}% + }% + \ifsongproperty{band} + {% + \ls@addcomma + \leadsheetstranslate{as-played-by}: + \songproperty{band}% + \xdef\ls@songinterpret{\songproperty{band}}% + \booltrue{ls@comma}% + }{% + \ifsongproperty{interpret} + {% + \ls@addcomma + \leadsheetstranslate{as-played-by}: + \songproperty{interpret}% + \xdef\ls@songinterpret{\songproperty{interpret}}% + \booltrue{ls@comma}% + } + {}% + }% + \ifsongproperty{key} + {% + \ls@addcomma + \leadsheetstranslate{key}: + \expandcode{\writechord{\songproperty{key}}} + } + {}% + \ifsongproperty{language} + {% + \ifboolexpr{ + test {\leadsheetsifpackageloaded{babel}} or + test {\leadsheetsifpackageloaded{poyglossia}} + }{\expandcode{\noexpand\selectlanguage{\songproperty{language}}}} + {}% + } + {}% +} + +\setleadsheets{ + title-template = leadsheet , + bar-shortcuts , + verse/numbered , + verses-format = , + verses-label-format = \bfseries , + info/format = \itshape , + chorus/format = \itshape +} + +\RequirePackage{scrlayer-scrpage,zref-totpages} +\pagestyle{scrheadings} +\rohead{} +\cohead{% + \ifnum\ztotpages>1 + \ifnum\value{page}=1 + \else + \ls@songtitle + \ifdefvoid\ls@songinterpret{}{ (\ls@songinterpret)}% + \fi + \fi +} +\cofoot{% + \ifnum\ztotpages>1 + \leadsheetstranslate{page}~\thepage~% + \leadsheetstranslate{of}~\ztotpages + \fi +} + +\LeadsheetSurvive +\provideversetype{prechorus}[name=Prechorus] +\provideversetype*{prechorus*}[name=Prechorus] + +\providerobustcmd*\lsenparen[1]{% + \expandcode{\noexpand\mklsenparen\mklsenparens{\unexpanded{#1}}}% +} +\providecommand*\mklsenparens{[]} +\providecommand*\mklsenparen[3]{\textup{#1}#3\textup{#2}} + +\providerobustcmd*\instruction[1]{\lsenparen{\mkinstruction{#1}}} +\providecommand*\mkinstruction[1]{\emph{#1}} + +\providerobustcmd*\choir[1]{\null\qquad\mkchoir{#1}} +\providecommand*\mkchoir[1]{\instruction{\leadsheetstranslate{choir}: #1}} +\LeadsheetEndSurvive + +\endinput +2016/08/17 - first version added to `leadsheets' 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 index 4342d33d69b..9fe740fcc62 100644 --- a/Master/texmf-dist/tex/latex/leadsheets/leadsheets.library.chordnames.code.tex +++ b/Master/texmf-dist/tex/latex/leadsheets/leadsheets.library.chordnames.code.tex @@ -5,7 +5,6 @@ % % -------------------------------------------------------------------------- % Clemens Niederberger -% Web: http://www.mychemistry.eu/forums/forum/leadsheets/ % E-Mail: contact@mychemistry.eu % -------------------------------------------------------------------------- % Copyright 2014-2016 Clemens Niederberger @@ -22,19 +21,20 @@ % % The Current Maintainer of this work is Clemens Niederberger. % -------------------------------------------------------------------------- -\LeadsheetsExplLibrary{chordnames}{2015/07/02 typesetting chord names with easy syntax} +\LeadsheetsExplLibrary{chordnames}{2016/07/05 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 - \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} } } + { \tl_replace_all:Nnn #1 {#2} { \textsuperscript {#2} } } + +\cs_new_protected:Npn \leadsheets_tension_sym:Nnn #1#2#3 + { \tl_replace_all:Nnn #1 {#2} { \textsuperscript {#3} } } +\cs_generate_variant:Nn \leadsheets_tension_sym:Nnn {NnV} \cs_new_protected:Npn \leadsheets_chord_sym:Nnn #1#2#3 { \tl_replace_all:Nnn #1 {#2} {#3} } @@ -93,12 +93,9 @@ \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:NnV \l__leadsheets_chord_tl {maj7} \l__leadsheets_major_seven_tl + \leadsheets_chord_sym:NnV \l__leadsheets_chord_tl {maj9} \l__leadsheets_major_nine_tl + \leadsheets_chord_sym:NnV \l__leadsheets_chord_tl {sus} \l__leadsheets_sus_tl \leadsheets_chord_sym:Nnn \l__leadsheets_chord_tl {^} {\textsuperscript} \bool_if:NT \l__leadsheets_output_notation_german_bool { @@ -107,10 +104,8 @@ } \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:NnV \l__leadsheets_chord_tl {##} \l__leadsheets_doublesharp_tl + \leadsheets_chord_sym:NnV \l__leadsheets_chord_tl {bb} \l__leadsheets_doubleflat_tl \leadsheets_chord_sym:NnV \l__leadsheets_chord_tl {#} \l__leadsheets_sharp_tl \leadsheets_chord_sym:NnV \l__leadsheets_chord_tl {b} \l__leadsheets_flat_tl \leadsheets_chord_sym:NnV \l__leadsheets_chord_tl {dim} \l__leadsheets_dim_tl @@ -125,12 +120,9 @@ \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_tension_sym:NnV \l__leadsheets_chord_tl {/o} \l__leadsheets_half_dim_tl + \leadsheets_tension_sym:NnV \l__leadsheets_chord_tl {o} \l__leadsheets_full_dim_tl + \leadsheets_tension_sym:NnV \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} @@ -140,12 +132,31 @@ \tl_replace_all:Nnn \l__leadsheets_chord_tl {\textsuperscript\textsuperscript} {\textsuperscript} + \bool_if:NT \l__leadsheets_lowercase_minor_bool + { + \tl_put_left:Nn \l__leadsheets_chord_tl { \__leadsheets_start_minor:w } + \tl_put_right:Nn \l__leadsheets_chord_tl { \q_stop } + } +% \show \l__leadsheets_chord_tl \tl_use:N \l__leadsheets_chord_tl \group_end: } \group_end: +% lowercase letters for minor chords: +\bool_new:N \l__leadsheets_lowercase_minor_bool + +\cs_new_protected:Npn \__leadsheets_start_minor:w #1 \q_stop + { + \tl_if_in:nnTF {#1} {\l__leadsheets_minor_tl} + { \__leadsheets_revert_minor:w #1 \q_stop } + {#1} + } + +\cs_new_protected:Npn \__leadsheets_revert_minor:w #1 \l__leadsheets_minor_tl #2 \q_stop + { \tl_lower_case:n {#1} #2 } + \cs_new_protected:Npn \leadsheets_tension:w (#1) { \group_begin: @@ -168,14 +179,23 @@ 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 , + minor .code:n = + \str_if_eq:nnTF {#1} {lowercase} + { + \bool_set_true:N \l__leadsheets_lowercase_minor_bool + \tl_clear:N \l__leadsheets_minor_tl + } + { + \bool_set_false:N \l__leadsheets_lowercase_minor_bool + \tl_set:Nn \l__leadsheets_minor_tl {#1} + } , 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 , german-B .tl_set:N = \l__leadsheets_german_B_tl , - german-H .tl_set:N = \l__leadsheets_german_H_tl + german-H .tl_set:N = \l__leadsheets_german_H_tl , % since version 0.2 those are defined in the `chords` library: % output-notation .choice: , % input-notation .choice: , @@ -195,4 +215,8 @@ HISTORY: - input/output notation is now handled by the `chords' library - German output of B and H can be customized 2015/05/22 - improvements to the chord macros -2015/07/02 - this is not a use library any more +2015/07/02 - this is not a user library any more +2016/07/05 - with option `minor=lowercase' minor chords are now printed with + lowercase letters; requires user input `Dmi' in order to get `d'; + lowercase letters can of course be input directly but then are + immune to transposing 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 index 96be6e7c483..0cea01229a3 100644 --- a/Master/texmf-dist/tex/latex/leadsheets/leadsheets.library.chords.code.tex +++ b/Master/texmf-dist/tex/latex/leadsheets/leadsheets.library.chords.code.tex @@ -5,7 +5,6 @@ % % -------------------------------------------------------------------------- % Clemens Niederberger -% Web: http://www.mychemistry.eu/forums/forum/leadsheets/ % E-Mail: contact@mychemistry.eu % -------------------------------------------------------------------------- % Copyright 2014-2016 Clemens Niederberger @@ -22,12 +21,13 @@ % % The Current Maintainer of this work is Clemens Niederberger. % -------------------------------------------------------------------------- -\LeadsheetsExplLibrary{chords}{2015/07/02 printing chords} +\LeadsheetsExplLibrary{chords}{2016/07/02 printing chords} \msg_new:nnn {leadsheets} {no-chords} { No~ more~ chords~ left~ for~ verse~ type~ `#1'~ \msg_line_context: } \leadsheets_load_library:n {chordnames} + \bool_new:N \l__leadsheets_output_notation_german_bool \bool_new:N \l__leadsheets_input_notation_german_bool @@ -114,28 +114,31 @@ \tl_replace_all:Nnn \l__leadsheets_current_chord_tl {H} {B} } { \tl_replace_all:Nnn \l__leadsheets_current_chord_tl {H} {B} } - \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 ) - } + \leadsheets_if_library:nT {songs} { - \msg_warning:nnV {leadsheets} - {transpose-key} - \l_leadsheets_current_song_id_tl + \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 + } } % => convert to specified output \bool_if:NT \l__leadsheets_output_notation_german_bool @@ -158,7 +161,8 @@ \bool_if:NTF \l__leadsheets_chord_print_bool { \group_begin: - \leadsheets_ignore_lines: + \leadsheets_if_library:nT {songs} + { \leadsheets_ignore_lines: } \bool_if:NT \g__leadsheets_smash_next_chord_bool { \bool_set_true:N \l__leadsheets_smash_chords_bool @@ -235,13 +239,6 @@ { \prg_return_false: } } -\cs_new:Npn \leadsheets_remember_or_recall_chords:w - { - \leadsheets_if_recall_chords:TF - { \recallchord } - { \chord } - } - \cs_new_protected:Npn \leadsheets_recall_chord:nn #1#2 { \seq_pop_left:NNF \g__leadsheets_chords_sequences_seq @@ -256,6 +253,13 @@ \NewDocumentCommand \recallchord {st-} { \leadsheets_recall_chord:nn {#1} {#2} } +\NewDocumentCommand \getorprintchord {} + { + \leadsheets_if_recall_chords:TF + { \recallchord } + { \chord } + } + \endinput HISTORY: @@ -267,4 +271,4 @@ HISTORY: - options `input-notation' and `output-notation' now directly belong to the `chords' library. - this is now a user library - +2016/07/02 - \getorprintchord diff --git a/Master/texmf-dist/tex/latex/leadsheets/leadsheets.library.external.code.tex b/Master/texmf-dist/tex/latex/leadsheets/leadsheets.library.external.code.tex new file mode 100644 index 00000000000..13c5c13c9ac --- /dev/null +++ b/Master/texmf-dist/tex/latex/leadsheets/leadsheets.library.external.code.tex @@ -0,0 +1,181 @@ +% -------------------------------------------------------------------------- +% the LEADSHEETS package +% +% typesetting leadsheets and songbooks +% +% -------------------------------------------------------------------------- +% Clemens Niederberger +% E-Mail: contact@mychemistry.eu +% -------------------------------------------------------------------------- +% Copyright 2014-2016 Clemens Niederberger +% +% This work may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either version 1.3 +% of this license or (at your option) any later version. +% The latest version of this license is in +% http://www.latex-project.org/lppl.txt +% and version 1.3 or later is part of all distributions of LaTeX +% version 2005/12/01 or later. +% +% This work has the LPPL maintenance status `maintained'. +% +% The Current Maintainer of this work is Clemens Niederberger. +% -------------------------------------------------------------------------- +\LeadsheetsExplLibrary{external} + {2016/08/18 include external leadsheets into a main file} + +\msg_new:nnn {leadsheets} {class-not-registered} + { + You've~ tried~ to~ include~ the~ leadsheet~ `#1'~ which~ uses~ the~ + document~ class~ `#2'.~ However,~ this~ class~ is~ not~ yet~ registered.~ + You~ can~ register~ it~ using~ the~ option~ `register-class'. + } + +\msg_new:nnn {leadsheets} {file-not-found} + { + You've~ tried~ to~ include~ the~ leadsheet~ `#1'.~ However,~ I~ can't~ + find~ the~ file~ `#1'.~ Please~ make~ sure~ the~ file~ exists~ in~ a~ + path~ where~ TeX~ can~ find~ it. + } + +\cs_generate_variant:Nn \msg_error:nnnn {nnV} + +\cs_new_protected:Npn \__leadsheets_disable_document_env: + { + \cs_set_protected:Npn \document + { + \cs_set_protected:Npn \enddocument + { \tex_endinput:D } + } + } + +% -------------------------------------------------------------------------- +% don't allow any class per default +\seq_new:N \l__leadsheets_external_classes_seq + +\cs_new_protected:Npn \leadsheets_add_external_class:n #1 + { + \seq_put_right:Nn \l__leadsheets_external_classes_seq {#1} + \seq_remove_duplicates:N \l__leadsheets_external_classes_seq + } +\cs_generate_variant:Nn \leadsheets_add_external_class:n {V} + +\leadsheets_add_external_class:n {leadsheet} + +\prg_new_conditional:Npnn \leadsheets_if_is_external_class:n #1 {p,T,F,TF} + { + \seq_if_in:NnTF \l__leadsheets_external_classes_seq {#1} + { \prg_return_true: } + { \prg_return_false: } + } + +\bool_new:N \l__leadsheets_gobble_preamble_bool + +\keys_define:nn {leadsheets} + { + gobble-preamble .bool_set:N = \l__leadsheets_gobble_preamble_bool , + gobble-preamble .initial:n = true , + register-class .code:n = + \clist_map_inline:nn {#1} + { + \tl_set:Nx \l__leadsheets_tmpa_tl { \tl_trim_spaces:n {##1} } + \leadsheets_add_external_class:V \l__leadsheets_tmpa_tl + } + } + +\cs_new_protected:Npn \leadsheets_documentclass:wnw + { + \peek_meaning:NTF [ % ] + { \__leadsheets_documentclass:wnw } + { \__leadsheets_documentclass:nw } + } + +\cs_new_protected:Npn \__leadsheets_documentclass:wnw [#1] + { \__leadsheets_documentclass:nw } + +\cs_new_protected:Npn \__leadsheets_documentclass:nw #1 + { + \peek_meaning:NTF [ % ] + { \__leadsheets_documentclass_aux:nw {#1} } + { \__leadsheets_documentclass:n {#1} } + } + +\cs_new_protected:Npn \__leadsheets_documentclass_aux:nw #1[#2] + { \__leadsheets_documentclass:n {#1} } + +\cs_new_protected:Npn \__leadsheets_documentclass:n #1 + { + \leadsheets_if_is_external_class:nF {#1} + { + \msg_error:nnVn {leadsheets} {class-not-registered} + \l__leadsheets_current_leadsheet_tl + {#1} + } + \RenewDocumentCommand \usepackage {omo} {} + \RenewDocumentCommand \RequirePackage {omo} {} + \__leadsheets_disable_document_env: + \bool_if:NT \l__leadsheets_gobble_preamble_bool + { \__leadsheets_gobble_preamble:wn } + } + +% include a file into a leadsheet only reading code between \LeadsheetSurvive +% and \LeadsheetEndSurvive +\cs_new_protected:Npn \leadsheets_include_external_file:nn #1#2 + { + \tl_set_from_file:Nnn \l__leadsheets_tmpa_tl + {} + { #1 \tl_if_blank:nF {#2} {.} #2 } + \cs_set:Npn \LeadsheetSurvive ##1 \LeadsheetEndSurvive ##2 \q_stop + { ##1 \__leadsheets_extract_survival:ww ##2 \q_stop } + \__leadsheets_include_external_file_aux:V \l__leadsheets_tmpa_tl + } + +\cs_new_protected:Npn \__leadsheets_include_external_file_aux:n #1 + { \__leadsheets_extract_survival:ww #1 \LeadsheetSurvive\LeadsheetSurvive \q_stop } +\cs_generate_variant:Nn \__leadsheets_include_external_file_aux:n {V} + +\cs_new_protected:Npn \__leadsheets_extract_survival:ww + #1 \LeadsheetSurvive #2 \LeadsheetSurvive #3 \q_stop + { + \tl_if_blank:nF {#3} + { \LeadsheetSurvive #2 \LeadsheetSurvive #3 \q_stop } + } + +\NewDocumentCommand \AddExternalFile {mm} + { \leadsheets_include_external_file:nn {#1} {#2} } +\NewDocumentCommand \AddExternalClass {m} + { \leadsheets_include_external_file:nn {#1} {cls} } +\NewDocumentCommand \AddExternalPackage {m} + { \leadsheets_include_external_file:nn {#1} {sty} } + +\cs_new_protected:Npn \__leadsheets_gobble_preamble:wn #1 \begin #2 + { + \str_if_eq:nnTF {#2} {document} + { \begin {#2} } + { \__leadsheets_gobble_preamble:wn } + } + +\cs_new_protected:Npn \leadsheets_include_leadsheet:nn #1#2 + { + \file_if_exist:nTF {#2} + { + \group_begin: + \keys_set:nn {leadsheets} {#1} + \tl_set:Nn \l__leadsheets_current_leadsheet_tl {#2} + \cs_set_eq:NN \documentclass \leadsheets_documentclass:wnw + \file_input:n {#2} + \group_end: + } + { \msg_error:nnn {leadsheets} {file-not-found} {#2} } + } + +\NewDocumentCommand \includeleadsheet {sO{}m} + { + \IfBooleanF {#1} + { \leadsheets_include_external_file:nn {leadsheet} {cls} } + \leadsheets_include_leadsheet:nn {#2} {#3} + } + +\endinput + +2016/08/18 - first version 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 index 6e13b570c12..6f74b0c3614 100644 --- a/Master/texmf-dist/tex/latex/leadsheets/leadsheets.library.musejazz.code.tex +++ b/Master/texmf-dist/tex/latex/leadsheets/leadsheets.library.musejazz.code.tex @@ -5,7 +5,6 @@ % % -------------------------------------------------------------------------- % Clemens Niederberger -% Web: http://www.mychemistry.eu/forums/forum/leadsheets/ % E-Mail: contact@mychemistry.eu % -------------------------------------------------------------------------- % Copyright 2014-2016 Clemens Niederberger 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 index 02cf93aa5a8..893b69e7fd5 100644 --- a/Master/texmf-dist/tex/latex/leadsheets/leadsheets.library.musicsymbols.code.tex +++ b/Master/texmf-dist/tex/latex/leadsheets/leadsheets.library.musicsymbols.code.tex @@ -5,7 +5,6 @@ % % -------------------------------------------------------------------------- % Clemens Niederberger -% Web: http://www.mychemistry.eu/forums/forum/leadsheets/ % E-Mail: contact@mychemistry.eu % -------------------------------------------------------------------------- % Copyright 2014-2016 Clemens Niederberger @@ -22,7 +21,7 @@ % % The Current Maintainer of this work is Clemens Niederberger. % -------------------------------------------------------------------------- -\LeadsheetsLibrary{musicsymbols}{2015/07/13 musical symbols} +\LeadsheetsLibrary{musicsymbols}{2016/02/15 musical symbols} \RequirePackage{etoolbox} % define a LaTeX font that uses the `musix' font from MusiXTeX: @@ -54,7 +53,7 @@ } % define the symbols -\renewrobustcmd*\sharp {\musicsymbol[.2ex]{4}\kern-.06em} +\renewrobustcmd*\sharp {\kern.05em\musicsymbol[.2ex]{4}\kern-.05em} \renewrobustcmd*\flat {\kern-.05em\musicsymbol{2}\kern-.06em} \renewrobustcmd*\natural {\musicsymbol{6}\kern-.06em} \newrobustcmd*\doublesharp {\kern.05em\musicsymbol{5}\kern-.05em} @@ -70,6 +69,17 @@ \newrobustcmd*\eighthrest {\musicsymbol[-1.5ex]{?}\kern.5em} \newrobustcmd*\sixteenthrest {\kern.05em\musicsymbol[-1.5ex]{@}\kern.5em} +\RequirePackage{amsmath} +\newrobustcmd*\meter[2]{% + \ensuremath{% + \genfrac{}{}{0pt}{}% + {\text{\textbf{#1}}}% + {\text{\textbf{#2}}}% + }% +} + +\newrobustcmd*\Break{\ensuremath{\perp}} + \newcommand*\leadsheets@size{\f@size pt} \newlength\leadsheets@barheight @@ -89,25 +99,26 @@ \newrobustcmd*\leadsheets@repeatcolon{% \leavevmode \setlength\leadsheets@barheight\leadsheets@size - \raise.1\leadsheets@barheight\hbox{:}% + \raise.1\leadsheets@barheight\hbox{\textup{:}}% } \newrobustcmd*\leadsheets@interbar{\kern\interbarwidth\relax} -\newrobustcmd*\normalbar{% +\newrobustcmd*\leadsheets@normalbar{% \genericbar{\normalbarwidth}% } +\newrobustcmd*\normalbar{\leadsheets@normalbar} \newrobustcmd*\leftrepeat{% \leadsheets@thickbar \leadsheets@interbar - \normalbar + \leadsheets@normalbar \leadsheets@repeatcolon } \newrobustcmd*\rightrepeat{% \leadsheets@repeatcolon - \normalbar + \leadsheets@normalbar \leadsheets@interbar \leadsheets@thickbar } @@ -121,13 +132,13 @@ } \newrobustcmd*\doublebar{% - \normalbar + \leadsheets@normalbar \leadsheets@interbar - \normalbar + \leadsheets@normalbar } \newrobustcmd*\stopbar{% - \normalbar + \leadsheets@normalbar \leadsheets@interbar \leadsheets@thickbar } @@ -136,3 +147,4 @@ 2014/08/10 - initial release 2015/07/13 - scale musix font by 1.5 => else the symbols are rather small! +2016/01/15 - \Break; improvements of bars 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 index f434525a50d..1b587975dea 100644 --- a/Master/texmf-dist/tex/latex/leadsheets/leadsheets.library.properties.code.tex +++ b/Master/texmf-dist/tex/latex/leadsheets/leadsheets.library.properties.code.tex @@ -5,7 +5,6 @@ % % -------------------------------------------------------------------------- % Clemens Niederberger -% Web: http://www.mychemistry.eu/forums/forum/leadsheets/ % E-Mail: contact@mychemistry.eu % -------------------------------------------------------------------------- % Copyright 2014-2016 Clemens Niederberger @@ -22,7 +21,7 @@ % % The Current Maintainer of this work is Clemens Niederberger. % -------------------------------------------------------------------------- -\LeadsheetsExplLibrary{properties}{2014/08/10 song properties} +\LeadsheetsExplLibrary{properties}{2016/05/18 song properties} \cs_generate_variant:Nn \tl_if_eq:nnTF {x} @@ -60,6 +59,35 @@ \cs_generate_variant:Nn \leadsheets_if_property:nnT { V } \cs_generate_variant:Nn \leadsheets_if_property_p:nn { V } +\prg_new_protected_conditional:Npnn \leadsheets_if_any_property:nn #1#2 {T,F,TF} + { + \bool_set_false:N \l__leadsheets_tmpa_bool + \clist_map_inline:nn {#1} + { + \prop_if_in:cnT {l__leadsheets_songs_#2_prop} {#1} + { \bool_set_true:N \l__leadsheets_tmpa_bool } + } + \bool_if:NTF \l__leadsheets_tmpa_bool + { \prg_return_true: } + { \prg_return_false: } + } +\cs_generate_variant:Nn \leadsheets_if_any_property:nnTF {V} + +\prg_new_protected_conditional:Npnn \leadsheets_if_all_properties:nn #1#2 {T,F,TF} + { + \bool_set_false:N \l__leadsheets_tmpa_bool + \clist_map_inline:nn {#1} + { + \prop_if_in:cnTF {l__leadsheets_songs_#2_prop} {#1} + { \bool_set_true:N \l__leadsheets_tmpa_bool } + { \bool_set_false:N \l__leadsheets_tmpa_bool } + } + \bool_if:NTF \l__leadsheets_tmpa_bool + { \prg_return_true: } + { \prg_return_false: } + } +\cs_generate_variant:Nn \leadsheets_if_all_properties:nnTF {V} + \prg_new_protected_conditional:Npnn \leadsheets_if_properties_eq:nnn #1#2#3 {T,F,TF} { \tl_if_eq:xxTF @@ -171,15 +199,25 @@ \DeclareExpandableDocumentCommand \ifsongproperty {m} { \leadsheets_if_property:VnTF \l_leadsheets_current_song_id_tl {#1} } +\NewDocumentCommand \ifanysongproperty {m} + { \leadsheets_if_any_property:VnTF \l_leadsheets_current_song_id_tl {#1} } + +\NewDocumentCommand \ifallsongproperties {m} + { \leadsheets_if_all_properties: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} } +% #1: property 1 +% #2: property 2 \NewDocumentCommand \ifsongpropertyequal {mm} { \leadsheets_if_property_eq:VnnTF \l_leadsheets_current_song_id_tl {#1} {#2} } +% #1: property +% #2: tokenlist \NewDocumentCommand \definesongproperty {m} { \leadsheets_define_property:n {#1} } \@onlypreamble\definesongproperty @@ -190,3 +228,4 @@ \endinput 2015/07/05: enable usage of # in the key property +2016/05/18: new commands \ifanysongproperty and \ifallsongproperties 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 index 184db99e233..eeaa4934b76 100644 --- a/Master/texmf-dist/tex/latex/leadsheets/leadsheets.library.shorthands.code.tex +++ b/Master/texmf-dist/tex/latex/leadsheets/leadsheets.library.shorthands.code.tex @@ -5,7 +5,6 @@ % % -------------------------------------------------------------------------- % Clemens Niederberger -% Web: http://www.mychemistry.eu/forums/forum/leadsheets/ % E-Mail: contact@mychemistry.eu % -------------------------------------------------------------------------- % Copyright 2014-2016 Clemens Niederberger @@ -23,45 +22,46 @@ % The Current Maintainer of this work is Clemens Niederberger. % -------------------------------------------------------------------------- \LeadsheetsExplLibrary{shorthands} - {2014/08/10 definition and activation of shorthands} + {2016/06/29 definition and activation of shorthands} -\seq_new:N \l__leadsheets_shorthands_seq +\seq_new:N \l__leadsheets_shorthands_seq -\group_begin: -\char_set_catcode_active:N \~ - -\cs_new_protected:Npn \leadsheets_define_shorthand:Npn #1 +\cs_new_protected:Npn \leadsheets_define_shorthand:NN #1#2 { \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} + \char_set_active_eq:NN #1#2 + } + +\cs_new_protected:Npn \leadsheets_remove_shorthand:N #1 + { + \leadsheets_define_shorthand:NN #1 \c_empty_tl + \seq_remove_all:Nn \l__leadsheets_shorthands_seq {#1} + \prop_remove:Nn \l__leadsheets_shorthands_prop {#1} } -\cs_new_protected:Npn \__leadsheets_define_shorthand_aux_i:np #1#2# +\prg_new_conditional:Npnn \leadsheets_if_shorthand:N #1 {p,T,F,TF} { - \char_set_lccode:nn {`~} {`#1} - \__leadsheets_define_shorthand_aux_ii:nn {#2} + \seq_if_in:NnTF \l__leadsheets_shorthands_seq {#1} + { \prg_return_true: } + { \prg_return_false: } } -\cs_new_protected:Npn \__leadsheets_define_shorthand_aux_ii:nn #1#2 - { \tl_to_lowercase:n { \group_end: \cs_set:Npn ~ } #1 {#2} } +\cs_new_protected:Npn \leadsheets_for_all_shorthands_do:n #1 + { \seq_map_inline:Nn \l__leadsheets_shorthands_seq {#1} } -\group_end: +\cs_new_protected:Npn \leadsheets_activate_shorthand:N #1 + { \leadsheets_if_shorthand:NT #1 { \char_set_catcode_active:N #1 } } \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 } - } - } + { \tl_map_inline:nn {#1} { \leadsheets_activate_shorthand:N ##1 } } \cs_new_protected:Npn \leadsheets_activate_all_shorthands: { - \seq_map_inline:Nn \l__leadsheets_shorthands_seq - { \char_set_catcode_active:N ##1 } + \leadsheets_for_all_shorthands_do:n + { \leadsheets_activate_shorthand:N ##1 } } \endinput +2016/06/29 - breaking change: \leadsheets_define_shorthand:Npn is now + \leadsheets_define_shorthand:NN 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 index 63e3fc12832..546c36b43d6 100644 --- a/Master/texmf-dist/tex/latex/leadsheets/leadsheets.library.songs.code.tex +++ b/Master/texmf-dist/tex/latex/leadsheets/leadsheets.library.songs.code.tex @@ -5,7 +5,6 @@ % % -------------------------------------------------------------------------- % Clemens Niederberger -% Web: http://www.mychemistry.eu/forums/forum/leadsheets/ % E-Mail: contact@mychemistry.eu % -------------------------------------------------------------------------- % Copyright 2014-2016 Clemens Niederberger @@ -22,7 +21,7 @@ % % The Current Maintainer of this work is Clemens Niederberger. % -------------------------------------------------------------------------- -\LeadsheetsExplLibrary{songs}{2016/02/02 typesetting songs} +\LeadsheetsExplLibrary{songs}{2016/07/02 typesetting songs} % -------------------------------------------------------------------------- % messages: @@ -45,6 +44,12 @@ transposing~ mechanism~ \msg_line_context: } +\msg_new:nnn {leadsheets} {verse-exists} + { + The~ verse~ type~ `#1'~ you~ are~ about~ to~ define~ \msg_line_context: + \c_space_tl already~ exists. + } + % -------------------------------------------------------------------------- % variables: \tl_const:Nn \c_leadsheets_sharp_tl {sharp} @@ -74,6 +79,7 @@ \bool_new:N \l__leadsheets_obey_lines_bool \bool_new:N \l__leadsheets_bar_shorthands_bool \bool_new:N \l__leadsheets_measuring_bool +\bool_new:N \l__leadsheets_disable_measuring_bool \bool_new:N \l__leadsheets_recall_verse_type_bool \clist_new:N \l__leadsheets_print_tags_clist @@ -105,9 +111,7 @@ % -------------------------------------------------------------------------- % define shorthands -\leadsheets_define_shorthand:Npn ^ {\leadsheets_remember_or_recall_chords:w} -\leadsheets_define_shorthand:Npn _ {\writechord} -\leadsheets_define_shorthand:Npn | #1 +\cs_new_protected:Npn \leadsheets_bar:w #1 { \str_case:nnF {#1} { @@ -123,7 +127,7 @@ {\doublebar} } -\leadsheets_define_shorthand:Npn : +\cs_new_protected:Npn \leadsheets_bar_repeat: { \peek_charcode_remove:NTF | {\__leadsheets_checkrepeat:} @@ -136,6 +140,11 @@ {\rightrepeat} } +\leadsheets_define_shorthand:NN ^ \getorprintchord +\leadsheets_define_shorthand:NN _ \writechord +\leadsheets_define_shorthand:NN | \leadsheets_bar:w +\leadsheets_define_shorthand:NN : \leadsheets_bar_repeat: + % -------------------------------------------------------------------------- % the `song' environment: \NewDocumentEnvironment {song} { O{} } @@ -213,30 +222,30 @@ % -------------------------------------------------------------------------- % 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} +\leadsheets_define_property:n {title} +\leadsheets_define_property:n {subtitle} +\leadsheets_define_property:n {short-title} +\leadsheets_define_property:n {sort-title} +\leadsheets_define_property:n {sort-short-title} +\leadsheets_define_property:n {composer} +\leadsheets_define_property:n {sort-composer} +\leadsheets_define_property:n {music} +\leadsheets_define_property:n {sort-music} +\leadsheets_define_property:n {lyrics} +\leadsheets_define_property:n {sort-lyrics} +\leadsheets_define_property:n {arr} +\leadsheets_define_property:n {sort-arr} +\leadsheets_define_property:n {band} +\leadsheets_define_property:n {sort-band} +\leadsheets_define_property:n {genre} +\leadsheets_define_property:n {interpret} +\leadsheets_define_property:n {sort-interpret} +\leadsheets_define_property:n {key} +\leadsheets_define_property:n {capo} +\leadsheets_define_property:n {tempo} +\leadsheets_define_property:n {tags} +\leadsheets_define_property:n {counter} +\leadsheets_define_property:n {ID} % properties that should take the value of another property if they're not set % explicitly: @@ -282,8 +291,8 @@ \tl_set:Nn \l_leadsheets_current_song_id_tl {#1} \tl_put_right:Nn \l__leadsheets_song_body_tl { - \leadsheets_songtitle: - \leadsheets_check_capo: + \__leadsheets_check_capo: + \__leadsheets_songtitle: \tl_use:N \l__leadsheets_songtext_format_tl } \tl_put_right:NV \l__leadsheets_song_body_tl @@ -315,10 +324,9 @@ } } -\cs_new:Npn \leadsheets_end_song:n #1 +\cs_new_protected:Npn \leadsheets_end_song:n #1 { - \bool_set_true:N \l__leadsheets_measuring_bool - \leadsheets_reset_counters: + \__leadsheets_start_measuring:nw {#1} \tl_put_left:NV \l__leadsheets_song_body_tl \l__leadsheets_song_pre_hook_tl \tl_put_right:NV \l__leadsheets_song_body_tl @@ -334,15 +342,43 @@ } pt } - \bool_set_false:N \l__leadsheets_measuring_bool - \leadsheets_reset_counters: + \__leadsheets_stop_measuring: \tl_use:N \l__leadsheets_song_body_tl } +\cs_new_protected:Npn \__leadsheets_save_macro:N #1 + { \cs_set_eq:cN { __leadsheets_ \cs_to_str:N #1 } #1 } + +\cs_new_protected:Npn \__leadsheets_restore_macro:N #1 + { + \cs_set_eq:Nc #1 { __leadsheets_ \cs_to_str:N #1 } + \cs_undefine:c { __leadsheets_ \cs_to_str:N #1 } + } + +\cs_new_protected:Npn \__leadsheets_start_measuring:nw #1#2 \__leadsheets_stop_measuring: + { + \bool_if:NF \l__leadsheets_disable_measuring_bool + { \bool_set_true:N \l__leadsheets_measuring_bool } + \bool_if:NTF \l__leadsheets_measuring_bool + { + \__leadsheets_save_macro:N \if@filesw + \__leadsheets_reset_counters: \@fileswfalse #2 + \__leadsheets_restore_macro:N \if@filesw + } + { \leadsheets_set_property:nnn {#1} {height} {0pt} } + \__leadsheets_stop_measuring: + } + +\cs_new_protected:Npn \__leadsheets_stop_measuring: + { + \bool_set_false:N \l__leadsheets_measuring_bool + \__leadsheets_reset_counters: + } + \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: +\cs_new_protected:Npn \__leadsheets_reset_counters: { \seq_map_inline:Nn \l__leadsheets_reset_counters_seq { \setcounter {##1} {0} } @@ -394,13 +430,6 @@ { \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} @@ -458,7 +487,7 @@ % -------------------------------------------------------------------------- % capo settings: -\cs_new_protected:Npn \leadsheets_check_capo: +\cs_new_protected:Npn \__leadsheets_check_capo: { \leadsheets_if_property:VnTF \l_leadsheets_current_song_id_tl {capo} { @@ -475,7 +504,7 @@ } } -\cs_new:Npn \leadsheets_capo_number_print:n #1 {#1.} +\cs_new_protected:Npn \leadsheets_capo_number_print:n #1 {#1.} \cs_new_protected:Npn \leadsheets_capo: { @@ -539,21 +568,37 @@ \ignorespacesafterend } -\cs_new_protected:Npn \leadsheets_new_verse_type:Nnn #1#2#3 +\seq_new:N \l__leadsheets_verse_types_seq + +\prg_new_conditional:Npnn \leadsheets_if_verse_type_exist:n #1 {p,T,F,TF} + { + \seq_if_in:NnTF \l__leadsheets_verse_types_seq {#1} + { \prg_return_true: } + { \prg_return_false: } + } + +% #1: boolean +% #2: name +% #3: options +\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} + \seq_put_right:Nn \l__leadsheets_verse_types_seq {#2} + \clist_map_inline:nn {empty,numbered,named} + { + \bool_if_exist:cF {l__leadsheets_#2_##1_bool} + { \bool_new:c {l__leadsheets_#2_##1_bool} } + } \bool_set_true:c {l__leadsheets_#2_named_bool} - \bool_if:NTF #1 + \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_class_tl} - \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} + \clist_map_inline:nn {class,format,template,label_format,after_label} + { + \tl_if_exist:cF {l__leadsheets_#2_##1_tl} + { \tl_new:c {l__leadsheets_#2_##1_tl} } + } + \cs_if_exist:cF {the#2} + { \newcounter {#2} } \leadsheets_add_to_reset:n {#2} \tl_set:cn {the#2} { \arabic {#2} . } \keys_define:nn {leadsheets/#2} @@ -578,8 +623,8 @@ \tl_set:Nn \l__leadsheets_recall_verse_type_tl {##1} \bool_set_true:N \l__leadsheets_recall_verse_type_bool , name .code:n = - \@trnslt@declare@translation {leadsheets/#2} {fallback} {##1} - \@trnslt@declare@translation {leadsheets/#2} {English} {##1} + \leadsheets_declare_translation:nnn {fallback} {#2} {##1} + \leadsheets_declare_translation:nnn {English} {#2} {##1} } \NewDocumentEnvironment {#2} {O{}} { @@ -603,9 +648,6 @@ { \seq_gclear:N \g__leadsheets_chords_sequences_seq } \leadsheets_if_recall_chords:T { - % \prop_show:N \g__leadsheets_chords_sequences_prop - % \tl_show:N \l__leadsheets_recall_verse_type_tl - % \seq_show:N \g__leadsheets_chords_sequences_seq \prop_get:NVN \g__leadsheets_chords_sequences_prop \l__leadsheets_recall_verse_type_tl @@ -627,28 +669,50 @@ \leadsheets_verse_end:n {#2} \par } - \@trnslt@declare@translation {leadsheets/#2} {fallback} {} - \@trnslt@declare@translation {leadsheets/#2} {English} {} + \leadsheets_declare_translation:nnn {fallback} {#2} {} + \leadsheets_declare_translation:nnn {English} {#2} {} \keys_set:nn {leadsheets/#2} {#3} } +% #1: boolean +% #2: name +% #3: options +\cs_new_protected:Npn \leadsheets_new_verse_type:nnn #1#2#3 + { + \leadsheets_if_verse_type_exist:nTF {#2} + { \msg_error:nnn {leadsheets} {verse-exists} {#2} } + { \__leadsheets_new_verse_type:nnn {#1} {#2} {#3} } + } + +% #1: boolean +% #2: name +% #3: options +\cs_new_protected:Npn \leadsheets_provide_verse_type:nnn #1#2#3 + { + \leadsheets_if_verse_type_exist:nF {#2} + { \__leadsheets_new_verse_type:nnn {#1} {#2} {#3} } + } + \NewDocumentCommand \newversetype {smO{}} - { \leadsheets_new_verse_type:Nnn #1 {#2} {#3} } + { \leadsheets_new_verse_type:nnn {#1} {#2} {#3} } + +\NewDocumentCommand \provideversetype {smO{}} + { \leadsheets_provide_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*{verse*} [ name=Verse ] \newversetype {chorus} [ name=Chorus ] -\newversetype*{chorus*} +\newversetype*{chorus*} [ name=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 ] \newversetype {solo} [ name=Solo ] % -------------------------------------------------------------------------- @@ -669,41 +733,47 @@ % -------------------------------------------------------------------------- -\keys_define:nn { leadsheets } +\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 = + 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 = + 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 , - verses-default-class .tl_set:N = \l__leadsheets_verses_default_class_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 = + 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 , + verses-default-class .tl_set:N = \l__leadsheets_verses_default_class_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 , + bar-shortcuts .initial:n = true , + 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 = + 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. , - before-song .tl_set:N = \l__leadsheets_song_pre_hook_tl , - after-song .tl_set:N = \l__leadsheets_song_post_hook_tl , - after-title .tl_set:N = \l__leadsheets_song_mid_hook_tl , - add-to-reset .code:n = - \clist_map_inline:nn {#1} { \leadsheets_add_to_reset:n {##1} } + capo-nr .initial:n = #1. , + before-song .tl_set:N = \l__leadsheets_song_pre_hook_tl , + after-song .tl_set:N = \l__leadsheets_song_post_hook_tl , + after-title .tl_set:N = \l__leadsheets_song_mid_hook_tl , + add-to-reset .code:n = + \clist_map_inline:nn {#1} { \leadsheets_add_to_reset:n {##1} } , + print-tags .code:n = + \bool_set_true:N \l__leadsheets_print_selected_bool + \clist_set:Nn \l__leadsheets_print_tags_clist {#1} , + disable-measuring .bool_set:N = \l__leadsheets_disable_measuring_bool , + disable-measuring .initial:n = false } \endinput @@ -713,3 +783,9 @@ 2015/07/27: new options `before-song', `after-song', `after-title' and `add-to-reset' 2015/02/02: enable to recall chords even if verse is used the first time +2016/05/18: new option `disable-measuring' + set \@fileswfalse during the measuring phase + if measuring is disabled the `height' property is set to 0pt +2016/06/29: - adapt to changed shorthand library + - activate bar-shortcuts per default +2016/07/02: fix issue when \capo is used in a title template 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 index bb6e2b98639..c4b908ff6ae 100644 --- a/Master/texmf-dist/tex/latex/leadsheets/leadsheets.library.templates.code.tex +++ b/Master/texmf-dist/tex/latex/leadsheets/leadsheets.library.templates.code.tex @@ -5,7 +5,6 @@ % % -------------------------------------------------------------------------- % Clemens Niederberger -% Web: http://www.mychemistry.eu/forums/forum/leadsheets/ % E-Mail: contact@mychemistry.eu % -------------------------------------------------------------------------- % Copyright 2014-2016 Clemens Niederberger @@ -31,11 +30,11 @@ \tl_new:N \l__leadsheets_songtitle_template_tl \prop_new:N \l__leadsheets_songtitle_template_prop -\NewDocumentCommand \songtitle {} { \leadsheets_songtitle: } +% \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 +\cs_new_protected:Npn \__leadsheets_needspace:n #1 { \group_begin: \dim_set:Nn \l__leadsheets_tmpa_dim { #1 } @@ -49,13 +48,13 @@ \group_end: } -\cs_new_protected:Npn \leadsheets_songtitle: +\cs_new_protected:Npn \__leadsheets_songtitle: { - \leadsheets_use_songtitle_template:V \l__leadsheets_songtitle_template_tl - \leadsheets_needspace:n { 3\baselineskip } + \__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 +\cs_new_protected:Npn \__leadsheets_use_songtitle_template:n #1 { \prop_get:NnNTF \l__leadsheets_songtitle_template_prop {#1} @@ -63,7 +62,7 @@ { \l__leadsheets_tmpa_tl } { \msg_error:nnnn {leadsheets} {unknown-template} {songtitle} {#1} } } -\cs_generate_variant:Nn \leadsheets_use_songtitle_template:n { V } +\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} } 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 index 83726462dfe..b3cb9bc52a5 100644 --- a/Master/texmf-dist/tex/latex/leadsheets/leadsheets.library.translations.code.tex +++ b/Master/texmf-dist/tex/latex/leadsheets/leadsheets.library.translations.code.tex @@ -5,7 +5,6 @@ % % -------------------------------------------------------------------------- % Clemens Niederberger -% Web: http://www.mychemistry.eu/forums/forum/leadsheets/ % E-Mail: contact@mychemistry.eu % -------------------------------------------------------------------------- % Copyright 2014-2016 Clemens Niederberger @@ -22,48 +21,62 @@ % % The Current Maintainer of this work is Clemens Niederberger. % -------------------------------------------------------------------------- -\LeadsheetsExplLibrary{translations}{2014/08/10 dictionary for leadsheets} +\LeadsheetsExplLibrary{translations}{2016/06/28 dictionary for leadsheets} \cs_new:Npn \leadsheets_translation:n #1 - { \GetTranslation{leadsheets/#1} } + { \GetTranslation {leadsheets/#1} } \cs_generate_variant:Nn \leadsheets_translation:n { V } -\DeclareTranslation {German} {leadsheets/chorus} {Refrain} -\DeclareTranslation {German} {leadsheets/verse} {Strophe} +\cs_new_protected:Npn \leadsheets_declare_translation:nnn #1#2#3 + { \declaretranslation {#1} {leadsheets/#2} {#3} } +\cs_generate_variant:Nn \leadsheets_translation:n { V } + +\NewDocumentCommand \defleadsheetstranslation {mmm} + { \leadsheets_declare_translation:nnn {#1} {#2} {#3} } -\DeclareTranslationFallback {leadsheets/composer} {Composer} -\DeclareTranslation {English} {leadsheets/composer} {Composer} -\DeclareTranslation {German} {leadsheets/composer} {Komponist} +\DeclareExpandableDocumentCommand \leadsheetstranslate {m} + { \leadsheets_translation:n {#1} } -\DeclareTranslationFallback {leadsheets/lyrics} {Lyrics} -\DeclareTranslation {English} {leadsheets/lyrics} {Lyrics} -\DeclareTranslation {German} {leadsheets/lyrics} {Text} +\leadsheets_declare_translation:nnn {German} {chorus} {Refrain} +\leadsheets_declare_translation:nnn {German} {verse} {Strophe} -\DeclareTranslationFallback {leadsheets/key} {Key} -\DeclareTranslation {English} {leadsheets/key} {Key} -\DeclareTranslation {German} {leadsheets/key} {Tonart} +\leadsheets_declare_translation:nnn {Fallback} {composer} {composer} +\leadsheets_declare_translation:nnn {English} {composer} {composer} +\leadsheets_declare_translation:nnn {German} {composer} {Komponist} -\DeclareTranslationFallback {leadsheets/interpret} +\leadsheets_declare_translation:nnn {Fallback} {lyrics} {lyrics} +\leadsheets_declare_translation:nnn {English} {lyrics} {lyrics} +\leadsheets_declare_translation:nnn {German} {lyrics} {Text} + +\leadsheets_declare_translation:nnn {Fallback} {key} {key} +\leadsheets_declare_translation:nnn {English} {key} {key} +\leadsheets_declare_translation:nnn {German} {key} {Tonart} + +\leadsheets_declare_translation:nnn {Fallback} {interpret} {as~ interpreted~ by~ \printsongpropertylist{interpret}{~\&~}{,~}{~\&~}} -\DeclareTranslation {English} {leadsheets/interpret} +\leadsheets_declare_translation:nnn {English} {interpret} {as~ interpreted~ by~ \printsongpropertylist{interpret}{~\&~}{,~}{~\&~}} -\DeclareTranslation {German} {leadsheets/interpret} +\leadsheets_declare_translation:nnn {German} {interpret} {wie~ von~ \printsongpropertylist{interpret}{~\&~}{,~}{~\&~}~ interpretiert} -\DeclareTranslationFallback {leadsheets/major} {major} -\DeclareTranslation {English} {leadsheets/major} {major} -\DeclareTranslation {German} {leadsheets/major} {Dur} +\leadsheets_declare_translation:nnn {Fallback} {major} {major} +\leadsheets_declare_translation:nnn {English} {major} {major} +\leadsheets_declare_translation:nnn {German} {major} {Dur} + +\leadsheets_declare_translation:nnn {Fallback} {minor} {minor} +\leadsheets_declare_translation:nnn {English} {minor} {minor} +\leadsheets_declare_translation:nnn {German} {minor} {Moll} -\DeclareTranslationFallback {leadsheets/minor} {minor} -\DeclareTranslation {English} {leadsheets/minor} {minor} -\DeclareTranslation {German} {leadsheets/minor} {Moll} +\leadsheets_declare_translation:nnn {Fallback} {capo} {capo} +\leadsheets_declare_translation:nnn {English} {capo} {capo} +\leadsheets_declare_translation:nnn {German} {capo} {Kapo} -\DeclareTranslationFallback {leadsheets/capo} {Capo} -\DeclareTranslation {English} {leadsheets/capo} {Capo} -\DeclareTranslation {German} {leadsheets/capo} {Kapo} +\leadsheets_declare_translation:nnn {Fallback} {fret} {fret} +\leadsheets_declare_translation:nnn {English} {fret} {fret} +\leadsheets_declare_translation:nnn {German} {fret} {Bund} -\DeclareTranslationFallback {leadsheets/fret} {fret} -\DeclareTranslation {English} {leadsheets/fret} {fret} -\DeclareTranslation {German} {leadsheets/fret} {Bund} +\tex_endinput:D -\endinput +2014/08/10: first version +2016/05/18: new command: \leadsheets_declare_translation:nnn +2016/06/28: new commands \leadsheetstranslate, \defleadsheetstranslation 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 index eaacc95f3f9..627728194db 100644 --- a/Master/texmf-dist/tex/latex/leadsheets/leadsheets.library.transposing.code.tex +++ b/Master/texmf-dist/tex/latex/leadsheets/leadsheets.library.transposing.code.tex @@ -5,7 +5,6 @@ % % -------------------------------------------------------------------------- % Clemens Niederberger -% Web: http://www.mychemistry.eu/forums/forum/leadsheets/ % E-Mail: contact@mychemistry.eu % -------------------------------------------------------------------------- % Copyright 2014-2016 Clemens Niederberger diff --git a/Master/texmf-dist/tex/latex/leadsheets/leadsheets.sty b/Master/texmf-dist/tex/latex/leadsheets/leadsheets.sty index 21dcd6f1078..fd6bd689700 100644 --- a/Master/texmf-dist/tex/latex/leadsheets/leadsheets.sty +++ b/Master/texmf-dist/tex/latex/leadsheets/leadsheets.sty @@ -5,7 +5,6 @@ % % -------------------------------------------------------------------------- % Clemens Niederberger -% Web: http://www.mychemistry.eu/forums/forum/leadsheets/ % E-Mail: contact@mychemistry.eu % -------------------------------------------------------------------------- % Copyright 2014-2016 Clemens Niederberger @@ -28,15 +27,15 @@ % -------------------------------------------------------------------------- % package information: \ExplSyntaxOn -\tl_const:Nn \c_leadsheets_date_tl {2016/02/02} -\tl_const:Nn \c_leadsheets_version_tl {0.3a} -\tl_const:Nn \c_leadsheets_info_tl {Typesetting leadsheets and songbooks} +\tl_const:Nn \leadsheetsdate {2016/08/18} +\tl_const:Nn \leadsheetsversion {0.5} +\tl_const:Nn \leadsheetsinfo {Typesetting leadsheets and songbooks} \ProvidesExplPackage {leadsheets} - {\c_leadsheets_date_tl} - {\c_leadsheets_version_tl} - {\c_leadsheets_info_tl \c_space_tl (CN)} + {\leadsheetsdate} + {\leadsheetsversion} + {\leadsheetsinfo \c_space_tl (CN)} % -------------------------------------------------------------------------- % messages: @@ -72,15 +71,54 @@ \tl_new:N \l__leadsheets_tmpb_tl \tl_new:N \l__leadsheets_tmpc_tl \tl_new:N \l__leadsheets_tmpd_tl +\tl_new:N \g__leadsheets_tmpa_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 +% -------------------------------------------------------------------------- +\prg_new_conditional:Npnn \leadsheets_if_package_loaded:n #1 {p,T,F,TF} + { + \cs_if_exist:cTF {ver@#1.sty} + { \prg_return_true: } + { \prg_return_false: } + } + +\DeclareExpandableDocumentCommand \leadsheetsifpackageloaded {m} + { \leadsheets_if_package_loaded:nTF {#1} } + +% % -------------------------------------------------------------------------- +% \seq_new:N \l__leadsheets_safed_commands_seq + +% \cs_new_protected:Npn \leadsheets_safe_define_protected:Npn #1 +% { +% \seq_if_in:NnTF \l__leadsheets_safed_commands_seq {#1} +% {} % error +% { +% \seq_gput_right:Nn \l__leadsheets_safed_commands_seq {#1} +% \cs_gset_eq:cN {__leadsheets_ \cs_to_str:N #1:} #1 +% \cs_set_protected:Npn #1 +% } +% } + +% \cs_new_protected:Npn \leadsheets_restore:N #1 +% { +% \seq_if_in:NnTF \l__leadsheets_safed_commands_seq {#1} +% { \cs_set_eq:Nc #1 {__leadsheets_ \cs_to_str:N #1:} } +% {} % error +% \seq_gremove_all:Nn \l__leadsheets_safed_commands_seq {#1} +% } + % -------------------------------------------------------------------------- % library mechanism: \tl_const:Nn \c__leadsheets_library_extension_tl {code.tex} @@ -95,9 +133,19 @@ \__leadsheets_load_library:V \l__leadsheets_tmpa_tl } +\prg_new_conditional:Npnn \leadsheets_if_library:n #1 {p,T,F,TF} + { + \cs_if_exist:cTF {leadsheets-library-#1-loaded} + { \prg_return_true: } + { \prg_return_false: } + } + +\DeclareExpandableDocumentCommand \leadsheetsiflibrary {m} + { \leadsheets_if_library:nTF {#1} } + \cs_new_protected:Npn \__leadsheets_load_library:n #1 { - \cs_if_exist:cF {leadsheets-library-#1-loaded} + \leadsheets_if_library:nF {#1} { \file_if_exist:nTF {\c__leadsheets_library_prefix_tl.#1.\c__leadsheets_library_extension_tl} @@ -118,14 +166,17 @@ \ProvidesFile {\c__leadsheets_library_prefix_tl.#1.\c__leadsheets_library_extension_tl} [ - \c_leadsheets_date_tl + \leadsheetsdate \c_space_tl - v \c_leadsheets_version_tl + v \leadsheetsversion \c_space_tl leadsheets~ library~ `#1'~ #2 ] } +% +\cs_new:Npn \LeadsheetSurvive #1 \LeadsheetEndSurvive {#1} + % -------------------------------------------------------------------------- % one of those defines a leadsheets library, either using expl syntax or 2e % package syntax: @@ -166,6 +217,9 @@ songs .code:n = \bool_set_true:N \l__leadsheets_with_options_bool \leadsheets_load_library:n {songs} , + external .code:n = + \bool_set_true:N \l__leadsheets_with_options_bool + \leadsheets_load_library:n {external} , minimal .code:n = \bool_set_true:N \l__leadsheets_with_options_bool , full .code:n = @@ -180,7 +234,8 @@ properties , transposing , templates , - translations + translations , + external } } \ProcessKeysOptions{leadsheets} @@ -188,7 +243,12 @@ \bool_if:NF \l__leadsheets_with_options_bool { \leadsheets_load_library:n {songs} } - % -------------------------------------------------------------------------- \tex_endinput:D +2016/08/18 - new commands: \leadsheetsifpackageloaded, \leadsheetsiflibrary + - new class `leadsheet' + - new library `external' + - minor chords can now be typeset with lowercase letters + (chordnames) + -- cgit v1.2.3