texlive[66704] Master: songproj (28mar23)

commits+karl at tug.org commits+karl at tug.org
Wed Mar 29 22:00:16 CEST 2023


Revision: 66704
          http://tug.org/svn/texlive?view=revision&revision=66704
Author:   karl
Date:     2023-03-29 22:00:15 +0200 (Wed, 29 Mar 2023)
Log Message:
-----------
songproj (28mar23)

Modified Paths:
--------------
    trunk/Master/texmf-dist/doc/latex/songproj/song2tex.py
    trunk/Master/texmf-dist/doc/latex/songproj/songproj.pdf
    trunk/Master/texmf-dist/source/latex/songproj/Makefile
    trunk/Master/texmf-dist/source/latex/songproj/songproj.dtx
    trunk/Master/texmf-dist/tex/latex/songproj/songproj.sty
    trunk/Master/tlpkg/libexec/ctan2tds

Modified: trunk/Master/texmf-dist/doc/latex/songproj/song2tex.py
===================================================================
--- trunk/Master/texmf-dist/doc/latex/songproj/song2tex.py	2023-03-29 19:58:32 UTC (rev 66703)
+++ trunk/Master/texmf-dist/doc/latex/songproj/song2tex.py	2023-03-29 20:00:15 UTC (rev 66704)
@@ -8,6 +8,7 @@
 # The following regexp match the typical markers of refrain and couplet:
 re_refrain = re.compile(r'(R(efrain)?|C(horus)?)( |[-./] ?)', re.IGNORECASE)
 re_couplet = re.compile(r'\d+( |[-./] ?)')
+re_txt_ext = re.compile(r'\.te?xt$')
 
 
 def match_rest(regexp, s):
@@ -41,35 +42,35 @@
                 yield '\\begin{refrain}\n'
                 state = State.REFRAIN
                 line = rest
-                yield '  {} \\\\\n'.format(line)
+                yield '  {}'.format(line)
             elif (rest := match_rest(re_couplet, line)) is not None:
                 # when a couplet start marker is found, enter a couplet.
                 yield '\\begin{couplet}\n'
                 state = State.COUPLET
                 line = rest
-                yield '  {} \\\\\n'.format(line)
+                yield '  {}'.format(line)
             elif line != '':
                 # when a non-empty line is found, also enter a couplet as all.
                 yield '\\begin{couplet}\n'
                 state = State.COUPLET
-                yield '  {} \\\\\n'.format(line)
+                yield '  {}'.format(line)
         elif state == State.REFRAIN:
             # We are in the refrain. Depending on what we find:
             if line != '':
                 # when a non-empty line is found, stay in the refrain.
-                yield '  {} \\\\\n'.format(line)
+                yield ' \\\\\n  {}'.format(line)
             else:
                 # when an empty line is found, leave the refrain.
-                yield '\\end{refrain}\n\n'
+                yield '\n\\end{refrain}\n\n'
                 state = State.LIMBO
         elif state == State.COUPLET:
             # We are in a couplet. Depending on what we find:
             if line != '':
                 # when a non-empty line is found, stay in the couplet.
-                yield '  {} \\\\\n'.format(line)
+                yield ' \\\\\n  {}'.format(line)
             else:
                 # when an empty line is found, leave the couplet.
-                yield '\\end{couplet}\n\n'
+                yield '\n\\end{couplet}\n\n'
                 state = State.LIMBO
         # No matter what we found, we have a song line, possibly empty, that we
         # have to check to see if it could not be the new longest line seen so far.
@@ -78,9 +79,9 @@
     # The song text file is now finished. We may still be in the refrain or in a
     # couplet, that we have to close.
     if state == State.REFRAIN:
-        yield '\\end{refrain}\n\n'
+        yield '\n\\end{refrain}\n\n'
     elif state == State.COUPLET:
-        yield '\\end{couplet}\n\n'
+        yield '\n\\end{couplet}\n\n'
     # Now print the longest line of the entire song.
     yield '\\longest{{{}}}\n'.format(longest)
 
@@ -92,8 +93,13 @@
     parser.add_argument("--couplet", '-c', type=re.compile, default=re_couplet, metavar="REGEXP",
             help="specify the couplet marker (regexp, default \"{}\")".format(re_couplet.pattern))
     parser.add_argument("infile", help="input song text file", type=argparse.FileType('r'))
-    parser.add_argument("outfile", help="output LaTeX file", type=argparse.FileType('w'))
+    parser.add_argument("outfile", help="output LaTeX file", type=argparse.FileType('w'), nargs='?')
     args = parser.parse_args(args)
+    if args.outfile is None:
+        try:
+            args.outfile = open(re_txt_ext.sub('', args.infile.name) + '.tex', 'w')
+        except AttributeError:
+            parser.error("the following argument is required: outfile")
     for line in parse_song(args.infile, args.refrain, args.couplet):
         args.outfile.write(line)
 

Modified: trunk/Master/texmf-dist/doc/latex/songproj/songproj.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/source/latex/songproj/Makefile
===================================================================
--- trunk/Master/texmf-dist/source/latex/songproj/Makefile	2023-03-29 19:58:32 UTC (rev 66703)
+++ trunk/Master/texmf-dist/source/latex/songproj/Makefile	2023-03-29 20:00:15 UTC (rev 66704)
@@ -22,10 +22,12 @@
 mostlyclean:
 	rm -f *.aux *.glo *.gls *.hd *.idx *.ilg *.ind *.log *.out
 
+ctanclean: mostlyclean
+	rm -f *.sty
+
 clean: mostlyclean
 	rm -f *.pdf
 
-maintainer-clean: clean
-	rm -f *.sty
+maintainer-clean: ctanclean clean
 
-.PHONY: all sty doc mostlyclean clean maintainer-clean
+.PHONY: all sty doc mostlyclean ctanclean clean maintainer-clean

Modified: trunk/Master/texmf-dist/source/latex/songproj/songproj.dtx
===================================================================
--- trunk/Master/texmf-dist/source/latex/songproj/songproj.dtx	2023-03-29 19:58:32 UTC (rev 66703)
+++ trunk/Master/texmf-dist/source/latex/songproj/songproj.dtx	2023-03-29 20:00:15 UTC (rev 66704)
@@ -34,7 +34,7 @@
 %<package>\NeedsTeXFormat{LaTeX2e}[2020/10/01]
 %<package>\ProvidesPackage{songproj}
 %<*package>
-    [2022/11/07 v1.0.1 Song projection]
+    [2023/03/29 v1.2.0 Song projection]
 %</package>
 %
 %<*driver>
@@ -52,7 +52,7 @@
 %</driver>
 % \fi
 %
-% \CheckSum{256}
+% \CheckSum{269}
 %
 % \CharacterTable
 %  {Upper-case    \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
@@ -75,6 +75,8 @@
 % \changes{v0.3.0}{2021/09/26}{Use \textsf{expl3} naming conventions}
 % \changes{v1.0.0}{2021/11/07}{First public release}
 % \changes{v1.0.1}{2021/11/07}{Add the generated extension file to Git}
+% \changes{v1.1.0}{2023/03/27}{Allow couplet numbering with \cs{numbercouplets}}
+% \changes{v1.2.0}{2023/03/29}{Allow couplet numbering with \cs{inputsong*}}
 %
 % \GetFileInfo{songproj.dtx}
 %
@@ -147,6 +149,16 @@
 % is only used to compute and record its length, and will not be typeset.
 % \end{function}
 %
+% \changes{v1.1.0}{2023/03/27}{Document the \cs{numbercouplets} command}
+% \begin{function}{\numbercouplets}
+% \label{doc-cs-numbercouplets}
+% Inside a \env{song} environment, the \cs{numbercouplets} command can be used
+% to enable couplet numbering. This can be useful when specific couplets have
+% been selected but the lead singer has a score a lyrics sheet that includes
+% all of them: indicating the couplet numbers in the projection will allow them
+% to check which couplet to sing.
+% \end{function}
+%
 % \changes{v0.4.0}{2021/09/29}{Document \env{intro} and \env{final} environments}
 %
 % \paragraph{}
@@ -215,10 +227,12 @@
 %
 % \subsection{The \cs{inputsong} command}
 % \changes{v1.0.0}{2021/11/07}{Document the \cs{inputsong} command}
+% \changes{v1.2.0}{2023/03/29}{Document the \cs{inputsong*} command}
 %
-% \begin{function}{\inputsong}
+% \begin{function}{\inputsong, \inputsong*}
 % \begin{syntax}
 % \cs{inputsong}\marg{file}\marg{stanzas per slide}\oarg{couplet list}
+% \cs{inputsong*}\marg{file}\marg{stanzas per slide}\oarg{couplet list}
 % \end{syntax}
 %
 % The \cs{inputsong} command environment is used as a shortcut for
@@ -235,6 +249,9 @@
 % \end{verbatim}
 % \end{function}
 %
+% The starred version \cs{inputsong*} enables couplet numbering, as described
+% in \ref{doc-cs-numbercouplets}.
+%
 % \subsection{The \env{refrain}, \env{couplet}, \env{intro} and \env{final} environments}
 %
 % \changes{v0.4.0}{2021/09/29}{Document \env{intro} and \env{final} environments}
@@ -293,6 +310,7 @@
 % \end{verbatim}
 %
 % \subsubsection{Importing text lyrics}
+% \changes{v1.1.0}{2023/03/27}{Derivate output file name from input file name if not specified}
 %
 % Song lyrics are often found in text format with basic markup:
 %
@@ -391,6 +409,8 @@
 %
 % \changes{v0.2.0}{2021/09/23}{Use \texttt{sp} prefix for functions and
 %   variables}
+% \changes{v1.1.0}{2023/03/27}{Add the \cs{g__sp_show_numbers_bool} variable to
+%   number or not couplets}
 %
 % We define a number of internal variables, that are used when reading and
 % formatting a song. All of these variables are meant to be set globally: since
@@ -402,6 +422,7 @@
 \bool_new:N \g__sp_song_start_bool       % are we at the start of a song?
 \bool_new:N \g__sp_refrain_first_bool    % does current song start with the
                                          % refrain?
+\bool_new:N \g__sp_show_numbers_bool     % should we show the couplet numbers?
 \int_new:N  \g__sp_stanzas_per_slide_int % number of stanzas to show on each
                                          % slide (1 or 2)
 \dim_new:N  \g__sp_linewidth_dim         % length of the longest line in current
@@ -500,8 +521,9 @@
 % \end{macro}
 %
 % \begin{macro}{\__sp_song_couplet:n}
+% \changes{v1.1.0}{2023/03/27}{Print the couplet number when requested}
 %
-% This macro uses the \env{__sp_couplet} environment to a specified couplet of
+% This macro uses the \env{__sp_couplet} environment to format a specified couplet of
 % the current song. It takes a single argument:
 %
 % \begin{arguments}
@@ -515,6 +537,9 @@
     \dim_compare:nNnTF \g__sp_linewidth_dim {=} {0pt}
       { \begin{__sp_couplet} }
       { \begin{__sp_couplet} [\g__sp_linewidth_dim] }
+    \bool_if:NTF \g__sp_show_numbers_bool
+      { \flagverse{#1.} }
+      {}
     \seq_item:Nn \g__sp_couplets_seq {#1}
     \end{__sp_couplet}
   }
@@ -832,7 +857,20 @@
 %    \end{macrocode}
 % \end{macro}
 %
+% \begin{macro}{\numbercouplets}
+% \changes{v1.1.0}{2023/03/27}{New command to enable couplet numbering}
+%
+% This macro can be used within a song to indicate that its couplets should be
+% numbered.
+%
+%    \begin{macrocode}
+    \NewDocumentCommand {\numbercouplets}{}
+      { \bool_gset_true:N \g__sp_show_numbers_bool }
+%    \end{macrocode}
+% \end{macro}
+%
 % \begin{environment}{song}
+% \changes{v1.1.0}{2023/03/27}{Do not number couplets by default}
 %
 % This environment is used as a container for entire songs. On opening, it does several things:
 %   \begin{enumerate}
@@ -847,6 +885,9 @@
 %       we are at the start of the song, which will allow the next
 %       \env{refrain} or \env{couplet} to tell if the song starts with the
 %       refrain or with a couplet;
+%     \item it sets the \cs{g__sp_show_numbers_bool} variable to false, to
+%       indicate that the couplets should not be numbered by default (the user
+%       will be able to override this with the \cs{numbercouplets} command).
 %   \end{enumerate}
 %
 % This environment takes two arguments:
@@ -877,6 +918,9 @@
     % Indicate that we are in a song, and at its start
     \bool_gset_true:N \g__sp_song_bool
     \bool_gset_true:N \g__sp_song_start_bool
+
+    % Couplets should not be numbered by default
+    \bool_gset_false:N \g__sp_show_numbers_bool
   }
 %    \end{macrocode}
 %
@@ -994,18 +1038,21 @@
 % \end{environment}
 %
 % \begin{macro}{\inputsong}
-% \changes{v1.0.0}{2021/11/07}{Add a \cs{inputsong} command}
+% \changes{v1.0.0}{2021/11/07}{Add an \cs{inputsong} command}
+% \changes{v1.2.0}{2023/03/29}{Add an \cs{inputsong*} command}
 %
 % This macro starts a \env{song} environment and \cs{input}s the song content
 % from an external file.
 %
 %    \begin{macrocode}
-\NewDocumentCommand {\inputsong} { m m o }
+\NewDocumentCommand {\inputsong} { s m m o }
   {
-    \IfNoValueTF {#3}
-      { \begin{song} {#2} }
-      { \begin{song} {#2} [#3] }
-    \input{#1}
+    \IfNoValueTF {#4}
+      { \begin{song} {#3} }
+      { \begin{song} {#3} [#4] }
+    \IfBooleanT {#1}
+      { \numbercouplets }
+    \input{#2}
     \end{song}
   }
 %    \end{macrocode}

Modified: trunk/Master/texmf-dist/tex/latex/songproj/songproj.sty
===================================================================
--- trunk/Master/texmf-dist/tex/latex/songproj/songproj.sty	2023-03-29 19:58:32 UTC (rev 66703)
+++ trunk/Master/texmf-dist/tex/latex/songproj/songproj.sty	2023-03-29 20:00:15 UTC (rev 66704)
@@ -36,7 +36,7 @@
 %% 
 \NeedsTeXFormat{LaTeX2e}[2020/10/01]
 \ProvidesPackage{songproj}
-    [2022/11/07 v1.0.1 Song projection]
+    [2023/03/29 v1.2.0 Song projection]
 \RequirePackage{expl3}
 \RequirePackage{xparse}
 \RequirePackage{verse}
@@ -45,6 +45,7 @@
 \bool_new:N \g__sp_song_start_bool       % are we at the start of a song?
 \bool_new:N \g__sp_refrain_first_bool    % does current song start with the
                                          % refrain?
+\bool_new:N \g__sp_show_numbers_bool     % should we show the couplet numbers?
 \int_new:N  \g__sp_stanzas_per_slide_int % number of stanzas to show on each
                                          % slide (1 or 2)
 \dim_new:N  \g__sp_linewidth_dim         % length of the longest line in current
@@ -99,6 +100,9 @@
     \dim_compare:nNnTF \g__sp_linewidth_dim {=} {0pt}
       { \begin{__sp_couplet} }
       { \begin{__sp_couplet} [\g__sp_linewidth_dim] }
+    \bool_if:NTF \g__sp_show_numbers_bool
+      { \flagverse{#1.} }
+      {}
     \seq_item:Nn \g__sp_couplets_seq {#1}
     \end{__sp_couplet}
   }
@@ -289,6 +293,8 @@
   }
   {}
 \NewDocumentCommand {\longest} { m } { \settowidth {\g__sp_linewidth_dim} {#1} }
+    \NewDocumentCommand {\numbercouplets}{}
+      { \bool_gset_true:N \g__sp_show_numbers_bool }
 \NewDocumentEnvironment {song} { m o }
   % {number of stanzas per slide (1 or 2)}
   % [list of couplets to include (defaults to all)]
@@ -309,6 +315,9 @@
     % Indicate that we are in a song, and at its start
     \bool_gset_true:N \g__sp_song_bool
     \bool_gset_true:N \g__sp_song_start_bool
+
+    % Couplets should not be numbered by default
+    \bool_gset_false:N \g__sp_show_numbers_bool
   }
   {
     % Have we been given indexes of specific couplets to use?
@@ -407,12 +416,14 @@
     % Indicate that we are no longer in a song
     \bool_gset_false:N\g__sp_song_bool
   }
-\NewDocumentCommand {\inputsong} { m m o }
+\NewDocumentCommand {\inputsong} { s m m o }
   {
-    \IfNoValueTF {#3}
-      { \begin{song} {#2} }
-      { \begin{song} {#2} [#3] }
-    \input{#1}
+    \IfNoValueTF {#4}
+      { \begin{song} {#3} }
+      { \begin{song} {#3} [#4] }
+    \IfBooleanT {#1}
+      { \numbercouplets }
+    \input{#2}
     \end{song}
   }
 \ExplSyntaxOff

Modified: trunk/Master/tlpkg/libexec/ctan2tds
===================================================================
--- trunk/Master/tlpkg/libexec/ctan2tds	2023-03-29 19:58:32 UTC (rev 66703)
+++ trunk/Master/tlpkg/libexec/ctan2tds	2023-03-29 20:00:15 UTC (rev 66704)
@@ -2386,6 +2386,7 @@
  'showexpl',    '\.sty|\.clo|\.ldf|\.cls|\.def|\.fd$',  # not cfg
  'skeycommand', '\.sty|\.clo|\.ldf|\.cls|\.def|\.fd$',  # not cfg
  'smartdiagram','code\.tex|' . $standardtex,
+ 'songproj',	'\.sty',		# not .py
  'splitindex',  'splitindex\.tex|' . $standardtex,
  'spotcolor',   'spotcolor.*\.tex|' . $standardtex,
  'startex',     '\.(tex|stx|lan)$',



More information about the tex-live-commits mailing list.