From 144303ebd5af8db374ad8c0dfb144ef433b4f981 Mon Sep 17 00:00:00 2001 From: Karl Berry Date: Thu, 27 Jun 2019 21:00:23 +0000 Subject: songs (27jun19) git-svn-id: svn://tug.org/texlive/trunk@51494 c570f23f-e606-0410-a88d-b1316a301751 --- Master/texmf-dist/source/latex/songs/Makefile | 23 ++ Master/texmf-dist/source/latex/songs/songs.dtx | 421 ++++++++++++++++++------- Master/texmf-dist/source/latex/songs/songs.ins | 4 +- 3 files changed, 330 insertions(+), 118 deletions(-) create mode 100644 Master/texmf-dist/source/latex/songs/Makefile (limited to 'Master/texmf-dist/source/latex/songs') diff --git a/Master/texmf-dist/source/latex/songs/Makefile b/Master/texmf-dist/source/latex/songs/Makefile new file mode 100644 index 00000000000..73feef03fd2 --- /dev/null +++ b/Master/texmf-dist/source/latex/songs/Makefile @@ -0,0 +1,23 @@ +LATEX = pdflatex +TEXOUT = pdf +MAKEINDEX = makeindex + +all: songs.sty songs.$(TEXOUT) + +songs.sty: songs.ins songs.dtx + $(LATEX) $< + +songs.$(TEXOUT): songs.dtx songs.sty + $(LATEX) $< + $(MAKEINDEX) -s gind.ist -o $(join $(basename $@ $@),.ind .idx) + $(MAKEINDEX) -s gglo.ist -o $(join $(basename $@ $@),.gls .glo) + $(LATEX) $< + $(MAKEINDEX) -s gind.ist -o $(join $(basename $@ $@),.ind .idx) + $(MAKEINDEX) -s gglo.ist -o $(join $(basename $@ $@),.gls .glo) + $(LATEX) $< + +clean: + -rm songs.$(TEXOUT) songs.sty + -rm *.aux *.log *.out + -rm *.ind *.idx *.gls *.glo *.ilg + diff --git a/Master/texmf-dist/source/latex/songs/songs.dtx b/Master/texmf-dist/source/latex/songs/songs.dtx index bb244a631ad..3f6889fda2a 100644 --- a/Master/texmf-dist/source/latex/songs/songs.dtx +++ b/Master/texmf-dist/source/latex/songs/songs.dtx @@ -1,6 +1,6 @@ % \iffalse meta-comment % -% Copyright (C) 2017 Kevin W. Hamlen +% Copyright (C) 2018 Kevin W. Hamlen % % This program is free software; you can redistribute it and/or % modify it under the terms of the GNU General Public License @@ -29,7 +29,7 @@ %\NeedsTeXFormat{LaTeX2e} %\ProvidesPackage{songs} %<*package> - [2017/06/05 v3.0 Songs package] + [2018/09/12 v3.1 Songs package] % % %<*driver> @@ -387,7 +387,7 @@ % % \fi % -% \CheckSum{8792} +% \CheckSum{8935} % % \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 @@ -431,7 +431,7 @@ % % \title{The \Songs{} package\thanks{This manual documents % \textsf{songs}~\fileversion, dated~\filedate, -% \copyright~2017 Kevin W.~Hamlen, and +% \copyright~2018 Kevin W.~Hamlen, and % distributed under version~2 the GNU General Public License % as published by the Free Software Foundation.}} % \author{Kevin W. Hamlen} @@ -489,7 +489,7 @@ % \medskip % % \noindent -% This software is copyright \copyright~2017 Kevin W.~Hamlen. +% This software is copyright \copyright~2018 Kevin W.~Hamlen. % For contact information or the latest version, see the project webpage at: % % \vskip1.5ex @@ -1668,6 +1668,14 @@ % \example|\gtab{C#sus4}{4:XX3341}|\produces{\vcenterbox{\gtab{C\shrp sus4}{4:XX3341}}} % \example|\gtab{B&}{X13331}|\produces{\vcenterbox{\gtab{B\flt}{{\hphantom{4}}:X13331:}}} % +% To create a barre chord in which one finger is extended across multiple +% strings, use parentheses |()| or brackets |[]| in the \Meta{strings} +% argument to group the barred strings. +% Each such group will draw a barre on the lowest numbered fret it contains. +% For example: +% +% \example|\gtab{C7}{X(3535X):013140}|\produces{\vcenterbox{\gtab{C7}{{\hphantom{4}}:X(3535X):013140}}} +% % \DescMacro{minfrets} % By default, tablature diagrams always consist of at least 4 fret rows % (more if the \Meta{strings} argument contains a number larger than 4). @@ -1682,6 +1690,27 @@ % causes tablature diagrams to have only as many rows are required to % accommodate the largest digit appearing in the \Meta{strings} argument. % +% \paragraph{Tablatures Within Macros} +% Macros that produce tablatures must not bury the colons that separate the +% \Meta{fret}, \Meta{strings}, and \Meta{fingering} arguments within other +% macros, and it's safest to always include both colons to avoid ambiguities +% related to optional argument parsing. +% For example, +% +% \begin{codeblock} +% |\newcommand{\mystrings}{X4412X}| +% |\newcommand{\myfingers}{X3412X}| +% |\newcommand{\mychord}{|\mac{gtab}|{C|\mac{shrp}|}{:\mystrings:\myfingers}}| +% \end{codeblock} +% +% \noindent +% works as expected. +% But omitting the colon before |\mystrings| in the definition of |\mychord| +% confuses \mac{gtab} into thinking |\mystrings| is the \Meta{fret} +% argument, and writing code like |\gtab{C\shrp}{\allargs}| with |\allargs| +% defined to something with colons results in an error, because it confuses +% \mac{gtab} into thinking that |\allargs| is only the \Meta{strings} argument. +% % \section{Automatic Transposition}\label{sec:transpose} % % \DescMacro{transpose} @@ -3930,13 +3959,15 @@ % treatment of hyperlinks and bookmark indexes. % \begin{macrocode} \newif\ifSB@pdf\SB@pdffalse -\ifx\pdfoutput\undefined\else - \ifx\pdfoutput\relax\else - \ifnum\pdfoutput<\@ne\else - \SB@pdftrue +\IfFileExists{ifpdf.sty}{\RequirePackage{ifpdf}\ifpdf\SB@pdftrue\fi}{ + \ifx\pdfoutput\undefined\else + \ifx\pdfoutput\relax\else + \ifnum\pdfoutput<\@ne\else + \SB@pdftrue + \fi \fi \fi -\fi +} % \end{macrocode} % \end{macro} % @@ -5716,14 +5747,10 @@ % Using |scleardpage| moves to the next double-page if the current % double-page is nonempty. % \begin{macrocode} -\newcommand\SB@songlistbrk{} -\def\SB@songlistbrk{brk} -\newcommand\SB@songlistnc{} -\def\SB@songlistnc{nextcol} -\newcommand\SB@songlistcp{} -\def\SB@songlistcp{sclearpage} -\newcommand\SB@songlistcdp{} -\def\SB@songlistcdp{scleardpage} +\newcommand*\SB@songlistbrk{brk} +\newcommand*\SB@songlistnc{nextcol} +\newcommand*\SB@songlistcp{sclearpage} +\newcommand*\SB@songlistcdp{scleardpage} % \end{macrocode} % \end{macro} % \end{macro} @@ -5917,8 +5944,7 @@ \newcommand\SB@lop[1]{\expandafter\SB@@lop\the#1\SB@@lop#1} \newcommand\SB@@lop{} \def\SB@@lop\\#1\\#2\SB@@lop#3#4{\global#3{\\#2}\global#4{#1}} -\newcommand\SB@emptylist{} -\def\SB@emptylist{\\} +\newcommand*\SB@emptylist{\\} \newcommand\SB@ifempty[3]{% \edef\SB@temp{\the#1}% \ifx\SB@temp\SB@emptylist#2\else#3\fi% @@ -7246,12 +7272,9 @@ % Otherwise some choruses could get auto-inserted multiple times at the same % spot, possibly even leading to an infinite loop! % \begin{macrocode} -\newcommand\SB@cmark{} -\def\SB@cmark{SB@cmark} -\newcommand\SB@lastcmark{} -\def\SB@lastcmark{SB@lastcmark} -\newcommand\SB@nocmark{} -\def\SB@nocmark{SB@nocmark} +\newcommand*\SB@cmark{SB@cmark} +\newcommand*\SB@lastcmark{SB@lastcmark} +\newcommand*\SB@nocmark{SB@nocmark} % \end{macrocode} % \end{macro} % \end{macro} @@ -8270,7 +8293,7 @@ % \end{macrocode} % \end{macro} % -% \begin{macro}{\SB@trspace} +% \begin{macro}{\SB@trskip} % A space or end-brace lies next in the input stream. % It has already been added to the token list, so skip over it. % \begin{macrocode} @@ -9072,8 +9095,7 @@ % whose definition is the non-breaking space definition normally assigned to % |~|. % \begin{macrocode} -\newcommand\SB@nbsp{} -\def\SB@nbsp{\nobreakspace{}} +\newcommand*\SB@nbsp{\nobreakspace{}} % \end{macrocode} % \end{macro} % @@ -10198,7 +10220,9 @@ % a dot or nothing at all). % \begin{macrocode} \newcommand\SB@onfret[1]{% - \rlap{\hbox to\SB@fretwidth{\hfil\vrule\@height6\p@\hfil}}% + \kern.5\SB@fretwidth\kern-.2\p@% + \vrule\@height6\p@% + \kern-.2\p@\kern-.5\SB@fretwidth% \hbox to\SB@fretwidth{\hfil#1\hfil}% } % \end{macrocode} @@ -10260,31 +10284,216 @@ % \end{macro} % \end{macro} % +% \begin{macro}{\SB@doify} +% \begin{macro}{\SB@@doify} +% \begin{macro}{\SB@do} +% Define the macro given in the first argument to equal the fully expanded +% content of the second argument, but with |\SB@do| inserted before each token +% or group. +% \begin{macrocode} +\newcommand\SB@do[1]{} +\newcommand\SB@doify[2]{% + \SB@toks{}% + \edef#1{#2}% + \expandafter\SB@@doify#1\SB@@doify% + \edef#1{\the\SB@toks}% +} +\newcommand\SB@@doify[1]{% + \ifx#1\SB@@doify\else% + \SB@toks\expandafter{\the\SB@toks\SB@do{#1}}% + \expandafter\SB@@doify% + \fi% +} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\SB@allbarres} +% \begin{macro}{\SB@dobarre} +% Reserve a control sequence to remember all the stacks, start control +% sequences, and end control sequences associated with barre delimiter pairs; +% and a control sequence to perform an arbitrary action on them. +% \begin{macrocode} +\newcommand\SB@allbarres{} +\newcommand\SB@dobarre{} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\SB@barreI} +% \begin{macro}{\SB@barreN} +% \begin{macro}{\SB@barreY} +% As we process strings in order, barres in progress can be in one of three +% states: initial (|\SB@barreI|), deactivated (|\SB@barreN|), or +% tentatively activated (|\SB@barreY|). +% \begin{macrocode} +\newcommand\SB@barreI{\noexpand\SB@barreI} +\newcommand\SB@barreN{\noexpand\SB@barreN} +\newcommand\SB@barreY{\noexpand\SB@barreY} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\SB@lowfret} +% \begin{macro}{\SB@@lowfret} +% If we see a lower numbered fret than the current fret within a barre, +% deactivate the barre. +% (It has already been shown on an earlier fret.) +% \begin{macrocode} +\newcommand\SB@lowfret{% + \let\SB@dobarre\SB@@lowfret\SB@allbarres% + \SB@fretempty% +} +\newcommand\SB@@lowfret[3]{{% + \let\SB@barreI\SB@barreN% + \let\SB@barreY\SB@barreN% + \xdef#1{#1}% +}} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\SB@bactivate} +% If we see the current fret within a barre, tentatively activate the barre +% (unless it is already deactivated). +% \begin{macrocode} +\newcommand\SB@bactivate[3]{{% + \let\SB@barreI\SB@barreY% + \xdef#1{#1}% +}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\SB@bbarre} +% Starting a barre group pushes it onto its stack in the initial state. +% \begin{macrocode} +\newcommand\SB@bbarre[1]{% + \xdef#1{\SB@barreI{\the\SB@cntii}#1}% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\SB@ebarre} +% \begin{macro}{\SB@@ebarre} +% \begin{macro}{\SB@@@ebarre} +% Ending a barre group pops it and draws it if it's active. +% \begin{macrocode} +\newcommand\SB@ebarre[3]{% + \ifx#1\@empty% + \ifnum\SB@cnt=\@ne\SB@errebar#2#3\fi% + \else% + \expandafter\SB@@ebarre#1\SB@@ebarre#1% + \fi% +} +\newcommand\SB@@ebarre{} +\def\SB@@ebarre#1#2#3\SB@@ebarre#4{{% + \gdef#4{#3}% + \let\SB@barreI\@gobble% + \let\SB@barreN\@gobble% + \let\SB@barreY\SB@barre% + #1{#2}% +}} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\SB@barreson} +% \begin{macro}{\SB@barresoff} +% Turn barre delimiters on or off, depending on whether we're typesetting +% the interior or upper part of the tablature diagram. +% \begin{macrocode} +\newcommand\SB@barreson[3]{% + \def#2{\SB@bbarre#1}% + \def#3{\SB@ebarre#1#2#3}% +} +\newcommand\SB@barresoff[3]{\let#2\relax\let#3\relax} +% \end{macrocode} +% \end{macro} +% \end{macro} +% % \begin{macro}{\SB@fretempty} -% \begin{macro}{\SB@frethit} +% \begin{macro}{\SB@fretdot} +% \begin{macro}{\SB@@fretdot} % On a string in a fret diagram there can be nothing or a filled circle. % \begin{macrocode} -\newcommand\SB@fretempty{\SB@onfret\relax} -\newcommand\SB@frethit{\SB@onfret{% - \hbox{% +\newcommand\SB@fretempty{% + \advance\SB@cntii\@ne% + \SB@onfret\relax% +} +\newcommand\SB@fretdot{% + \advance\SB@cntii\@ne% + \let\SB@dobarre\SB@bactivate\SB@allbarres% + \SB@@fretdot% +} +\newcommand\SB@@fretdot{% + \SB@onfret{% \fontencoding{OMS}\fontfamily{cmsy}% \fontseries{m}\fontshape{n}% \fontsize\@xiipt\@xiipt\selectfont\char15% }% +} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\SB@barre} +% Draw a barre. +% \begin{macrocode} +\newcommand\SB@barre[1]{{% + \SB@dimen\SB@fretwidth% + \multiply\SB@dimen\SB@cntii% + \advance\SB@dimen-#1\SB@fretwidth% + \kern-\SB@dimen% + \SB@@fretdot% + \kern-.5\SB@fretwidth% + \advance\SB@dimen-\SB@fretwidth% + \raise.7pt\hbox{\vrule\@height4.6\p@\@width\SB@dimen}% + \kern-.5\SB@fretwidth% + \SB@@fretdot% }} % \end{macrocode} % \end{macro} +% +% \begin{macro}{\SB@fretend} +% At the end of a barred row in a tablature diagram, we auto-finish any +% activated barres that weren't explicitly closed by the user. +% \begin{macrocode} +\newcommand\SB@fretend{{% + \let\SB@barreI\@gobble% + \let\SB@barreN\@gobble% + \let\SB@barreY\SB@barre% + \def\SB@dobarre##1##2##3{##1\gdef##1{}}\SB@allbarres% +}} +% \end{macrocode} % \end{macro} % % \begin{macro}{\SB@finger} +% \begin{macro}{\SB@X} +% \begin{macro}{\SB@Z} +% \begin{macro}{\SB@O} % If we're including fingering info in the tablature diagram, then below % each string there might be a number. % \begin{macrocode} +\newcommand*\SB@X{X} +\newcommand*\SB@Z{0} +\newcommand*\SB@O{O} \newcommand\SB@finger[1]{% - \SB@atopfret{\sffamily\fontsize\@vipt\@vipt\selectfont#1}% + \def\SB@temp{#1}% + \ifx\SB@temp\SB@X\SB@topempty\else% + \ifx\SB@temp\SB@Z\SB@topempty\else% + \ifx\SB@temp\SB@O\SB@topempty\else% + \SB@atopfret{\sffamily\fontsize\@vipt\@vipt\selectfont#1}% + \fi\fi\fi% } % \end{macrocode} % \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} % % \begin{macro}{\ifSB@gettabind} % \begin{macro}{\SB@tabindent} @@ -10328,77 +10537,45 @@ % We can then temporarily assign meanings to those control sequences and % replay the arguments to achieve various effects. % -% \begin{macro}{\SB@csify} -% \begin{macro}{\SB@@csify} -% Convert all tokens in the first argument to control sequences and store -% the resulting sequence into the macro given by the first argument. -% Store the length in tokens into counter register |\SB@cnt|. -% \begin{macrocode} -\newcommand\SB@csify[2]{% - \SB@toks{}% - \SB@cnt\z@% - \SB@@csify#2\SB@@csify% - \edef#1{\the\SB@toks}% -} -\newcommand\SB@@csify[1]{% - \ifx#1\SB@@csify\else% - \advance\SB@cnt\@ne% - \SB@toks\expandafter{\the\SB@toks\csname#1\endcsname}% - \expandafter\SB@@csify% - \fi% -} -% \end{macrocode} -% \end{macro} -% \end{macro} -% -% -% \begin{macro}{\SB@gttop} % \begin{macro}{\SB@gtinit} % \begin{macro}{\SB@gtinc} -% \begin{macro}{\SB@gtset} % Different meanings are assigned to digits, |X|'s, and |O|'s -% depending on whether we are currently typesetting -% the material overtop the diagram, -% the interior of the diagram, -% or the fingering numbers below the diagram. -% These meanings are set by |\SB@gttop|, |\SB@gtinit| \& -% |\SB@gtinc|, and |\SB@gtset|, respectively. -% \begin{macrocode} -\newcommand\SB@gttop{% - \let\X\SB@topX\let\0\SB@topO\let\O\0\let\1\SB@topempty% - \let\2\1\let\3\1\let\4\1\let\5\1% - \let\6\1\let\7\1\let\8\1\let\9\1% -} +% as we typeset each row of the interior of the diagram. +% These meanings are set by |\SB@gtinit| and |\SB@gtinc|. +% \begin{macrocode} \newcommand\SB@gtinit{% - \let\X\SB@fretempty\let\0\X\let\O\X\let\1\SB@frethit% - \let\2\X\let\3\X\let\4\X\let\5\X% - \let\6\X\let\7\X\let\8\X\let\9\X% + \def\SB@do##1{\csname##1\endcsname}% + \let\O\0% + \let\3\2\let\4\2\let\5\2\let\6\2% + \let\7\2\let\8\2\let\9\2% } \newcommand\SB@gtinc{% + \advance\SB@cnt\@ne% \let\9\8\let\8\7\let\7\6\let\6\5\let\5\4% - \let\4\3\let\3\2\let\2\1\let\1\0% -} -\newcommand\SB@gtset[2]{% - \let\X#1\let\0\X\let\O\X% - \def\1{#21}\def\2{#22}\def\3{#23}% - \def\4{#24}\def\5{#25}\def\6{#26}% - \def\7{#27}\def\8{#28}\def\9{#29}% + \let\4\3\let\3\2\let\2\1\let\1\SB@lowfret% } % \end{macrocode} % \end{macro} % \end{macro} -% \end{macro} -% \end{macro} % -% \begin{macro}{\SB@gtmax} -% To compute the height of the tablature diagram, we must identify the -% maximum fret number in the \Meta{strings} argument. -% This is accomplished by using the following macro in combination with -% |\SB@gtset| above. +% \begin{macro}{\BarreDelims} +% \begin{macro}{\SB@bdelims} +% Each pair of barre delimiters reserves a stack and augments the +% initialization state to recognize those delimiters. % \begin{macrocode} -\newcommand\SB@gtmax[1]{\ifnum\SB@cnt<#1\SB@cnt#1\fi} +\newcommand\BarreDelims[2]{% + \expandafter\SB@bdelims\csname SB@bs@#1#2\expandafter\endcsname% + \csname#1\expandafter\endcsname\csname#2\endcsname% +} +\newcommand\SB@bdelims[3]{% + \newcommand*#1{}% + \SB@app\def\SB@allbarres{\SB@dobarre#1#2#3}% +} +\BarreDelims() +\BarreDelims[] % \end{macrocode} % \end{macro} +% \end{macro} % % \begin{macro}{\gtab} % \begin{macro}{\SB@gtab} @@ -10481,7 +10658,13 @@ \thinspace{\printchord{\transposehere{#1}\strut}}\thinspace% }% \setbox\SB@boxii\hbox{\SB@fretnum{\SB@targfret}}% - \setbox\SB@boxiii\hbox{{\SB@gttop\SB@targstr}}% + \setbox\SB@boxiii\hbox{{% + \let\X\SB@topX\let\0\SB@topO% + \let\1\SB@topempty\let\2\1% + \SB@gtinit% + \let\SB@dobarre\SB@barresoff\SB@allbarres% + \SB@targstr% + }}% \hsize\wd\SB@box% \ifSB@gettabind% \global\SB@tabindent\wd\SB@boxii% @@ -10506,18 +10689,20 @@ \vtop{% \SB@dimen\wd\SB@boxiii% \box\SB@boxiii% - \SB@cnt\minfrets% - \SB@gtset\relax\SB@gtmax\SB@targstr% + \let\X\SB@fretempty\let\0\X% + \let\1\SB@fretdot\def\2{\SB@fretempty\global\SB@testtrue}% \SB@gtinit% + \let\SB@dobarre\SB@barreson\SB@allbarres% + \SB@cnt\@ne% \loop% - \SB@fretbar\hbox{\SB@targstr}% - \advance\SB@cnt\m@ne% - \ifnum\SB@cnt>\z@\SB@gtinc\repeat% + \SB@testfalse% + \SB@fretbar\hbox{\SB@cntii\z@\SB@targstr\SB@fretend}% + \ifnum\SB@cnt<\minfrets\SB@testtrue\fi% + \ifSB@test\SB@gtinc\repeat% \SB@fretbar% \ifx\SB@targsfing\@empty\else% \kern1.5\p@% - \SB@gtset\SB@topempty\SB@finger% - \hbox{\SB@targfing}% + \hbox{\let\SB@do\SB@finger\SB@targfing}% \fi% }% \hfil% @@ -10530,7 +10715,9 @@ % \end{macro} % % \begin{macro}{\SB@tabargs} +% \begin{macro}{\SB@@tabargs} % \begin{macro}{\SB@ctoken} +% \changes{v3.1}{2017/06/23}{Allow macros within 2nd gtab arg} % Break the second argument to a |\gtab| macro into three sub-arguments. % The possible forms are: % (a) \Meta{strings}, @@ -10539,8 +10726,8 @@ % (d) \Meta{fret}|:|\Meta{strings}|:|\Meta{fingering}. % To distinguish forms (b) and (c), we count the number of tokens before % the first colon. -% If there is only one token, we assume it must be form (b), since frets -% larger than 9 and 1-stringed instruments are both rare. +% If there is only one token or group, we assume it must be form (b), +% since frets larger than 9 and 1-stringed instruments are both rare. % Otherwise we assume form (c). % \begin{macrocode} \newcommand\SB@ctoken{} \def\SB@ctoken{:} @@ -10548,26 +10735,28 @@ \def\SB@tabargs#1:#2:#3:#4\SB@tabargs{% \def\SB@temp{#4}% \ifx\SB@temp\@empty% - \SB@csify\SB@targstr{#1}% + \SB@doify\SB@targstr{#1}% \else\ifx\SB@temp\SB@ctoken% - \SB@csify\SB@targstr{#1}% - \ifnum\SB@cnt>\@ne% - \SB@cntii\SB@cnt% - \SB@csify\SB@targfing{#2}% - \SB@cnt\SB@cntii% - \else% + \SB@@tabargs#1\SB@@tabargs% + \ifx\SB@temp\@empty% \def\SB@targfret{#1}% - \SB@csify\SB@targstr{#2}% + \SB@doify\SB@targstr{#2}% + \else% + \SB@doify\SB@targfing{#2}% + \SB@doify\SB@targstr{#1}% \fi% \else% \def\SB@targfret{#1}% - \SB@csify\SB@targfing{#3}% - \SB@csify\SB@targstr{#2}% + \SB@doify\SB@targfing{#3}% + \SB@doify\SB@targstr{#2}% \fi\fi% } +\newcommand\SB@@tabargs{} +\def\SB@@tabargs#1#2\SB@@tabargs{\def\SB@temp{#2}} % \end{macrocode} % \end{macro} % \end{macro} +% \end{macro} % % \subsection{Book Sectioning} % @@ -12048,12 +12237,12 @@ % \end{macrocode} % \end{macro} % -% \begin{macro}{\SB@errtab} +% \begin{macro}{\SB@errebar} % \begin{macrocode} -\newcommand\SB@errtab{% - \SB@Error{Invalid argument to \protect\gtab\space macro. R% - eplacing it with \protect\0.}{Valid arguments consist onl% - y of: X, O, 0, 1, 2, 3, or 4.}% +\newcommand\SB@errebar[2]{% + \SB@Error{Ignoring unbalanced \expandafter\@gobble\string#2 i% + n \protect\gtab}{Found no \expandafter\@gobble\string#1 to ma% + tch the \expandafter\@gobble\string#2.}% } % \end{macrocode} % \end{macro} diff --git a/Master/texmf-dist/source/latex/songs/songs.ins b/Master/texmf-dist/source/latex/songs/songs.ins index 6e67a1990d4..9bbcdc734da 100644 --- a/Master/texmf-dist/source/latex/songs/songs.ins +++ b/Master/texmf-dist/source/latex/songs/songs.ins @@ -1,4 +1,4 @@ -%% Copyright (C) 2017 Kevin W. Hamlen +%% Copyright (C) 2018 Kevin W. Hamlen %% %% This program is free software; you can redistribute it and/or %% modify it under the terms of the GNU General Public License @@ -27,7 +27,7 @@ This is a generated file. -Copyright (C) 2017 by Kevin W. Hamlen +Copyright (C) 2018 by Kevin W. Hamlen This file may be distributed and/or modified under the conditions of the LaTeX Project Public License, either version 1.3a of this license -- cgit v1.2.3