summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/source/latex/songs
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2019-06-27 21:00:23 +0000
committerKarl Berry <karl@freefriends.org>2019-06-27 21:00:23 +0000
commit144303ebd5af8db374ad8c0dfb144ef433b4f981 (patch)
treed1c36565681ca51635cc19852986247fbddd76a7 /Master/texmf-dist/source/latex/songs
parentdbd07e83962ec5d087fbbd857823d36e0e3dd4d9 (diff)
songs (27jun19)
git-svn-id: svn://tug.org/texlive/trunk@51494 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/source/latex/songs')
-rw-r--r--Master/texmf-dist/source/latex/songs/Makefile23
-rw-r--r--Master/texmf-dist/source/latex/songs/songs.dtx421
-rw-r--r--Master/texmf-dist/source/latex/songs/songs.ins4
3 files changed, 330 insertions, 118 deletions
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 @@
%<package>\NeedsTeXFormat{LaTeX2e}
%<package>\ProvidesPackage{songs}
%<*package>
- [2017/06/05 v3.0 Songs package]
+ [2018/09/12 v3.1 Songs package]
%</package>
%
%<*driver>
@@ -387,7 +387,7 @@
%</driver>
% \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