diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..2ff4d1b --- /dev/null +++ b/LICENSE @@ -0,0 +1,13 @@ +DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE + Version 2, December 2004 + + Copyright (C) 2004 Sam Hocevar + + Everyone is permitted to copy and distribute verbatim or modified + copies of this license document, and changing it is allowed as long + as the name is changed. + + DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. You just DO WHAT THE FUCK YOU WANT TO. diff --git a/battlefield/battlefield.tex b/battlefield/battlefield.tex deleted file mode 100644 index 1fda4a2..0000000 --- a/battlefield/battlefield.tex +++ /dev/null @@ -1,9 +0,0 @@ -\begin{song}{Johnny I Hardly Knew Ye}{Em}{~}{irish traditional}{}{} - \input{battlefield/johnny_i_hardly_knew_ye.tex} -\end{song} - -\begin{song}{Whiskey You're The Devil}{D}{~}{irish traditional}{}{} - \input{battlefield/whiskey_you_re_the_devil.tex} -\end{song} - -\input{battlefield/foggy.tex} \ No newline at end of file diff --git a/battlefield/whiskey_you_re_the_devil.tex b/battlefield/whiskey_you_re_the_devil.tex deleted file mode 100644 index e484904..0000000 --- a/battlefield/whiskey_you_re_the_devil.tex +++ /dev/null @@ -1,65 +0,0 @@ -\begin{SBChorus} -Oh, \Ch{G}{whiskey} you're the devil, You're \Ch{C}{leading} me \Ch{G}{astray} - -O'er hills and mountains and to \Ch{D}{Americae} - -You're \Ch{G}{sweeter}, stronger, decenter, You're \Ch{C}{spunkier} than \Ch{G}{tea} - -Oh, \Ch{G}{whiskey} you're me darling drunk or \Ch{D}{so}\Ch{G}{ber} -\end{SBChorus} - -\bigskip - -\begin{SBVerse*} -Now \Ch{G}{brave} boys, we're on the march - -\Ch{D}{Off} to Portu\Ch{C}{gal} and Spain - -\Ch{G}{Drums} a'beating, banners a'waving - -\Ch{C}{Devil} a'home will \Ch{D}{come} tonight - -Lo' fare thee well With me thitery doodelum the \Ch{D}{da} - -Me \Ch{Am}{thitery} doodelum the \Ch{C}{da} - -Me \Ch{G}{right} fol' tur-a laddie-o - -There's \Ch{D}{whiskey} in the \Ch{G}{jar} -\end{SBVerse*} - -\bigskip - -The French are fighting boldly - -Men are dying hot and coldly - -Give every man his flask of powder - -His firelock on his shoulder - -Lo' fare thee well With me thitery doodelum the da - -Me thitery doodelum the da - -Me right fol' tur-a laddie-o - -There's whiskey in the jar - -\bigskip - -Says the mother : \og Do not wrong me - -Don't take me daughter from me - -For if you do I will torment you - -And after death me ghost will haunt you \fg - -We're off, fare thee well With me thitery doodelum the da - -Me thitery doodelum the da - -Me right fol' tur-a laddie-o - -There's whiskey in the jar diff --git a/booze/booze.tex b/booze/booze.tex deleted file mode 100644 index 1fc46ce..0000000 --- a/booze/booze.tex +++ /dev/null @@ -1,5 +0,0 @@ -\begin{song}{The Jug of Punch}{D}{~}{traditional}{}{} - \input{booze/jug_of_punch.tex} -\end{song} - -\input{booze/bugger.tex} \ No newline at end of file diff --git a/clean.bat b/clean.bat new file mode 100644 index 0000000..2448317 --- /dev/null +++ b/clean.bat @@ -0,0 +1,2 @@ +Rem manually performs "make clean" +del *.aux *.d *.toc *.out *.log *.nav *.snm *.sbx *.sxd diff --git a/crepbook.cls b/crepbook.cls new file mode 100644 index 0000000..7863070 --- /dev/null +++ b/crepbook.cls @@ -0,0 +1,337 @@ +% CREPBOOK DOCUMENT CLASS -- version 0.2.2 +% for LaTeX2e +% +\NeedsTeXFormat{LaTeX2e}[1995/12/01] +\ProvidesClass{crepbook}[2009/11/12 v0.4.2 LaTeX document class for Crep + Books] + +\newif{\iftabs} +\newif{\iflilypond} +\newif{\ifnodiagram} +\newif{\ifpictures} + +\tabsfalse +\lilypondfalse +\nodiagramtrue +\picturesfalse + +% Options +\DeclareOption{tabs}{\tabstrue} +\DeclareOption{notabs}{\tabsfalse} +\DeclareOption{lilypond}{\lilypondtrue} +\DeclareOption{nolilypond}{\lilypondfalse} +\DeclareOption{nodiagram}{\nodiagramtrue} +\DeclareOption{diagram}{\nodiagramfalse} +\DeclareOption{pictures}{\picturestrue} +\DeclareOption{nopictures}{\picturesfalse} + +\DeclareOption{10pt}{\PassOptionsToClass{\CurrentOption}{article}} +\DeclareOption{11pt}{\PassOptionsToClass{\CurrentOption}{article}} +\DeclareOption{12pt}{\PassOptionsToClass{\CurrentOption}{article}} + +% Default options : pass to the songs package +\DeclareOption*{\PassOptionsToPackage{\CurrentOption}{songs}} +\ProcessOptions + +% Base class +\LoadClass[a4paper]{article} + +% Main packages +\RequirePackage{graphicx,xcolor} +\RequirePackage{songs} +\RequirePackage{fancybox} +\definecolor{tango-green-3}{HTML}{4e9a06} +\definecolor{tango-blue-3}{HTML}{204a87} +\RequirePackage[bookmarks, + bookmarksopen, + colorlinks=true, + linkcolor=tango-green-3, + urlcolor=tango-blue-3]{hyperref} +\RequirePackage{tikz} +\RequirePackage{tex/licence} + +\iflyric% + \tabsfalse% + \lilypondfalse% + \nodiagramtrue% + \picturesfalse% + \renewcommand{\colbotglue}{0pt plus .5\textheight minus 0pt}% +\fi + +% Start +\def\andname{and} +\def\lastandname{\unskip, and} + +\newcounter{@inst} +\newcounter{@auth} +\newcounter{auco} + +\def\clearheadinfo{\gdef\@author{No Author Given}% + \gdef\@title{No Title Given}% + \gdef\@subtitle{} + \gdef\@version{} + \gdef\@web{} + \gdef\@mail{} + \gdef\@email{} + \gdef\@picture{} + \gdef\@picturecopyright{}} + +\def\subtitle#1{\gdef\@subtitle{#1}} +\def\version#1{\gdef\@version{#1}} +\def\web#1{\gdef\@web{#1}} +\def\mail#1{\gdef\@mail{#1}} +\def\email#1{\gdef\@email{#1}} +\def\licence#1{\gdef\@licence{#1}} +\def\picture#1{\gdef\@picture{#1}} +\def\picturecopyright#1{\gdef\@picturecopyright{#1}} +\def\footer#1{\gdef\@footer{#1}} +\clearheadinfo + +\renewcommand\maketitle{ + \@maketitle + + \thispagestyle{empty} + + \clearheadinfo} +% +\def\@maketitle{\newpage + \markboth{}{}% + \def\lastand{\ifnum\value{@inst}=2\relax + \unskip{} \andname\ + \else + \unskip \lastandname\ + \fi}% + \def\and{\stepcounter{@auth}\relax + \ifnum\value{@auth}=\value{@inst}% + \lastand + \else + \unskip, + \fi}% + \begin{center}% + {\rule{\textwidth}{1mm}} + + {\Huge \bfseries\boldmath\@title \par} + + \if!\@subtitle!\else {\begin{flushright}\large \bfseries\boldmath + \@subtitle \par \end{flushright}} + \fi + + {\rule{\textwidth}{1mm}} + + \end{center}% + + \vspace{1.5cm} + + \begin{flushleft} + \begin{tabular}{l l} + \if!\@version!\else{\bf version:} & \@version \\ \fi + \if!\@date!\else{\bf date:} & \@date \\ \fi + \if!\@author!\else{\bf auteurs:} & \@author \\ \fi + \if!\@web!\else{\bf web:} & \url{\@web} \\ \fi + \if!\@mail!\else{\bf mail:} & \url{\@mail} \\ \fi + \end{tabular} + \end{flushleft} + + \vspace{1.5cm} + + \begin{center} + \includegraphics[height=14cm]{\@picture} + \begin{flushright} + {\flushright \small \@picturecopyright} + \end{flushright} + \end{center} + + \@footer + + \thispagestyle{empty} + \newpage + \@licence + \newpage +} + +\makeatletter + +\newlength{\coverheight} +\setlength{\coverheight}{2cm} +\newlength{\coverspace} +\setlength{\coverspace}{0.1cm} +\newcommand{\songcover}{} +\newcommand{\songalbum}{} +\newsongkey{cov}{\let\songcover\@empty}{\def\songcover{#1}} +\newsongkey{album}{\let\songalbum\@empty}{\def\songalbum{#1}} +\newcommand\cover{% + \ifpictures% + \ifx\songcover\@empty\else% + \mbox{% + \includegraphics[width=\coverheight]{\songcover}% + \hspace{\coverspace}% + }% + \fi% + \fi% +} + +\newlength{\capoheight} +\setlength{\capoheight}{1.5cm} +\renewcommand\capo[1]{% + \ifchorded% + \iftranscapos% + \transpose{#1}% + \else% + \ifpictures + \mbox{% + \includegraphics[height=\capoheight]{capodastre}% + \put(-22,8){\Large #1} + }% + \else + \musicnote{capo: #1}% + \fi + \hspace{\coverspace}% + \fi% + \fi% +}% + +\ifnodiagram% + \renewcommand{\gtab}[2]{}% +\fi% + +\newcommand{\lilypond}[1]{% + \iflilypond% + \IfFileExists{./lilypond/#1.pdf}{\includegraphics{./lilypond/#1}}{}% + \fi% +} + +\newcommand{\image}[2][]{% + \ifpictures% + \begin{flushright}% + \includegraphics[#1]{#2}% + \end{flushright}% + \fi% +} + +% Configuration of the songs package +\titleprefixword{} +\renewcommand{\stitlefont}{\LARGE\bf} +\renewcommand{\printchord}[1]{\small{\it#1}} +\renewcommand{\chorusfont}{\it} +\renewcommand{\showauthors}{% + \hbox{\normalsize\songauthors}% +} +\renewcommand{\idxtitlefont}{\sffamily\bfseries} +\renewcommand{\idxauthfont}{\sffamily\bfseries} +\renewcommand{\idxheadfont}{\sffamily\it\LARGE} +\renewcommand{\idxrefsfont}{\bfseries} + +% +% Customization of the page appearance +% +\RequirePackage[ + a4paper % paper size + ,includeheadfoot % include header and footer into text size + ,hmarginratio=1:1 % ratio between inner and outer margin (default) + ,outer=1.8cm % outer margin (right) + ,vmarginratio=1:1 % ratio between top and bottom margin + ,bmargin=1.3cm % bottom margin +% ,bindingoffset=1.7cm % space reserved to bound pages together + ]{geometry} + +% Paragraph indentation space +\setlength{\parindent}{0.3cm} + +% +% songs class options +% +% Horizontal space reserved to verse number +\setlength{\versenumwidth}{1em} +% Modifier to the space between consecutive lines of lyrics +\baselineadj=-2pt plus 1pt minus 1pt +% Space between verses and chorus +\versesep=6pt plus 2pt minus 2pt +%lyrics font +\renewcommand{\lyricfont}{\normalfont\normalsize} + + +% color used to shade song numbers. +\definecolor{SongbookShade}{HTML}{d1e4ae} + +% +\iftabs% +%% Code from tabs.sty +% Counters +\newcounter{tab-string} +\newcounter{tab-tempo} +\newcounter{tab-line} +% Length +\newlength{\tablen} +% Variables +\def\chordtuning{E,A,D,G,B,e} +\def\xunit{0.35} +\def\yunit{0.2} +% The tab environmant +% \begin{tab} +\newenvironment{tab} +{ + \normalsize + \setcounter{tab-line}{0} + \setcounter{tab-tempo}{0} + + \setlength{\tablen}{\xunit cm} + + % A single note + % \single + \newcommand{\single}[2]{ + % draw tuning if we are at the beginining of a new tab line + \ifnum\value{tab-tempo}=0 + \setcounter{tab-string}{6} + \foreach \tuning in \chordtuning + { + \node at (-1,\value{tab-line}+\value{tab-string}) {\tuning}; + \addtocounter{tab-string}{-1} + } + \fi + + % draw the 6 strings + \foreach \string in {1,...,6} + { + \draw[xshift=-0.5cm] (\value{tab-tempo},\value{tab-line}+\string) -- +(1,0); + } + \draw node[single] at (\value{tab-tempo},\value{tab-line}+##1) {##2}; + \addtocounter{tab-tempo}{1} + \addtolength{\tablen}{\xunit cm} + \ifnum\hsize<\tablen + \addtocounter{tab-line}{8} + \setlength{\tablen}{\xunit cm} + \setcounter{tab-tempo}{0} + \end{tikzpicture} + \begin{tikzpicture}[ + single/.style={}, + cm={\xunit,0,0,-\yunit,(0,0)} + ] + \fi + } + % A mesure bar + % \bar + \renewcommand{\bar}{ + \draw[xshift=-0.5cm] (\value{tab-tempo},\value{tab-line}+1) --+(0,5); + } + + \hspace{-\parindent} + \begin{tikzpicture}[ + single/.style={}, + cm={\xunit,0,0,-\yunit,(0,0)} + ] + + % draw the first bar + \draw[xshift=-0.5cm] (0,1) --+(0,5); +} +{ + \end{tikzpicture} +} +\else% +\newenvironment{tab}{% + \newcommand{\single}[2]{}% + \renewcommand{\bar}{}% +}{}% +\fi% + +%% End of tabs.sty file +\makeatother diff --git a/default.sb b/default.sb new file mode 100644 index 0000000..4201f79 --- /dev/null +++ b/default.sb @@ -0,0 +1,4 @@ +{ +"songs" : [ + ] +} diff --git a/fields/fields.tex b/fields/fields.tex deleted file mode 100644 index 62c61ad..0000000 --- a/fields/fields.tex +++ /dev/null @@ -1,5 +0,0 @@ -\begin{song}{Kilkelly, Ireland}{Em}{~}{irish traditional}{}{} - \input{fields/kilkelly.tex} -\end{song} - -\input{fields/maguires.tex} \ No newline at end of file diff --git a/img/by-sa.svg b/img/by-sa.svg new file mode 100644 index 0000000..1078a3b --- /dev/null +++ b/img/by-sa.svg @@ -0,0 +1,184 @@ + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/img/by.svg b/img/by.svg new file mode 100644 index 0000000..720f698 --- /dev/null +++ b/img/by.svg @@ -0,0 +1,72 @@ + + + +image/svg+xml + + + + + + + \ No newline at end of file diff --git a/img/capodastre.svg b/img/capodastre.svg new file mode 100644 index 0000000..7d787ce --- /dev/null +++ b/img/capodastre.svg @@ -0,0 +1,445 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/img/remix.svg b/img/remix.svg new file mode 100644 index 0000000..348faa4 --- /dev/null +++ b/img/remix.svg @@ -0,0 +1,70 @@ + + + +image/svg+xml + + + + + + + \ No newline at end of file diff --git a/img/sa.svg b/img/sa.svg new file mode 100644 index 0000000..694c254 --- /dev/null +++ b/img/sa.svg @@ -0,0 +1,70 @@ + + + +image/svg+xml + + + + + + + \ No newline at end of file diff --git a/img/share.svg b/img/share.svg new file mode 100644 index 0000000..b1d1f40 --- /dev/null +++ b/img/share.svg @@ -0,0 +1,70 @@ + + + +image/svg+xml + + + + + + + \ No newline at end of file diff --git a/img/shiver.jpg b/img/shiver.jpg new file mode 100644 index 0000000..bc1624b Binary files /dev/null and b/img/shiver.jpg differ diff --git a/img/src/by-sa.svg b/img/src/by-sa.svg new file mode 100644 index 0000000..1078a3b --- /dev/null +++ b/img/src/by-sa.svg @@ -0,0 +1,184 @@ + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/img/src/by.svg b/img/src/by.svg new file mode 100644 index 0000000..720f698 --- /dev/null +++ b/img/src/by.svg @@ -0,0 +1,72 @@ + + + +image/svg+xml + + + + + + + \ No newline at end of file diff --git a/img/src/capodastre.svg b/img/src/capodastre.svg new file mode 100644 index 0000000..7d787ce --- /dev/null +++ b/img/src/capodastre.svg @@ -0,0 +1,445 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/img/src/remix.svg b/img/src/remix.svg new file mode 100644 index 0000000..348faa4 --- /dev/null +++ b/img/src/remix.svg @@ -0,0 +1,70 @@ + + + +image/svg+xml + + + + + + + \ No newline at end of file diff --git a/img/src/sa.svg b/img/src/sa.svg new file mode 100644 index 0000000..694c254 --- /dev/null +++ b/img/src/sa.svg @@ -0,0 +1,70 @@ + + + +image/svg+xml + + + + + + + \ No newline at end of file diff --git a/img/src/share.svg b/img/src/share.svg new file mode 100644 index 0000000..b1d1f40 --- /dev/null +++ b/img/src/share.svg @@ -0,0 +1,70 @@ + + + +image/svg+xml + + + + + + + \ No newline at end of file diff --git a/instrumentals/instrumentals.tex b/instrumentals/instrumentals.tex deleted file mode 100644 index ee624cb..0000000 --- a/instrumentals/instrumentals.tex +++ /dev/null @@ -1,25 +0,0 @@ -\begin{music} -\parindent10mm -\instrumentnumber{1} % a single instrument -\setname1{Piano} % whose name is Piano -\setstaffs1{2} % with two staffs -\generalmeter{\meterfrac44}% 4/4 meter chosen -\startextract % starting real score -\Notes\ibu0f0\qb0{cge}\tbu0\qb0g|\hl j\en -\Notes\ibu0f0\qb0{cge}\tbu0\qb0g|\ql l\sk\ql n\en -\bar -\Notes\ibu0f0\qb0{dgf}|\qlp i\en -\notes\tbu0\qb0g|\ibbl1j3\qb1j\tbl1\qb1k\en -\Notes\ibu0f0\qb0{cge}\tbu0\qb0g|\hl j\en -\endextract % terminate excerpt -\end{music} - -TODO : -Kesh Jig / Blackthorn Stick -Kerry Polka (Egan's Polka) / Britches Full Of Stitches / Finnish Polka -D\'erob\'ee de Guingamp -Morrison's Jig / Joe Cooley's Reel -Drowsy Maggie / Glasgow's Reel -Rights of Men / The Pride of Petravore -Banish Misfortune -Devil's Dream \ No newline at end of file diff --git a/license.tex b/license.tex new file mode 100644 index 0000000..55b8e5b --- /dev/null +++ b/license.tex @@ -0,0 +1,50 @@ +%Licence WTFPL +\begin{center} + \textbf{\LARGE{DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE}} + + Version 2, December 2004 + +~\\ + +Copyright (C) 2004 Sam Hocevar +\end{center} +\vspace{1cm} + +%------------------------------------------------------------------------------- +\begin{lblock} + Everyone is permitted to copy and distribute verbatim or modified + copies of this license document, and changing it is allowed as long + as the name is changed. +\end{lblock} +%------------------------------------------------------------------------------- +\begin{lblock} +\centering + +DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE + +TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + +\begin{enumerate} +\setcounter{enumi}{-1} +\item You just DO WHAT THE FUCK YOU WANT TO. +\end{enumerate} +\end{lblock} +%------------------------------------------------------------------------------- +\paragraph{Songs \LaTeX~Package} +Ce document est écrit en \LaTeX, d'après le style du projet Songs~: +\url{http://songs.sourceforge.net/} + +\paragraph{Note des auteurs} +Toutes les tablatures sont des représentations d'interprétations +personnelles et approximatives de chansons pouvant être protégées par droits +d'auteurs. Ce recueil de chansons n'a absolument aucune vocation +commerciale et joue sur l'autorisation tacite des auteurs et des +ayant-droits, pensant que la publication de ces tablatures représente +plutôt une publicité positive à leur égard. Si un auteur ou une +société accréditée pense que ces tablatures sont utilisées d'une +manière susceptible de porter atteinte à ses droits et désire +s'opposer à la publication de ses tablatures, merci de nous contacter +à \url{benjamin.coudrin+shiver@gmail.com} et celles-ci seront immédiatement +retirées. +%------------------------------------------------------------------------------- +% Fin de la Licence diff --git a/make.bat b/make.bat new file mode 100644 index 0000000..14188e5 --- /dev/null +++ b/make.bat @@ -0,0 +1,12 @@ +Rem build tex file from songbook file +songbook.py --songbook=%1.sb --output=%1.tex + +Rem 1st pdf compilation +pdflatex %1.tex + +Rem build indexes +songbook-makeindex.py %1_title.sxd > %1_title.sbx +songbook-makeindex.py %1_auth.sxd > %1_auth.sbx + +Rem 2nd compilation to include indexes +pdflatex %1.tex diff --git a/makefile b/makefile new file mode 100644 index 0000000..3f59b6b --- /dev/null +++ b/makefile @@ -0,0 +1,99 @@ +# Copyright (c) 2008-2010 Alexandre Dupas +# +# This program is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 2, or (at your option) any later +# version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# + +SONGBOOKS := $(wildcard *.sb) +TARGETS = $(SONGBOOKS:%.sb=%) + +PDF = $(TARGETS:%=%.pdf) + +CHORDS = chords.tex +CHORDS_SRC = $(shell ls songs/*/*.sg) + +PRINT=printf "%s\n" +PRINTTAB=printf "\t%s\n" + +MAKE_SONGBOOK=./songbook.py +MAKE_INDEX=./songbook-makeindex.py +MAKE_CHORDS=./utils/songbook-gtab.py + +ifeq ($(shell which lilypond),) + LILYPOND=$(ECHO) "** lilypond not found" >&2 ; $(ECHO) lilypond + LILYFILE='' +else + LILYPOND=lilypond + LILY_SRC=$(wildcard lilypond/*.ly) + LILYFILE=$(LILY_SRC:%.ly=%.pdf) +endif + + +LATEX=pdflatex $(LATEX_OPTIONS) + +############################################################ +### Targets + +default: songbook.pdf + +all: $(PDF) + +pdf: $(PDF) + xpdf $< + +lilypond: $(LILYFILE) + +clean: + @rm -f $(TARGETS:%=%.d) $(TARGETS:%=%.tex) $(TARGETS:%=%.aux) \ + $(TARGETS:%=%.toc) $(TARGETS:%=%.out) $(TARGETS:%=%.log) \ + $(TARGETS:%=%.nav) $(TARGETS:%=%.snm) + @rm -f *.sbx *.sxd + +cleanall: clean + @rm -f $(PDF) + @rm -f $(LILYFILE) + +depend: + +############################################################ + + +$(PDF): %.pdf: %.tex %.aux + +%.aux: %.tex + $(LATEX) $< + +%.sbx: %.sxd + $(MAKE_INDEX) $< > $@ + +%.tex: %.sb + $(MAKE_SONGBOOK) -s $< -o $@ + +%.d: %.sb + $(MAKE_SONGBOOK) -s $< -d -o $@ + +%.pdf: %.ly + @$(LILYPOND) --output=$(@:%.pdf=%) $< + @rm $(@:%.pdf=%.ps) + +$(CHORDS): $(CHORDS_SRC) + $(MAKE_CHORDS) -o $@ + +ifeq (.pdf,$(suffix $(MAKECMDGOALS))) +include $(MAKECMDGOALS:%.pdf=%.d) +else ifneq ($(MAKECMDGOALS),clean) + ifneq ($(MAKECMDGOALS),cleanall) + include $(TARGETS:%=%.d) + endif +endif diff --git a/road/road.tex b/road/road.tex deleted file mode 100644 index 31aab21..0000000 --- a/road/road.tex +++ /dev/null @@ -1,9 +0,0 @@ -\begin{song}{Whiskey In The Jar}{G}{~}{irish traditional}{}{} - \input{road/whiskey_in_the_jar.tex} -\end{song} - -\begin{song}{Rocky Road To Dublin}{Dm}{~}{irish traditional}{}{} - \input{road/rocky_road_to_dublin.tex} -\end{song} - -\input{road/wild.tex} \ No newline at end of file diff --git a/sea/drunken_sailor.tex b/sea/drunken_sailor.tex deleted file mode 100644 index 1292c8f..0000000 --- a/sea/drunken_sailor.tex +++ /dev/null @@ -1,42 +0,0 @@ -\begin{SBVerse*} -\Ch{Dm}{What} shall we do with a drunken sailor - -\Ch{C}{What} shall we do with a drunken sailor - -\Ch{Dm}{What} shall we do with a drunken sailor - -\Ch{C}{Early} in the \Ch{Dm}{mornin'} -\end{SBVerse*} - -\bigskip - -\begin{SBChorus} -\Ch{Dm}{Wey} Hey and Up she rises - -\Ch{C}{Wey} Hey and Up she rises - -\Ch{Dm}{Wey} Hey and Up she rises - -\Ch{C}{Early} in the \Ch{Dm}{mornin'} -\end{SBChorus} - -\bigskip - -Put him in the longboat till he's sober - -\bigskip - -Shave his belly with a rusty rasor - -\bigskip - -Give him a dose of salt and water - -\bigskip - -Put him in the bed with the captain's daughter - -\bigskip - -That's what we'll do with a drunken sailor - diff --git a/sea/le_forban1.tex b/sea/le_forban1.tex deleted file mode 100644 index e7c4468..0000000 --- a/sea/le_forban1.tex +++ /dev/null @@ -1,32 +0,0 @@ -A moi l'forban, que m'importe la gloire,\\ -Les lois du monde, et qu'importe la mort ? \\ -Sur l'océan j'ai planté ma victoire,\\ -Et bois mon vin dans une coupe d'or. \\ -Vivre d'orgie est ma seule espérance, \\ -Le seul bonheur que j'aie pu conquérir. \\ -C'est sur les flots qu'jai passé mon enfance, \\ -C'est sur les flots qu'un forban doit mourir\\ -\bigskip -\textbf{Vin qui pétille, femme gentille, \\ -Sous tes baisers brûlants d'amour ; \\ -Plaisirs, batailles, Vive la canaille ! \\ -Je bois, je chante, et je tue tour à tour\\} -\bigskip -Peut-être qu'au mât d'une barque étrangère\\ -Mon corps, un jour, servira d'étendard\\ -Et tout mon sang rougira la galère\\ -Aujourd'hui fête et demain le hasard. \\ -Allons esclave, allons, debout mon brave,\\ -Buvons la vie et le vin à grands pots ; \\ -Aujourd'hui fête, et puis demain, peut-être \\ -Ma tête ira s'engloutir dans les flots.\\ -\bigskip -Peut-être qu'un jour, par un coup de fortune \\ -Je capturerai l'or d'un beau gallion ;\\ -Riche à pouvoir vous acheter la lune, \\ -Je m'en irai vers d'autres horizons. \\ -Là, respecté, comme un vrai gentilhomme, \\ -Moi qui ne fus qu'un forban, qu'un bandit, \\ -Je pourrai, comme le fils d'un roi, tout comme \\ -Mourir, peut-être, dedans un grand lit.\\ -\bigskip diff --git a/sea/le_forban2.tex b/sea/le_forban2.tex deleted file mode 100644 index 435305d..0000000 --- a/sea/le_forban2.tex +++ /dev/null @@ -1,79 +0,0 @@ -A moi forban que m'importe la gloire - -N\'e fils de roi et de prostitu\'ee - -Sur des cadavres j'ai chant\'e la victoire - -Et dans un cr\^ane j'ai bu la libert\'e - -Vierge craintive, toi, ma captive - -Ce soir je vais d\'evorer tes app\^ats - -Encore br\^ulant d'une autre amante - -Tes vertus vont expirer dans mes bras. - -\bigskip - -\textbf{Vin qui p\'etille, femme gentille} - -\textbf{Sous tes baisers br\^ulant d'amour, oui d'amour} - -\textbf{Plaisirs... batailles... vive la canaille} - -\textbf{Je bois, je chante et je tue tour \`a tour.} - -\bigskip - -Etant forban je vis dans ma cabine - -En m\'eprisant les lois , m\^eme la mort - -Ne vivant que de meurtre et de rapine - -Je bois mon vin dans une coupe d'or - -Vivre d'orgie est ma seule esp\'erance - -Le seul bonheur que j'ai su conqu\'erir - -car sur les flots j'ai berc\'e mon enfance - -Et sur les flots un forban doit mourir - -\bigskip - -Pendu au m\^at d'une barque \'etrang\`ere - -Mon corps un jour servira d'\'etendard - -Et tout mon sang rougira la gal\`ere - -Aujourd'hui f\^ete et demain le hasard - -Allons esclaves, debout mes braves - -Buvons l'ivresse et l'orgie \`a grands flots - -Aujourd'hui f\^ete , demain peut \^etre - -Mon corps ira s'engloutir dans les flots - -\bigskip - -Si par hasard par un coup de fortune - -Je capturais l'or d'un beau galion - -Riche \`a pouvoir d\'ecrocher la lune - -Je m'en irai vers d'autres horizons - -L\`a, v\'en\'er\'e tout comme un gentilhomme - -Moi qui ne fut qu'un forban qu'un bandit - -L\`a je pourrais peut \^etre tout comme - -Un grand roi dormir dedans un bon lit diff --git a/sea/mermaid.tex b/sea/mermaid.tex deleted file mode 100644 index a4c7cd3..0000000 --- a/sea/mermaid.tex +++ /dev/null @@ -1,80 +0,0 @@ -\begin{SBVerse*} -Twas \Ch{G}{Friday} morn when \Ch{C}{we} set \Ch{G}{sail} - -And \Ch{C}{we} were not \Ch{D7}{far} from the \Ch{G}{land} - -When the captain, he spied a \Ch{C}{lovely} \Ch{G}{mermaid} - -With a \Ch{C}comb and a \Ch{D7}{glass} in her \Ch{G}{hand} -\end{SBVerse*} - -\bigskip - -\begin{SBChorus} -O the ocean's waves will roll - -And the stormy winds will \Ch{D7}{blow} - -While \Ch{G}{we} poor sailors go \Ch{C}{skipping} to the \Ch{G}{top} - -And the \Ch{C}{landlubbers} \Ch{D7}{lie} down \Ch{G}{below} (below, below) - -And the \Ch{C}{landlubbers} \Ch{D7}{lie} down \Ch{G}{below} -\end{SBChorus} - -\bigskip - -And up spoke the captain of our gallant ship - -And a well-spoken man was he - -I have me a wife in Salem by the sea - -And tonight she a widow will be - -\bigskip - -And up spoke the cookie of our gallant ship - -And a red hot cookie was he - -Saying I care much more for my pots and my pans - -Than I do for the bottom of the sea - -\bigskip - -Then up spoke the cabinboy, of our gallant ship - -And a nasty little lad was he. - -I'm not quite sure I can spell \og mermaid \fg - -But I'm going to the bottom of the sea. - -\bigskip - -Then three times around went our gallant ship - -And three times around went she - -Three times around went our gallant ship - -And she sank to the bottom of the sea - -%%%%%%%%%%%%% A AJOUTER %%%%%%%%%%%%%%%% -%KEY G - -%verse: -%G G C C -%C D7 G -%G G C C -%C D7 G - - -%chorus: -%G G G G -%G G D7 D7 -%G G C C -%C D7 G -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff --git a/sea/quinze_marins.tex b/sea/quinze_marins.tex deleted file mode 100644 index e23aede..0000000 --- a/sea/quinze_marins.tex +++ /dev/null @@ -1,51 +0,0 @@ -\begin{SBChorus} -\Ch{Dm}{Quinze} marins sur le bahut du \Ch{C}{mort} - -Hop la ho ! une bouteille de \Ch{Dm}{rhum} - -A boire et l'diable avait r\'egl\'e leur \Ch{C}{sort} - -Hop la \Ch{Dm}{ho} ! une \Ch{C}{bouteille} de \Ch{Dm}{rhum} -\end{SBChorus} - -\bigskip - -\begin{SBVerse} -Long John Silver a pris le commandement - -Des marins, et vogue la gal\`ere - -Il tient ses hommes comme il tient le vent - -Tout l'monde a peur de Long John Silver. -\end{SBVerse} - -\bigskip - -C'est Bill, le second du corsaire, - -Le capitaine Flint en col\`ere - -Qu'est revenu du royaume des morts - -Pour hanter la cache au tr\'esor. - -\bigskip - -Essaye un peu de l'contrecarrer, - -Et tu iras o\`u tant d'autres sont all\'es - -Quelqu's uns aux vergues et quelqu's uns par d'sus bord - -Tout l'monde pour nourrir les poissons d'abord. - -\bigskip - -Nous finirons par danser la gigue - -La corde au cou, au quai des pendus - -Toi, John Forest, et toi, John Merigue - -Si pr\`es du gibet qu'j'en ai l'cou tordu. diff --git a/sea/sea.tex b/sea/sea.tex deleted file mode 100644 index 54f8cd3..0000000 --- a/sea/sea.tex +++ /dev/null @@ -1,26 +0,0 @@ -\begin{song}{Irish Rover}{G}{~}{irish traditional}{}{} - \input{sea/irish_rover.tex} -\end{song} - -\begin{song}{The Mermaid}{G}{Child Ballad 289}{traditional}{}{} - \input{sea/mermaid.tex} -\end{song} - -\begin{song}{Quinze Marins (\textit{Dead Man's Chest})}{Dm}{~}{R.L. Stevenson and Y.E. Allison}{}{} - \input{sea/quinze_marins.tex} -\end{song} - -\begin{song}{Drunken Sailor}{Dm}{Capstan shanty}{traditional}{}{} - \input{sea/drunken_sailor.tex} -\end{song} - -\begin{song}{Le Forban (version de terre)}{C}{~}{traditionnel breton}{}{} - \input{sea/le_forban1.tex} -\end{song} - -\begin{song}{Le Forban (version de mer)}{C}{~}{traditionnel breton}{}{} - \input{sea/le_forban2.tex} -\end{song} - -\input{sea/sally.tex} -\input{sea/kanak.tex} \ No newline at end of file diff --git a/songbook-makeindex.py b/songbook-makeindex.py new file mode 100755 index 0000000..e2af3e0 --- /dev/null +++ b/songbook-makeindex.py @@ -0,0 +1,124 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- +# Generate indexes files for the Crep's chordbook compilation. This is +# a replacement for the original makeindex program written in C that +# produces an index file (.sbx) from a file generated by the latex +# compilation of the songbook (.sxd). +# +# Usage : songbook-makeindex.py src +# src is the .sxd file generated by latex +# + +import sys +import os.path +import glob +import re +from optparse import OptionParser + +# Pattern set to ignore latex command in title prefix +keywordPattern = re.compile(r"^%(\w+)\s?(\w*)") +firstLetterPattern = re.compile(r"^(?:\{?\\\w+\}?)*[^\w]*(\w)") + +class index: + data = dict() + keywords = dict() + + def filter(self, key): + letter = firstLetterPattern.match(key).group(1) + if re.match('\d',letter): + letter = '0-9' + return (letter.upper(), key) + + def keyword(self, key, word): + if not self.keywords.has_key(key): + self.keywords[key] = [] + self.keywords[key].append(word) + + def compileKeywords(self): + pass + + def add(self, key, number, link): + (first, key) = self.filter(key) + if not self.data.has_key(first): + self.data[first] = dict() + if not self.data[first].has_key(key): + self.data[first][key] = [] + self.data[first][key].append({'num':number, 'link':link}) + + def refToStr(self, ref): + if sys.version_info >= (2,6): + return '\\hyperlink{{{0[link]}}}{{{0[num]}}}'.format(ref) + else: + return '\\hyperlink{%(link)s}{%(num)s}' % ref + + def entryToStr(self, key, entry): + if sys.version_info >= (2,6): + return '\\idxentry{{{0}}}{{{1}}}\n'.format(key, '\\\\'.join(map(self.refToStr, entry))) + else: + return '\\idxentry{%s}{%s}\n' % (key, '\\\\'.join(map(self.refToStr, entry))) + + def idxBlockToStr(self, letter, entries): + str = '\\begin{idxblock}{'+letter+'}'+'\n' + for key in sorted(entries.keys()): + str += self.entryToStr(key, entries[key]) + str += '\\end{idxblock}'+'\n' + return str + + def entriesToStr(self): + str = "" + for letter in sorted(self.data.keys()): + str += self.idxBlockToStr(letter, self.data[letter]) + return str + +def processSXDEntry(tab): + return (tab[0], tab[1], tab[2]) + +def processSXD(filename): + file = open(filename) + data = [] + for line in file: + data.append(line.strip()) + file.close() + + type = data[0] + i = 1 + idx = index() + while data[i].startswith('%'): + keywords = keywordPattern.match(data[i]).groups() + idx.keyword(keywords[0],keywords[1]) + i += 1 + idx.compileKeywords() + for i in range(i,len(data),3): + entry = processSXDEntry(data[i:i+3]) + idx.add(entry[0],entry[1],entry[2]) + return idx + +def usage(exitCode=None): + print "usage: songbook-makeindex.py [options] source" + sys.exit(exitCode) + +def main(): + usage = "usage: %prog [options] FILE" + parser = OptionParser(usage) + parser.add_option("-o", "--output", dest="filename", + help="write result into FILE", metavar="FILE") + (options, args) = parser.parse_args() + + # Args processing + if len(args) != 1: + parser.error("incorrect number of arguments") + if not os.path.exists(args[0]): + parser.error("inexistant input file") + + # Options processing + if options.filename: + output = open(options.filename,"w") + else: + output = sys.stdout + + # Actual processing + idx = processSXD(args[0]) + output.write(idx.entriesToStr()) + +if __name__ == '__main__': + main() diff --git a/songbook.py b/songbook.py new file mode 100755 index 0000000..7e556f4 --- /dev/null +++ b/songbook.py @@ -0,0 +1,191 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- +# + +import getopt, sys +import os.path +import glob +import re +import json + +def matchRegexp(reg, iterable): + return [ m.group(1) for m in (reg.match(l) for l in iterable) if m ] + +def songslist(songs): + directories = set(["img/"] + map(lambda x: "songs/" + os.path.dirname(x), songs)) + result = ['\\graphicspath{'] + [ ' {{{0}/}},'.format(d) for d in directories ] + ['}'] + [ '\\input{{songs/{0}}}'.format(s.strip()) for s in songs ] + return '\n'.join(result) + +def parseTemplate(template): + embeddedJsonPattern = re.compile(r"^%%:") + f = open(template) + code = [ line[3:-1] for line in f if embeddedJsonPattern.match(line) ] + f.close() + data = json.loads(''.join(code)) + parameters = dict() + for param in data: + parameters[param["name"]] = param + return parameters + +def toValue(parameter, data): + if "type" not in parameter: + return data + elif parameter["type"] == "stringlist": + if "join" in parameter: + joinText = parameter["join"] + else: + joinText = '' + return joinText.join(data) + elif parameter["type"] == "color": + return data[1:] + elif parameter["type"] == "font": + return data+'pt' + elif parameter["type"] == "enum": + return data + elif parameter["type"] == "file": + return data + elif parameter["type"] == "flag": + if "join" in parameter: + joinText = parameter["join"] + else: + joinText = '' + return joinText.join(data) + +def formatDeclaration(name, parameter): + value = "" + if "default" in parameter: + value = parameter["default"] + return '\\def\\set@{name}#1{{\\def\\get{name}{{#1}}}}\n'.format(name=name) + formatDefinition(name, toValue(parameter, value)) + +def formatDefinition(name, value): + return '\\set@{name}{{{value}}}\n'.format(name=name, value=value) + +def makeTexFile(sb, output): + name = output[:-4] + + # default value + template = "patacrep.tmpl" + songs = [] + + # parse the songbook data + if "template" in sb: + template = sb["template"] + del sb["template"] + if "songs" in sb: + songs = sb["songs"] + del sb["songs"] + + parameters = parseTemplate("templates/"+template) + + # output relevant fields + out = open(output, 'w') + out.write('%% This file has been automatically generated, do not edit!\n') + out.write('\\makeatletter\n') + # output automatic parameters + out.write(formatDeclaration("name", {"default":name})) + out.write(formatDeclaration("songslist", {"type":"stringlist"})) + # output template parameter command + for name, parameter in parameters.iteritems(): + out.write(formatDeclaration(name, parameter)) + # output template parameter values + for name, value in sb.iteritems(): + if name in parameters: + out.write(formatDefinition(name, toValue(parameters[name],value))) + # output songslist + if songs == "all": + songs = map(lambda x: x[6:], glob.glob('songs/*/*.sg')) + songs.sort() + if len(songs) > 0: + out.write(formatDefinition('songslist', songslist(songs))) + out.write('\\makeatother\n') + + # output template + commentPattern = re.compile(r"^\s*%") + f = open("templates/"+template) + content = [ line for line in f if not commentPattern.match(line) ] + f.close() + out.write(''.join(content)) + out.close() + +def makeDepend(sb, output): + name = output[:-2] + + dependsPattern = re.compile(r"^[^%]*(?:include|input)\{(.*?)\}") + indexPattern = re.compile(r"^[^%]*\\(?:newauthor|new)index\{.*\}\{(.*?)\}") + lilypondPattern = re.compile(r"^[^%]*\\(?:lilypond)\{(.*?)\}") + + # check for deps (in sb data) + deps = matchRegexp(dependsPattern, [ v for v in sb.itervalues() if type(v) is not list ]) + if sb["songs"] == "all": + deps += glob.glob('songs/*/*.sg') + else: + deps += map(lambda x: "songs/" + x, sb["songs"]) + + # check for lilypond deps (in songs data) if necessary + lilypond = [] + if "bookoptions" in sb and "lilypond" in sb["bookoptions"]: + for filename in deps: + tmpl = open(filename) + lilypond += matchRegexp(lilypondPattern, tmpl) + tmpl.close() + + # check for index (in template file) + if "template" in sb: + filename = sb["template"] + else: + filename = "patacrep.tmpl" + tmpl = open("templates/"+filename) + idx = map(lambda x: x.replace("\getname", name), matchRegexp(indexPattern, tmpl)) + tmpl.close() + + # write .d file + out = open(output, 'w') + out.write('{0} {1} : {2}\n'.format(output, name+".tex", ' '.join(deps))) + out.write('{0} : {1}\n'.format(name+".pdf", ' '.join(map(lambda x: x+".sbx",idx)+map(lambda x: "lilypond/"+x+".pdf", lilypond)))) + out.write('\t$(LATEX) {0}\n'.format(name+".tex")) + out.write('{0} : {1}\n'.format(' '.join(map(lambda x: x+".sxd",idx)), name+".aux")) + out.close() + +def usage(): + print "No usage information yet." + +def main(): + try: + opts, args = getopt.getopt(sys.argv[1:], + "hs:o:d", + ["help","songbook=","output=","depend"]) + except getopt.GetoptError, err: + # print help and exit + print str(err) + usage() + sys.exit(2) + + songbook = None + depend = False + output = None + + for o, a in opts: + if o in ("-h", "--help"): + usage() + sys.exit() + elif o in ("-s", "--songbook"): + songbook = a + elif o in ("-d", "--depend"): + depend = True + elif o in ("-o", "--output"): + output = a + else: + assert False, "unhandled option" + + if songbook and output: + f = open(songbook) + sb = json.load(f) + f.close() + + if depend: + makeDepend(sb, output) + else: + makeTexFile(sb, output) + +if __name__ == '__main__': + main() diff --git a/songbook.sb b/songbook.sb new file mode 100644 index 0000000..d9fd26b --- /dev/null +++ b/songbook.sb @@ -0,0 +1,29 @@ +{ +"template" : "ancient.tmpl", +"author" : "Benjamin Coudrin", +"bookoptions" : [ + "lilypond" + ], +"booktype" : "chorded", +"footer" : "\\begin{flushleft}Shiver Me Timbers\\end{flushleft}", +"indexbgcolor" : "#D1E4AE", +"license" : "\\input{license.tex}", +"mail" : "benjamin.coudrin@gmail.com", +"mainfontsize" : "10", +"notebgcolor" : "#FFFDB3", +"picture" : "shiver", +"picturecopyright" : "WTFPL - Do What The Fuck You Want Public License", +"songnumberbgcolor" : "#BA8D5A", +"title" : "Shiver Me Timbers", +"version" : "1.0.0", +"web" : "http://www.myspace.com/shivermetimbersofficial", +"songs" : [ + "Traditional/Irish_Rover.sg", + "Traditional/Johnny_I_Harldy_Knew_Ye_.sg", + "Traditional/Rocky_Road_To_Dublin.sg", + "Traditional/The_Furze_in_Bloom_jig_.sg", + "Traditional/The_Jug_of_Punch.sg", + "Traditional/Whiskey_In_The_Jar.sg", + "Traditional/Whiskey_You_re_the_Devil.sg" + ] +} diff --git a/songbook.sty b/songbook.sty deleted file mode 100644 index d18a8ba..0000000 --- a/songbook.sty +++ /dev/null @@ -1,1393 +0,0 @@ -%% -%% This is file `songbook.sty', -%% generated with the docstrip utility. -%% -%% The original source files were: -%% -%% songbook.dtx (with options: `package') -%% -%% This is a generated file. -%% -%% Copyright 1992--2002 Christopher Rath -%% -%% This package is free software; you can redistribute it and/or -%% modify it under the terms of the GNU Lesser General Public -%% License as published by the Free Software Foundation; either -%% version 2.1 of the License, or (at your option) any later -%% version. -%% -%% This package is distributed in the hope that it will be -%% useful, but WITHOUT ANY WARRANTY; without even the implied -%% warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR -%% PURPOSE. See the GNU Lesser General Public License for more -%% details. -%% -%% The list of all files belonging to the LaTeX Songbook Style is -%% given in the file `relnotes.txt'. -%% -%% \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 -%% Lower-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 -%% Digits \0\1\2\3\4\5\6\7\8\9 -%% Exclamation \! Double quote \" Hash (number) \# -%% Dollar \$ Percent \% Ampersand \& -%% Acute accent \' Left paren \( Right paren \) -%% Asterisk \* Plus \+ Comma \, -%% Minus \- Point \. Solidus \/ -%% Colon \: Semicolon \; Less than \< -%% Equals \= Greater than \> Question mark \? -%% Commercial at \@ Left bracket \[ Backslash \\ -%% Right bracket \] Circumflex \^ Underscore \_ -%% Grave accent \` Left brace \{ Vertical bar \| -%% Right brace \} Tilde \~} -%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% %% -%% I D E N T I F I C A T I O N P A R T %% -%% %% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% -%% rcsid = @(#)$Id: songbook.dtx,v 1.13 2007/02/04 04:12:40 rathc Exp $ -%% -\NeedsTeXFormat{LaTeX2e} -\ProvidesPackage{songbook}[2007/02/03 v4.3 All purpose Songbook style] -\typeout{Document Subclass: songbook 2007/02/03 v4.3 All purpose Songbook style} -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% %% -%% I N I T I A L C O D E P A R T %% -%% %% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -%%======================================================== -%% E A R L Y P A C K A G E D E P E N D E N C I E S % -%%======================================================== -\RequirePackage{calc} - -%%======================================================== -%% I F C O N S T R U C T S % -%%======================================================== -\newif\ifChordBk \ChordBkfalse -\newif\ifOverhead \Overheadfalse -\newif\ifWordBk \WordBkfalse -\newif\ifWordsOnly \WordsOnlyfalse -\newif\ifNotWordsOnly \NotWordsOnlyfalse -\newif\ifSBinSongEnv \SBinSongEnvfalse -\newif\ifCompactSongMode\CompactSongModefalse -\newif\ifExcludeSong \ExcludeSongfalse -\newif\ifPrintAllSongs \PrintAllSongsfalse -\newif\ifSamepageMode \SamepageModefalse -\newif\ifSongEject \SongEjecttrue -\newif\ifSBpaperAfour \SBpaperAfourfalse -\newif\ifSBpaperAfive \SBpaperAfivefalse -\newif\ifSBpaperBfive \SBpaperBfivefalse -\newif\ifSBpaperLtr \SBpaperLtrfalse -\newif\ifSBpaperLgl \SBpaperLglfalse -\newif\ifSBpaperExc \SBpaperExcfalse -%%======================================================== -%% F O N T S % -%%======================================================== -\newcommand{\ChBassFont}{\normalsize\bf\sf} % = cmss12 at 12.0pt -\newcommand{\ChFont}{\large\fontfamily{\sfdefault}% - \fontseries{sbc}\fontshape{n}\selectfont} %=cmssbc12 at 14.4pt -\newcommand{\ChBkFont}{\ChFont\fontseries{m} % - \selectfont} % =cmssm12 at 14.4pt -\newcommand{\CpyRtFont}{\footnotesize} % = cmr10 at 10pt -\newcommand{\CpyRtInfoFont}{\tiny} % = cmss8 at 8pt -\newcommand{\STitleFont}{\large\bf\sf} % = cmss12 at 14.4pt -\newcommand{\STitleKeyFont}{\large} % = cmr12 at 14.4pt -\font\STNFont=cmtt12 at 20pt -\newcommand{\STitleNumberFont}{\STNFont} % = cmtt12 at 20pt -\newcommand{\ScriptRefFont}{\footnotesize} % = cmr10 at 10pt -\newcommand{\WandMFont}{\footnotesize} % = cmr10 at 10pt -\newcommand{\SBBracketTagFont}{\small\bf\sf} % = cmss10 at 10.0pt -\newcommand{\SBBridgeTagFont}{\SBEndTagFont} % = cmss10 at 10.9pt -\newcommand{\SBChorusTagFont}{\small\bf\sf} % = cmss10 at 10.9pt -\newcommand{\SBEndTagFont}{\small\bf\sf} % = cmss10 at 10.9pt -\newcommand{\SBIntroTagFont}{\SBEndTagFont} % = cmss10 at 10.9pt -\font\SBOBFont=cmss17 at 30pt -\newcommand{\SBOccursBrktFont}{\SBOBFont} % = cmss17 at 30pt -\newcommand{\SBOccursTagFont}{\small\bf\sf} % = cmss10 at 10.0pt -\newcommand{\SBVerseNumberFont}{\small\bf\sf} % = cmss10 at 10.9pt -\newcommand{\SBSectionNumberFont}{\small\bf\sf} % = cmss10 at 10.9pt - -\newcommand{\SBMargNoteFont}{\scriptsize} % = cmti8 at 8pt -\newcommand{\SBRefFont}{\SBMargNoteFont} % = cmti8 at 8pt -\newcommand{\SBDefaultFont}{\fontfamily{\rmdefault}% - \large} % = cmr12 at 14.4pt -\newcommand{\SBLyricNoteFont}{\footnotesize\sf} % = cmss10 at 10pt -\newcommand{\SBOHContTagFont}{\small\bf\sf\itshape} % = cmss10 at 10.9pt - -%%======================================================== -%% C O N F I G U R A B L E D I M E N S I O N S % -%%======================================================== -\newcommand{\HangAmt} {1.5em} -\newcommand{\LeftMarginSBBracket}{2.85em} -\newcommand{\LeftMarginSBChorus} {4em} -\newcommand{\LeftMarginSBSection}{\LeftMarginSBChorus} -\newcommand{\LeftMarginSBVerse} {\LeftMarginSBChorus} -\newcommand{\SBChordRaise} {2.25ex} -\newcommand{\SBOldChordRaise} {2.90ex} -\newcommand{\SBRuleRaiseAmount} {0.57ex} -\newcommand{\SpaceAboveSTitle} {0.5in} -\newcommand{\SpaceAfterTitleBlk} {-1.75ex} -\newcommand{\SpaceAfterChorus} {\vspace{0ex plus0ex minus3ex}} -\newcommand{\SpaceAfterOpGroup} {\vspace{0ex plus0ex minus3ex}} -\newcommand{\SpaceAfterSBBracket}{\vspace{2ex plus1ex minus1ex}} -\newcommand{\SpaceAfterSection} {\vspace{0ex plus0ex minus3ex}} -\newcommand{\SpaceAfterSong} {\vspace{0ex plus10ex minus3ex}} -\newcommand{\SpaceAfterVerse} {\vspace{0ex plus0ex minus3ex}} -\newcommand{\SpaceBeforeSBBracket}{\vspace{1ex plus1ex minus1ex}} - -\newlength{\chSpaceTolerance} \setlength{\chSpaceTolerance}{1.5mm} -\newlength{\chMiniSpace} \setlength{\chMiniSpace} {0.3mm} -\newlength{\sbBaselineSkipAmt} \setlength{\sbBaselineSkipAmt}{0pt} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% %% -%% D E C L A R A T I O N O F O P T I O N S %% -%% %% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -%%=======================================================% -%% P A P E R S I Z E O P T I O N S % -%%=======================================================% -\DeclareOption{a4paper}{% Paper size: 210mm x 297mm - \SBpaperAfourtrue - \SBpaperAfivefalse - \SBpaperBfivefalse - \SBpaperLtrfalse - \SBpaperLglfalse - \SBpaperExcfalse -} - -\DeclareOption{a5paper}{% Paper size: 148mm x 210mm - \SBpaperAfourfalse - \SBpaperAfivetrue - \SBpaperBfivefalse - \SBpaperLtrfalse - \SBpaperLglfalse - \SBpaperExcfalse -} - -\DeclareOption{b5paper}{% Paper size: 176mm x 250mm - \SBpaperAfourfalse - \SBpaperAfivefalse - \SBpaperBfivetrue - \SBpaperLtrfalse - \SBpaperLglfalse - \SBpaperExcfalse -} - -\DeclareOption{letterpaper}{% Paper size: 8.5in x 11in - \SBpaperAfourfalse - \SBpaperAfivefalse - \SBpaperBfivefalse - \SBpaperLtrtrue - \SBpaperLglfalse - \SBpaperExcfalse -} - -\DeclareOption{legalpaper}{% Paper size: 8.5in x 14in - \SBpaperAfourfalse - \SBpaperAfivefalse - \SBpaperBfivefalse - \SBpaperLtrfalse - \SBpaperLgltrue - \SBpaperExcfalse -} - -\DeclareOption{executivepaper}{% Paper size: 7.25in x 10.5in - \SBpaperAfourfalse - \SBpaperAfivefalse - \SBpaperBfivefalse - \SBpaperLtrfalse - \SBpaperLglfalse - \SBpaperExctrue -} - -%%=======================================================% -%% C O M P A C T S O N G O P T I O N % -%%=======================================================% -\DeclareOption{compactsong}{% - %%% - % Set flag to indicate the user wants compact song mode. - \CompactSongModetrue -} - -%%=======================================================% -%% P R I N T A L L S O N G S O P T I O N % -%%=======================================================% -\DeclareOption{printallsongs}{% - %%% - % Set flag to indicate the user wants to print all songs. - \PrintAllSongstrue -} - -%%=======================================================% -%% S O N G B O O K C O R E O P T I O N S % -%%=======================================================% -\DeclareOption{chordbk}{% - \ChordBktrue - \WordBkfalse - \Overheadfalse - \WordsOnlyfalse - \NotWordsOnlytrue - \SongEjecttrue - - \voffset=-1.00in - \hoffset=-1.00in - - \ifSBpaperAfour - \topmargin=0.5in - \headheight=0.21in - \headsep=0.2in - \textheight=10.0in - \footskip=0.19in - % - \oddsidemargin=0.618in - \evensidemargin=1.4in - \textwidth=6.25in - \marginparsep=0.2in - \marginparwidth=0.8in - \else\ifSBpaperAfive - \topmargin=6.0mm - \headheight=5.334mm - \headsep=2.666mm - \textheight=185.17mm - \footskip=4.826mm - % - \oddsidemargin=12.0mm - \evensidemargin=30.0mm - \textwidth=106.0mm - \marginparsep=3.68mm - \marginparwidth=20.32mm - \renewcommand{\ChBassFont}{\small\bf\sf} % = cmss12 at 11.0pt - \renewcommand{\ChFont}{\normalsize\fontfamily{\sfdefault}% - \fontseries{sbc}\fontshape{n}\selectfont} %=cmssbc12 at 12.0pt - \renewcommand{\ChBkFont}{\ChFont\fontseries{m} % - \selectfont} % =cmssm12 at 12.0pt - \renewcommand{\SBDefaultFont}{\normalsize} % = cmr12 at 12.0pt - \renewcommand{\SBOccursBrktFont}{\large\bf\sf} % = cmss10 at 10.9pt - \else\ifSBpaperBfive - \topmargin=10.0mm - \headheight=5.334mm - \headsep=5.0mm - \textheight=214.84mm - \footskip=4.826mm - % - \oddsidemargin=20.0mm - \evensidemargin=34.0 mm - \textwidth=122.0mm - \marginparsep=3.68mm - \marginparwidth=20.32mm - \renewcommand{\ChBassFont}{\small\bf\sf} % = cmss12 at 11.0pt - \renewcommand{\ChFont}{\normalsize\fontfamily{\sfdefault}% - \fontseries{sbc}\fontshape{n}\selectfont} %=cmssbc12 at 12.0pt - \renewcommand{\ChBkFont}{\ChFont\fontseries{m} % - \selectfont} % =cmssm12 at 12.0pt - \renewcommand{\SBDefaultFont}{\normalsize} % = cmr12 at 12.0pt - \renewcommand{\SBOccursBrktFont}{\large\bf\sf} % = cmss10 at 10.9pt - \else\ifSBpaperLtr - \topmargin=0.5in - \headheight=0.21in - \headsep=0.20in - \textheight=9.4in - \footskip=0.19in - % - \oddsidemargin=0.75in - \evensidemargin=1.5in - \textwidth=6.25in - \marginparsep=0.2in - \marginparwidth=0.8in - \else\ifSBpaperLgl - \topmargin=0.5in - \headheight=0.21in - \headsep=0.20in - \textheight=12.4in - \footskip=0.19in - % - \oddsidemargin=0.75in - \evensidemargin=1.5in - \textwidth=6.25in - \marginparsep=0.2in - \marginparwidth=0.8in - \else\ifSBpaperExc - \topmargin=0.25in - \headheight=0.21in - \headsep=0.165in - \textheight=9.435in - \footskip=0.19in - % - \oddsidemargin=0.5in - \evensidemargin=1.25in - \textwidth=5.5in - \marginparsep=0.2in - \marginparwidth=0.8in - \fi\fi\fi\fi\fi\fi - - \raggedbottom - - \ifCompactSongMode - \renewcommand{\ChBassFont}{\small\bf\sf} % = cmss12 at 11.0pt - \renewcommand{\ChFont}{\normalsize\fontfamily{\sfdefault}% - \fontseries{sbc}\fontshape{n}\selectfont} %=cmssbc12 at 12.0pt - \renewcommand{\ChBkFont}{\ChFont\fontseries{m} % - \selectfont} % =cmssm12 at 12.0pt - \renewcommand{\SBDefaultFont}{\normalsize} % = cmr12 at 12.0pt - \renewcommand{\SBOccursBrktFont}{\large\bf\sf} % = cmss10 at 10.9pt - - \setlength{\columnsep}{0.25in} - - \addtolength{\textwidth} {\marginparsep + \marginparwidth} - \addtolength{\evensidemargin}{-\marginparsep - \marginparwidth} - \setlength {\marginparsep} {0in} - \setlength {\marginparwidth}{0in} - - \setlength{\chSpaceTolerance}{1.0mm} - - \renewcommand{\HangAmt} {1.5em} - \renewcommand{\LeftMarginSBChorus} {2em} - \renewcommand{\LeftMarginSBSection}{\LeftMarginSBChorus} - \renewcommand{\LeftMarginSBVerse} {\LeftMarginSBChorus} - \fi -} - -\DeclareOption{wordbk}{% - \ChordBkfalse - \WordBktrue - \Overheadfalse - \WordsOnlytrue - \NotWordsOnlyfalse - \SongEjectfalse - - \renewcommand{\SBDefaultFont}{\normalsize} - \font\mySTNFont=cmtt12 at 17pt - \renewcommand{\STitleNumberFont}{\mySTNFont} - \renewcommand{\CpyRtFont}{\scriptsize} - \renewcommand{\WandMFont}{\scriptsize} - \renewcommand{\ScriptRefFont}{\scriptsize} - \renewcommand{\SBOccursBrktFont}{\large\bf\sf} - - \renewcommand{\SpaceAboveSTitle} {0.25in} - \renewcommand{\LeftMarginSBChorus} {1.5em} - \renewcommand{\LeftMarginSBSection}{\LeftMarginSBChorus} - \renewcommand{\LeftMarginSBVerse} {\LeftMarginSBChorus} - - \voffset=-1.00in - \hoffset=-1.00in - - \ifSBpaperAfour - \topmargin=0.5in - \headheight=0.21in - \headsep=0.2in - \textheight=10.0in - \footskip=0.19in - % - \oddsidemargin=0.618in - \evensidemargin=0.4in - \textwidth=7.25in - \marginparsep=0.0in - \marginparwidth=0.0in - \else\ifSBpaperAfive - \topmargin=6.0mm - \headheight=5.334mm - \headsep=2.666mm - \textheight=185.17mm - \footskip=4.826mm - % - \oddsidemargin=12.0mm - \evensidemargin=6.0mm - \textwidth=130.0mm - \marginparsep=0.0mm - \marginparwidth=0.0mm - \else\ifSBpaperBfive - \topmargin=10.0mm - \headheight=5.334mm - \headsep=5.0mm - \textheight=214.84mm - \footskip=4.826mm - % - \oddsidemargin=20.0mm - \evensidemargin=10.0mm - \textwidth=146.0mm - \marginparsep=0.0mm - \marginparwidth=0.0mm - \else\ifSBpaperLtr - \topmargin=0.5in - \headheight=0.21in - \headsep=0.10in - \textheight=9.4in - \footskip=0.29in - % - \oddsidemargin=0.75in - \evensidemargin=0.5in - \textwidth=7.25in - \marginparsep=0.0in - \marginparwidth=0.0in - \else\ifSBpaperLgl - \topmargin=0.5in - \headheight=0.21in - \headsep=0.20in - \textheight=12.4in - \footskip=0.19in - % - \oddsidemargin=0.75in - \evensidemargin=0.5in - \textwidth=7.25in - \marginparsep=0.0in - \marginparwidth=0.0in - \else\ifSBpaperExc - \topmargin=0.25in - \headheight=0.21in - \headsep=0.165in - \textheight=9.435in - \footskip=0.19in - % - \oddsidemargin=0.5in - \evensidemargin=0.25in - \textwidth=6.5in - \marginparsep=0.0in - \marginparwidth=0.0in - \fi\fi\fi\fi\fi\fi - - \raggedright - - \ifCompactSongMode - \typeout{``compactsong'' mode not implemented for Wordbk mode.} - \CompactSongModefalse - \fi -} - -\DeclareOption{overhead}{% - \ChordBkfalse - \WordBkfalse - \Overheadtrue - \WordsOnlytrue - \NotWordsOnlyfalse - \SongEjecttrue - - \def\@mss{cmssdc10} - \renewcommand{\SBDefaultFont}{\LARGE\bf\sf} - \renewcommand{\STitleNumberFont}{\Large\sf} - \renewcommand{\STitleFont}{\LARGE\sf} - \renewcommand{\CpyRtFont}{\normalsize\rm} - \renewcommand{\CpyRtInfoFont}{\normalsize\rm} - \renewcommand{\WandMFont}{\normalsize\rm} - \renewcommand{\ScriptRefFont}{\normalsize\rm} - \renewcommand{\SBLyricNoteFont}{\normalsize\rm} - \renewcommand{\SBChorusTagFont}{\Large\sf} - \renewcommand{\SBVerseNumberFont}{\Large\sf} - \renewcommand{\SBSectionNumberFont}{\Large\sf} - \renewcommand{\SBOccursTagFont}{\Large\sf} - \renewcommand{\SBOccursBrktFont}{\huge\sf} - \renewcommand{\SBBracketTagFont}{\Large\sf} - \renewcommand{\SBOHContTagFont}{\Large\sf\itshape} - - \renewcommand{\SpaceAboveSTitle} {0.25in} - \renewcommand{\LeftMarginSBBracket}{2.25em} - \renewcommand{\LeftMarginSBChorus} {1.5em} - \renewcommand{\LeftMarginSBSection}{\LeftMarginSBChorus} - \renewcommand{\LeftMarginSBVerse} {\LeftMarginSBChorus} - - \renewcommand{\baselinestretch}{.9} - - \voffset=-1.00in - \hoffset=-1.00in - - \ifSBpaperAfour - \topmargin=0.25in - \headheight=0.25in - \headsep=0.0in - \textheight=10.3in - \footskip=0.2in - % - \oddsidemargin=1.134in - \evensidemargin=1.134in - \textwidth=6.0in - \marginparsep=0.0in - \marginparwidth=0.0in - \else\ifSBpaperAfive - \topmargin=0.0mm - \headheight=5.334mm - \headsep=0.0mm - \textheight=193.666mm - \footskip=4.826mm - % - \oddsidemargin=9.0mm - \evensidemargin=9.0mm - \textwidth=130.0mm - \marginparsep=0.0mm - \marginparwidth=0.0mm - \else\ifSBpaperBfive - \topmargin=0.666mm - \headheight=5.334mm - \headsep=0.0mm - \textheight=229.0mm - \footskip=4.826mm - % - \oddsidemargin=15.0mm - \evensidemargin=15.0mm - \textwidth=146.0mm - \marginparsep=0.0mm - \marginparwidth=0.0mm - \else\ifSBpaperLtr - \topmargin=0.25in - \headheight=0.25in - \headsep=0.0in - \textheight=9.75in - \footskip=0.2in - % - \oddsidemargin=1.25in - \evensidemargin=1.25in - \textwidth=6.0in - \marginparsep=0.0in - \marginparwidth=0.0in - \else\ifSBpaperLgl - \topmargin=0.25in - \headheight=0.25in - \headsep=0.0in - \textheight=12.8in - \footskip=0.2in - % - \oddsidemargin=1.25in - \evensidemargin=1.25in - \textwidth=6.0in - \marginparsep=0.0in - \marginparwidth=0.0in - \else\ifSBpaperExc - \topmargin=0.25in - \headheight=0.21in - \headsep=0.0in - \textheight=9.6in - \footskip=0.19in - % - \oddsidemargin=0.625in - \evensidemargin=0.625in - \textwidth=6.0in - \marginparsep=0.0in - \marginparwidth=0.0in - \fi\fi\fi\fi\fi\fi - - \raggedright - \raggedbottom - - \ifCompactSongMode - \typeout{``compactsong'' mode not implemented for Overhead mode.} - \CompactSongModefalse - \fi -} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% %% -%% E X E C U T I O N O F O P T I O N S %% -%% %% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -\ExecuteOptions{letterpaper} -\ProcessOptions - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% %% -%% P A C K A G E L O A D I N G P A R T %% -%% %% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -\RequirePackage{conditionals} - -\RequirePackage{ifthen} - -\ifCompactSongMode - \RequirePackage{multicol}[1999/05/25] -\fi - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% %% -%% M A I N C O D E P A R T %% -%% %% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -\AtBeginDocument{% - \setbox0=\hbox{} - % - \ifChordBk\setbox0=\hbox{1}\fi - \ifWordBk\setbox0=\hbox{1}\fi - \ifOverhead\setbox0=\hbox{1}\fi - % - \ifthenelse{\wd0 = 0} - {\errmessage{No songbook option (i.e., type) specified. - Specify a songbook mode in your usepackage - statement; one of: [chordbk], [wordbk], or [overhead]}} - {\relax} - - \SBDefaultFont -} - -%%======================================================== -%% C O N S T A N T S & V A R I A B L E S % -%%======================================================== - -\newcounter{SBSongCnt} -\newcounter{SBSectionCnt} -\newcounter{SBVerseCnt} - -\newcommand{\OHContPgFtrTag} {continued on next page\ldots} -\newcommand{\OHContPgHdrTag} {\theSBSongCnt\ --- \theSongTitle, continued\ldots} -\newcommand{\SBBaseLang} {English} -\newcommand{\SBBridgeTag} {Bridge:} -\newcommand{\SBChorusTag} {Ch:} -\newcommand{\SBContinueTag} {cont\ldots} -\newcommand{\SBEndTag} {End:} -\newcommand{\SBIntersyllableRule}{\hrulefill} -\newcommand{\SBIntroTag} {Intro:} -\newcommand{\SBPubDom} {Public Domain} -\newcommand{\SBUnknownTag} {Unknown} -\newcommand{\SBWAndMTag} {W\&M:} -\newcommand{\Songbook} {\textrm{Song$\flat$ook}} - -\newcommand{\theSongComposer}{the Composer} -\newcommand{\theSongComposerU}{the ComposerU} -\newcommand{\theSongCopyRt}{the Copyright} -\newcommand{\theSongKey}{the Key} -\newcommand{\theSongLicense}{the License} -\newcommand{\theSongScriptRef}{the Scripture} -\newcommand{\theSongTitle}{the Title} -\newcommand{\theXlatnBy}{the Translator} -\newcommand{\theXlatnLang}{the Language} -\newcommand{\theXlatnPerm}{the Permission} -\newcommand{\theXlatnTitle}{the Translation Title} - -%%=======================================================% -%% S P E C I A L C H A R A C T E R S % -%%=======================================================% - -\newcommand{\SBem}{\ifWordsOnly\relax\else---\fi} - -\newcommand{\SBen}{\ifWordsOnly\relax\else--\fi} - -%%% -\newcommand{\SBContinueMark}{% - \setbox0=\hbox{\rightmark} - \ifthenelse{\lengthtest{\wd0 = 0pt}} - {\relax}% - {\SBContinueTag}% - } - -\newcommand{\OHContPgFtr}{% - \ifOverhead - \vskip .25in - \centerline{\SBOHContTagFont\OHContPgFtrTag} - \else% - \relax% - \fi} -\newcommand{\OHContPgHdr}{% - \ifOverhead - \centerline{\SBOHContTagFont\OHContPgHdrTag} - \vskip .25in - \else% - \relax% - \fi} - -%%=======================================================% -%% T A B L E O F C O N T E N T S % -%% % -%% A N D I N D I C E S % -%%=======================================================% -\def\makeArtistIndex{\if@filesw \newwrite\@artistIndexfile - \immediate\openout\@artistIndexfile=\jobname.aIdx - \def\artistIndex{\@bsphack\begingroup - \def\protect####1{\string####1\space}\@sanitize - \@wrArtistIndex}\typeout - {Writing index file \jobname.aIdx }\fi} - -\def\@wrArtistIndex#1#2{\let\thepage\relax - \xdef\@gtempa{\write\@artistIndexfile{\string - \indexentry{#1}{#2}}}\endgroup\@gtempa - \if@nobreak \ifvmode\nobreak\fi\fi\@esphack} - -\def\artistIndex{\@bsphack\begingroup \@sanitize\@artistIndex} - -\def\@artistIndex#1#2{\endgroup\@esphack} - -\def\makeKeyIndex{\if@filesw \newwrite\@keyIndexfile - \immediate\openout\@keyIndexfile=\jobname.kIdx - \def\keyIndex{\@bsphack\begingroup - \def\protect####1{\string####1\space}\@sanitize - \@wrKeyIndex}\typeout - {Writing index file \jobname.kIdx }\fi} - -\def\@wrKeyIndex#1#2{\let\thepage\relax - \xdef\@gtempa{\write\@keyIndexfile{\string - \indexentry{#1}{#2}}}\endgroup\@gtempa - \if@nobreak \ifvmode\nobreak\fi\fi\@esphack} - -\def\keyIndex{\@bsphack\begingroup \@sanitize\@keyIndex} - -\def\@keyIndex#1#2{\endgroup\@esphack} - -\def\makeTitleIndex{\if@filesw \newwrite\@titleIndexfile - \immediate\openout\@titleIndexfile=\jobname.tIdx - \def\titleIndex{\@bsphack\begingroup - \def\protect####1{\string####1\space}\@sanitize - \@wrTitleIndex}\typeout - {Writing index file \jobname.tIdx }\fi} - -\def\@wrTitleIndex#1#2{\let\thepage\relax - \xdef\@gtempa{\write\@titleIndexfile{\string - \indexentry{#1}{#2}}}\endgroup\@gtempa - \if@nobreak \ifvmode\nobreak\fi\fi\@esphack} - -\def\titleIndex{\@bsphack\begingroup \@sanitize\@titleIndex} - -\def\@titleIndex#1#2{\endgroup\@esphack} - -\def\makeTitleContents{\if@filesw \newwrite\@titleContentsfile - \immediate\openout\@titleContentsfile=\jobname.toc - \def\titleContents{\@bsphack\begingroup - \def\protect####1{\string####1\space}\@sanitize - \@wrTitleContents}\typeout - {Writing table of contents file \jobname.toc }\fi} - -\def\@wrTitleContents#1#2{\let\thepage\relax - \xdef\@gtempa{\write\@titleContentsfile{\string - \item\ \theSBSongCnt. #1\protect\hbox{, \thepage}}}\endgroup\@gtempa - \if@nobreak \ifvmode\nobreak\fi\fi\@esphack} - -\def\titleContents{\@bsphack\begingroup \@sanitize\@titleContents} - -\def\@titleContents#1#2{\endgroup\@esphack} - -\newcommand{\SBtocSEntry}[3]{#1. \textit{#2}\hbox{, #3}} - -\def\makeTitleContentsSkip{\if@filesw \newwrite\@titleContentsSkipfile - \immediate\openout\@titleContentsSkipfile=\jobname.tocS - \def\titleContentsSkip{\@bsphack\begingroup - \def\protect####1{\string####1\space}\@sanitize - \@wrTitleContentsSkip}\typeout - {Writing table of contents (skipped) file \jobname.tocS }\fi} - -\def\@wrTitleContentsSkip#1#2{\let\thepage\relax - \xdef\@gtempa{\write\@titleContentsSkipfile{\string - \item\ \protect\SBtocSEntry{\theSBSongCnt}{#1}{\thepage}}}\endgroup\@gtempa - \if@nobreak \ifvmode\nobreak\fi\fi\@esphack} - -\def\titleContentsSkip{\@bsphack\begingroup \@sanitize\@titleContentsSkip} - -\def\@titleContentsSkip#1#2{\endgroup\@esphack} - -\newcommand{\FLineIdx}[1]{\titleIndex{#1@{\it #1\/}}{\theSBSongCnt}} - -%%=======================================================% -%% S O M E O T H E R H O O K S % -%%=======================================================% - -\newcommand{\SBChorusMarkright}[1]{\markright{#1}} - -\newcommand{\SBVerseMarkright}[1]{\markright{#1}} - -\newcommand{\SBSectionMarkright}[1]{\markright{\alph{#1}}} - -\newcommand{\SongMarkboth}[2]{\markboth{#1}{#2}} - -\newcommand{\STitleMarkboth}[2]{\markboth{#1}{#2}} - -%%=======================================================% -%% M I S C E L L A N E O U S M A C R O S % -%%=======================================================% - -\newcommand{\CpyRt}[3][Y]{% - \if#1Y\begin{center}\fi - \if\blank{#2}% - \if\blank{#3}% - {\CpyRtFont\copyright \SBUnknownTag{} \CpyRtInfoFont}% - \else - {\CpyRtFont\copyright \SBUnknownTag{} \CpyRtInfoFont #3}% - \fi% - \else% - \ifthenelse{\equal{#2}{\SBPubDom}} - {%then - {\CpyRtFont #2 \CpyRtInfoFont #3}% - }{%else - {\CpyRtFont\copyright #2 \CpyRtInfoFont #3}% - }%fi - \fi% - \if#1Y\end{center}\fi -} - -\newcommand{\ScriptRef}[2][Y]{% - \if#1Y\begin{center}\fi - {\ScriptRefFont #2}% - \if#1Y\end{center}\fi -} - - -\newcommand{\WAndM}[2][Y]{% - \if#1Y\begin{center}\fi - \if\blank{#2}% - {\WandMFont\SBWAndMTag ~\SBUnknownTag}% - \else - {\WandMFont\SBWAndMTag ~#2}% - \fi - \if#1Y\end{center}\fi -} - -\newcommand{\sbSetsbBaselineSkipAmt}{ - \ifChordBk% - \setbox0=\hbox{\strut\raise\SBChordRaise\hbox{\ChFont\sbChord{}A\relax\strut}A}% - \setlength{\sbBaselineSkipAmt}{\ht0 + \dp0}% - \else% - \setlength{\sbBaselineSkipAmt}{\baselineskip}% - \fi% -} - -%%=======================================================% -%% P R I M A R Y S O N G B O O K M A C R O S % -%%=======================================================% - -%%% -\newcommand{\STitle}[3][Y]{% - \setcounter{SBVerseCnt}{0}% - \setcounter{SBSectionCnt}{0}% - \ifExcludeSong\relax% - \else\keyIndex{{\protect\sbChord#3\protect\relax} -- #2}{\theSBSongCnt}\fi% - \vspace{\SpaceAboveSTitle}% - \if#1Y\begin{center}\fi - {\STitleNumberFont\theSBSongCnt}{\STitleFont\ --- #2}% - \ifWordsOnly\relax\else{\STitleKeyFont\ [{\sbChord#3\relax}]}\fi% - \if#1Y\end{center}\fi - \STitleMarkboth{#2}{\relax}% - } - -\newenvironment{song}[7][Y]{ % Comment markers to negate - \if#1Y\ExcludeSongfalse\else\ExcludeSongtrue\fi% the newline. - \ifPrintAllSongs\ExcludeSongfalse\fi % - \SongMarkboth{\relax}{\relax} % - \SBinSongEnvtrue % - \renewcommand{\SBinSongEnv}{\True} % - \ifWordsOnly % - \setlength{\parindent}{0pt} % - \fi % - \renewcommand{\theSongComposer}{#5} % - \if\blank{#5} % - \renewcommand{\theSongComposerU}{\SBUnknownTag}% - \else % - \renewcommand{\theSongComposerU}{#5} % - \fi % - \renewcommand{\theSongCopyRt}{#4} % - \renewcommand{\theSongKey}{#3} % - \renewcommand{\theSongLicense}{#7} % - \renewcommand{\theSongScriptRef}{#6} % - \renewcommand{\theSongTitle}{#2} % - \renewcommand{\theXlatnBy}{} % - \renewcommand{\theXlatnLang}{\SBBaseLang} % - \renewcommand{\theXlatnPerm}{} % - \renewcommand{\theXlatnTitle}{} % - % - \addtocounter{SBSongCnt}{1} % - % - \ifExcludeSong % - \titleContentsSkip{\theSongTitle}{\theSongKey}% - \else % - \titleIndex{\theSongTitle}{\theSBSongCnt} % - \titleContents{\theSongTitle}{\theSongKey} % - \artistIndex{\theSongComposerU+\theSongTitle}{\theSBSongCnt}% - \fi % - \ifExcludeSong\setbox2=\vbox\bgroup\fi% - \ifSamepageMode% - \begin{samepage}% - \fi% - \begin{center} - \STitle[N]{\theSongTitle}{#3}\\ - \vspace{-.5ex} - %\CpyRt[N]{#4}{#7}\\ - {#4}\\ - \vspace{-.5ex} - \WAndM[N]{#5}\\ - \if\given{#6}% - \vspace{-.75ex} - \ScriptRef[N]{\theSongScriptRef}\\ - \fi% - \end{center}% - \vspace{\SpaceAfterTitleBlk} - \ifCompactSongMode - \begin{multicols*}{2} - \raggedcolumns - \fi - \SBDefaultFont% - }% -{\ifSamepageMode% - \end{samepage}% - \fi% - \ifCompactSongMode - \end{multicols*} - \fi - \ifSongEject% - \vfill\pagebreak% - \else% - \SpaceAfterSong\pagebreak[1]% - \fi% - \ifExcludeSong\egroup\setbox2=\hbox{}\fi% - \renewcommand{\SBinSongEnv}{\False}% - \SBinSongEnvfalse% - } - -\newcommand{\CBExcl}{\ifChordBk N\else Y\fi} -\newcommand{\OHExcl}{\ifOverhead N\else Y\fi} -\newcommand{\WBExcl}{\ifWordBk N\else Y\fi} -\newcommand{\WOExcl}{\ifWordsOnly N\else Y\fi} -\newenvironment{xlatn}[3]{% Comment marker negates the newline. - \renewcommand{\theXlatnBy}{#3}% - \renewcommand{\theXlatnPerm}{#2}% - \renewcommand{\theXlatnTitle}{#1}% - % - \titleIndex{\theXlatnTitle}{\theSBSongCnt}% - \titleContents{\theXlatnTitle}{\theSongKey}% - % - \begin{center} - \STitle[N]{\theXlatnTitle}{\theSongKey}\\ - \CpyRt[N]{\theSongCopyRt}{\theSongLicense}\\ - \if\nil{#2}% - \relax% - \else% - \vspace{-.5ex} - {\CpyRtFont\theXlatnPerm}\\ - \fi - \if\nil{#3}% - \relax% - \else% - \vspace{-.5ex} - {\CpyRtFont\theXlatnBy}\\ - \fi - \end{center}% - % - \setcounter{SBVerseCnt}{0}% - \setcounter{SBSectionCnt}{0}% -}{\relax} -\newenvironment{songTranslation}[4]{% Comment marker negates the newline. - \renewcommand{\theXlatnBy}{#4}% -\begin{xlatn}{#2}{#3}{#4}% -}{\end{xlatn}} -\def\sbChord#1{% - \ifx#1\relax% - \let\next=\relax% - \else% - \ifx#1##% double sharp because we're inside a \def - $\sharp$% - \else% - \ifx#1b% - $\flat$% - \else% - \ifx#1/% - \ChBassFont /% - \else% - \ifx#1[% - \bgroup\ChBkFont [\egroup% - \else% - \ifx#1]% - \bgroup\ChBkFont ]\egroup% - \else% - #1% - \fi% - \fi% - \fi% - \fi% - \fi% - \let\next=\sbChord% - \fi% - \next% -} - -%%% -\newcommand{\Ch}[2]{{% - \ifChordBk% - \setbox1=\hbox{\ChFont\sbChord#1\relax\strut}% - \setbox0=\hbox{#2}% - \ifdim\wd1<\wd0% - \strut\raise\SBChordRaise\copy1\kern-\wd1\copy0% - \else% - \strut\copy0\kern-\wd0\strut\raise\SBChordRaise\copy1% - \fi% - \else% - #2% - \fi}} - -\newcommand{\ChX}[2]{% - \ifWordsOnly% - \if\nil{#2}% - \ignorespaces% - \else% - #2% - \fi% - \else% - \Ch{#1}{#2}% - \fi} - -\newlength{\chCriticDim} -\newlength{\chSpaceDim} -\newcommand{\Chr}[2]{{% - \ifChordBk - \setbox1=\hbox{\ChFont\sbChord#1\relax\strut}% - \setbox0=\hbox{#2}% - \setlength{\chCriticDim}{\wd0 - \chSpaceTolerance}% - \advance\chCriticDim by 2\chMiniSpace% - \ifdim\wd1>\chCriticDim% - \chCriticDim \wd1% - \advance\chCriticDim by -\wd0% - \advance\chCriticDim by -\chSpaceTolerance% - \advance\chCriticDim by -2\chMiniSpace% - \ifdim\chCriticDim>0mm% - \chSpaceDim \wd1% - \advance\chSpaceDim by -\wd0% - \advance\chSpaceDim by \chSpaceTolerance% - \else% - \chSpaceDim\chSpaceTolerance% - \fi% - \chCriticDim \chSpaceDim% - \advance\chCriticDim by 2\chMiniSpace% - \strut\raise\SBChordRaise\copy1\kern-\wd1\ifdim\wd0=0mm\kern-2\chMiniSpace\fi% - \copy0\hbox to\chCriticDim{\hss% - \raise\SBRuleRaiseAmount\hbox to\chSpaceDim{\SBIntersyllableRule}\hss}% - \else% - \strut\raise\SBChordRaise\copy1\kern-\wd1% - \copy0% - \fi% - \else% - #2% - \fi}% -} - -\newcommand{\SBMargNote}[1]{% - \ifExcludeSong% - \relax% - \else\ifWordsOnly% - \relax% - \else\ifCompactSongMode% - \footnote{{\SBMargNoteFont{#1}}}% - \else% - \marginpar{{\begin{flushleft}\SBRefFont{#1}\end{flushleft}}}% - \fi\fi\fi} - -\newcommand{\SBRef}[2]{% - \ifExcludeSong% - \relax% - \else\ifWordsOnly% - \relax% - \else\ifCompactSongMode% - \footnotetext[0]{{\SBRefFont{\em #1}, {#2}.}}% - \else% - \marginpar{{\begin{flushleft}\SBRefFont{\em #1}, {#2}.\end{flushleft}}}% - \fi\fi\fi} - -\newenvironment{SBVerse}{% - \sbSetsbBaselineSkipAmt% - \bgroup% - \addtocounter{SBVerseCnt}{1}% - \SBVerseMarkright{\theSBVerseCnt}% - \begin{list}{{\SBVerseNumberFont\theSBVerseCnt .}} - {\setlength {\leftmargin} {\LeftMarginSBVerse + \HangAmt} - \setlength{\itemindent} {-\HangAmt} - \setlength{\listparindent}{-\HangAmt} - \setlength{\parsep} {0pt} - \setlength{\baselineskip} {\sbBaselineSkipAmt} - }% - \item} -{\end{list}% - \egroup% - \SpaceAfterVerse} - -\newenvironment{SBVerse*}{% - \sbSetsbBaselineSkipAmt% - \bgroup% - \begin{list}{{\SBVerseNumberFont }} - {\setlength {\leftmargin} {\LeftMarginSBVerse + \HangAmt} - \setlength{\itemindent} {-\HangAmt} - \setlength{\listparindent}{-\HangAmt} - \setlength{\parsep} {0pt} - \setlength{\baselineskip} {\sbBaselineSkipAmt} - }% - \item} -{\end{list}% - \egroup% - \SpaceAfterVerse} - -\newenvironment{SBSection}{% - \sbSetsbBaselineSkipAmt% - \bgroup% - \addtocounter{SBSectionCnt}{1}% - \SBSectionMarkright{SBSectionCnt} - \begin{list}{{\SBSectionNumberFont\alph{SBSectionCnt})}} - {\setlength {\leftmargin} {\LeftMarginSBSection + \HangAmt} - \setlength{\itemindent} {-\HangAmt} - \setlength{\listparindent}{-\HangAmt} - \setlength{\parsep} {0pt} - \setlength{\baselineskip} {\sbBaselineSkipAmt} - }% - \item} -{\end{list}% - \egroup% - \SpaceAfterSection} - -\newenvironment{SBSection*}{% - \sbSetsbBaselineSkipAmt% - \bgroup% - \begin{list}{{\SBSectionNumberFont }} - {\setlength {\leftmargin} {\LeftMarginSBSection + \HangAmt} - \setlength{\itemindent} {-\HangAmt} - \setlength{\listparindent}{-\HangAmt} - \setlength{\parsep} {0pt} - \setlength{\baselineskip} {\sbBaselineSkipAmt} - }% - \item} -{\end{list}% - \egroup% - \SpaceAfterSection} - -\newenvironment{SBChorus}{% - \sbSetsbBaselineSkipAmt% - \bgroup% - \SBChorusMarkright{\SBChorusTag} - \begin{list}{{\SBChorusTagFont\SBChorusTag}} - {\setlength {\leftmargin} {\LeftMarginSBChorus + \HangAmt} - \setlength{\itemindent} {-\HangAmt} - \setlength{\listparindent}{-\HangAmt} - \setlength{\parsep} {0pt} - \setlength{\baselineskip} {\sbBaselineSkipAmt} - }% - \item} -{\end{list}% - \egroup% - \SpaceAfterChorus% -} - -\newenvironment{SBChorus*}{% - \sbSetsbBaselineSkipAmt% - \bgroup% - \begin{list}{{\SBChorusTagFont }} - {\setlength {\leftmargin} {\LeftMarginSBChorus + \HangAmt} - \setlength{\itemindent} {-\HangAmt} - \setlength{\listparindent}{-\HangAmt} - \setlength{\parsep} {0pt} - \setlength{\baselineskip} {\sbBaselineSkipAmt} - }% - \item} -{\end{list}% - \egroup% - \SpaceAfterChorus} - -%%% -\newenvironment{SBOpGroup}{% - \sbSetsbBaselineSkipAmt% - \bgroup% - \begin{list}{\hbox{}} - {\setlength {\leftmargin} {\HangAmt} - \setlength{\itemindent} {-\HangAmt} - \setlength{\listparindent}{-\HangAmt} - \setlength{\topsep} {0pt} - \setlength{\parsep} {0pt} - \setlength{\labelwidth} {0pt} - \setlength{\labelsep} {0pt} - \setlength{\baselineskip} {\sbBaselineSkipAmt} - }% - \item} -{\end{list}% - \egroup% - \SpaceAfterOpGroup} - -\newcommand{\SBBridge}[1]{% - \ifWordsOnly% - \relax% - \else% - \sbSetsbBaselineSkipAmt% - \bgroup% - \begin{list}{{\SBBridgeTagFont\SBBridgeTag}} - {\setlength {\leftmargin} {\LeftMarginSBChorus}% - \setlength{\parsep} {0pt} - \setlength{\baselineskip}{\sbBaselineSkipAmt} - }% - \item #1 - \end{list}% - \egroup\par - \fi} - -\newcommand{\SBEnd}[2][N]{% - \ifthenelse{\equal{\ifWordsOnly Y\fi}{Y} - \and \equal{N}{#1}}% - {\relax}% - {\sbSetsbBaselineSkipAmt% - \bgroup% - \begin{list}{{\SBEndTagFont\SBEndTag}} - {\setlength {\leftmargin} {\LeftMarginSBChorus} - \setlength{\parsep} {0pt} - \setlength{\baselineskip}{\sbBaselineSkipAmt} - }% - \item #2 - \end{list}% - \egroup\par} - } - -\newcommand{\SBIntro}[2][N]{% - \ifthenelse{\equal{\ifWordsOnly Y\fi}{Y} - \and \equal{N}{#1}}% - {\relax}% - {\sbSetsbBaselineSkipAmt% - \bgroup% - \begin{list}{{\SBIntroTagFont\SBIntroTag}}% - {\setlength {\leftmargin} {\LeftMarginSBChorus}% - \setlength{\parsep} {0pt} - \setlength{\baselineskip}{\sbBaselineSkipAmt} - }% - \item #2 - \vspace{-\topsep}%\vspace{-\partopsep}% - \end{list}% - \egroup\par}% - } - -\newenvironment{SBBracket}[1]{% - \SpaceBeforeSBBracket - \sbSetsbBaselineSkipAmt% - \setbox0=\hbox to \LeftMarginSBBracket{\parbox{\LeftMarginSBBracket}% - {\flushright{\hspace{0pt}\SBBracketTagFont #1}}}% - \hbox\bgroup% - \rightskip=\LeftMarginSBBracket% - $\raisebox{1.25ex}{\copy0}% - \left\lbrack% - \vcenter\bgroup% - \begin{list}{\hbox{}}% % - {\setlength {\leftmargin} {\HangAmt + 0.5em}% This list - \setlength{\rightmargin} {\LeftMarginSBBracket}% - \setlength{\itemindent} {-\HangAmt}% % been copied - \setlength{\listparindent}{-\HangAmt}% % verbatim from - \setlength{\topsep} {0pt}% % the SBOpGroup - \setlength{\parsep} {0pt}% % environment, - \setlength{\labelwidth} {0pt}% % above and then - \setlength{\labelsep} {0pt}% % modified slightly. - \setlength{\baselineskip} {\sbBaselineSkipAmt}% - }% % - \item% -}{% - \end{list}% - \egroup% - \right.$% - \rightskip=0pt - \egroup - \SpaceAfterSBBracket -} - -\newenvironment{SBBracket*}[1]{% - \SpaceBeforeSBBracket - \sbSetsbBaselineSkipAmt% - \ifNotWordsOnly - \setbox0=\hbox to \LeftMarginSBBracket{\parbox{\LeftMarginSBBracket}% - {\flushright{\hspace{0pt}\SBBracketTagFont #1}}}% - \hbox\bgroup% - \rightskip=\LeftMarginSBBracket% - $\raisebox{1.25ex}{\copy0}% - \left\lbrack% - \vcenter\bgroup% - \fi - \begin{list}{\hbox{}}% % - {\setlength {\leftmargin} {\HangAmt + 0.5em}% This list - \setlength{\rightmargin} {\LeftMarginSBBracket}% - \setlength{\itemindent} {-\HangAmt}% % been copied - \setlength{\listparindent}{-\HangAmt}% % verbatim from - \setlength{\topsep} {0pt}% % the SBOpGroup - \setlength{\parsep} {0pt}% % environment, - \setlength{\labelwidth} {0pt}% % above and then - \setlength{\labelsep} {0pt}% % modified slightly. - \setlength{\baselineskip} {\sbBaselineSkipAmt}% - }% % - \item% -}{% - \end{list}% - \ifNotWordsOnly - \egroup% - \right.$% - \rightskip=0pt - \egroup - \fi - \SpaceAfterSBBracket -} - -\newenvironment{SBOccurs}[1]{% - {\SBOccursTagFont #1\SBOccursBrktFont [} - } -{{\SBOccursBrktFont ]}} - -\newenvironment{SBExtraKeys}[1]{% - \ifWordsOnly% - \relax% - \else% - #1 - \fi} -{} - -\newcommand{\CBPageBrk}[1][N]{% - \ifChordBk% - \ifCompactSongMode - \ifthenelse{\equal{#1}{N}} - {\relax} - {\vfill\pagebreak} - \else - \vfill\pagebreak - \fi - \fi} - -\newcommand{\CSColBrk}{% - \ifCompactSongMode% - \columnbreak% - \fi} - -\newcommand{\NotWOPageBrk}{% - \ifWordsOnly% - \relax% - \else% - \pagebreak - \fi} - -\newcommand{\OHPageBrk}{% - \ifOverhead% - \pagebreak - \fi} - -\newcommand{\WBPageBrk}{% - \ifWordBk% - \pagebreak - \fi} - -\newcommand{\WOPageBrk}{% - \ifWordsOnly% - \pagebreak - \fi} - -%%=======================================================% -%% O B S O L E T E M A C R O S % -%%=======================================================% - -%%=======================================================% -%% D E P R E C A T E D M A C R O S % -%%=======================================================% - -%%% -\newcommand{\False}{0} -\newcommand{\True}{1} -\newcommand{\ChordBk}{\False} -\newcommand{\Overhead}{\False} -\newcommand{\SongEject}{\True} -\newcommand{\WordBk}{\False} -\newcommand{\WordsOnly}{\False} -\newcommand{\SBinSongEnv}{\False} - -\endinput -%% -%% End of file `songbook.sty'. diff --git a/songbook.tex b/songbook.tex index 9b19ee2..72b0f6d 100644 --- a/songbook.tex +++ b/songbook.tex @@ -1,116 +1,113 @@ -\documentclass[a4paper,10pt]{book} - -% histoire de ne plus être emmerdés avec les accents et autres conneries -\usepackage[french]{babel} -\usepackage[utf8]{inputenc} -\usepackage[T1]{fontenc} - -% les classes clefs pour la musique -\usepackage[chordbk,compactsong]{songbook} -\usepackage{musixtex} - -% numérotation des pages en chapter-page +%% This file has been automatically generated, do not edit! \makeatletter -\renewcommand{\thepage}{\thechapter-\arabic{page}} -\@addtoreset{page}{chapter} -\def\@stpelt#1{\global\csname c@#1\endcsname - \expandafter\ifx \csname#1\endcsname \page - \@ne - \else - \z@ \fi} +\def\set@name#1{\def\getname{#1}} +\set@name{songbook} +\def\set@songslist#1{\def\getsongslist{#1}} +\set@songslist{} +\def\set@footer#1{\def\getfooter{#1}} +\set@footer{\begin{flushleft}Shiver Me Timbers\end{flushleft}} +\def\set@web#1{\def\getweb{#1}} +\set@web{http://www.myspace.com/shivermetimbersofficial} +\def\set@picture#1{\def\getpicture{#1}} +\set@picture{shiver} +\def\set@songnumberbgcolor#1{\def\getsongnumberbgcolor{#1}} +\set@songnumberbgcolor{D1E4AE} +\def\set@subtitle#1{\def\getsubtitle{#1}} +\set@subtitle{} +\def\set@license#1{\def\getlicense{#1}} +\set@license{\input{license.tex}} +\def\set@author#1{\def\getauthor{#1}} +\set@author{Benjamin Coudrin} +\def\set@picturecopyright#1{\def\getpicturecopyright{#1}} +\set@picturecopyright{WTFPL - Do What The Fuck You Want Public License} +\def\set@booktype#1{\def\getbooktype{#1}} +\set@booktype{chorded} +\def\set@mainfontsize#1{\def\getmainfontsize{#1}} +\set@mainfontsize{10pt} +\def\set@version#1{\def\getversion{#1}} +\set@version{1.0.0} +\def\set@mail#1{\def\getmail{#1}} +\set@mail{benjamin.coudrin@gmail.com} +\def\set@title#1{\def\gettitle{#1}} +\set@title{Shiver Me Timbers} +\def\set@notebgcolor#1{\def\getnotebgcolor{#1}} +\set@notebgcolor{FFFDB3} +\def\set@bookoptions#1{\def\getbookoptions{#1}} +\set@bookoptions{lilypond} +\def\set@indexbgcolor#1{\def\getindexbgcolor{#1}} +\set@indexbgcolor{D1E4AE} +\set@picture{shiver} +\set@songnumberbgcolor{BA8D5A} +\set@author{Benjamin Coudrin} +\set@license{\input{license.tex}} +\set@footer{\begin{flushleft}Shiver Me Timbers\end{flushleft}} +\set@notebgcolor{FFFDB3} +\set@booktype{chorded} +\set@mainfontsize{10pt} +\set@web{http://www.myspace.com/shivermetimbersofficial} +\set@version{1.0.0} +\set@title{Shiver Me Timbers} +\set@picturecopyright{WTFPL - Do What The Fuck You Want Public License} +\set@mail{benjamin.coudrin@gmail.com} +\set@bookoptions{lilypond} +\set@indexbgcolor{D1E4AE} +\set@songslist{\graphicspath{ + {songs/Traditional/}, + {img//}, + {songs/Irish_traditional/}, +} +\input{songs/Irish_traditional/Irish_Rover.sg} +\input{songs/Irish_traditional/Johnny_I_Harldy_Knew_Ye_.sg} +\input{songs/Traditional/Rocky_Road_To_Dublin.sg} +\input{songs/Traditional/The_Furze_in_Bloom_jig_.sg} +\input{songs/Traditional/The_Jug_of_Punch.sg} +\input{songs/Traditional/Whiskey_In_The_Jar.sg} +\input{songs/Irish_traditional/Whiskey_You_re_the_Devil.sg}} \makeatother +\documentclass[\getbooktype,\getbookoptions,\getmainfontsize]{crepbook} +\usepackage[utf8]{inputenc} +\usepackage[english,spanish,french]{babel} +\usepackage[T1]{fontenc} +\usepackage{tex/venturisold} +\title{\gettitle} +\author{\getauthor} +\subtitle{\getsubtitle} +\version{\getversion} +\mail{\getmail} +\web{\getweb} +\picture{\getpicture} +\picturecopyright{\getpicturecopyright} +\footer{\getfooter} +\licence{\getlicense} +\newindex{titleidx}{\getname_title} +\newauthorindex{authidx}{\getname_auth} -\begin{document} - -\title{\Large\bf Shiver Me Timbers \\ ~\\ Songs \begin{tiny}from the\end{tiny} Book} -\author{Benjamin COUDRIN} -\maketitle +\graphicspath{ + {img/}, +} -\makeTitleContents +\definecolor{SongNumberBgColor}{HTML}{\getsongnumberbgcolor} +\definecolor{NoteBgColor}{HTML}{\getnotebgcolor} +\definecolor{IndexBgColor}{HTML}{\getindexbgcolor} -%%%%%%%%%%% S O N G S F R O M T H E S E A %%%%%%%%%%%% -\chapter{Songs from the sea} - \input{sea/sea.tex} +\renewcommand{\snumbgcolor}{SongNumberBgColor} +\renewcommand{\notebgcolor}{NoteBgColor} +\renewcommand{\idxbgcolor}{IndexBgColor} -%%%%%%%%% S O N G S F R O M T H E B A T T L E F I E L D %%%%%%%%% -\chapter{Songs from the battlefield} - \input{battlefield/battlefield.tex} - -%%%%%%%%% S O N G S F R O M T H E R O A D %%%%%%%%% -\chapter{Songs from the road} - \input{road/road.tex} +\renewcommand{\printchord}[1]{\mdseries\ttfamily\upshape#1} +\pagestyle{empty} -%%%%%%%%% S O N G S F R O M T H E T O W N %%%%%%%%%% -\chapter{Songs from the town} - \input{town/town.tex} +\begin{document} -%%%%%%%%% S O N G S F R O M T H E F I E L D S %%%%%%%%%% -\chapter{Songs from the fields} - \input{fields/fields.tex} - -%%%%%%%% S O N G S F R O M T H E B O O Z E %%%%%%%%% -\chapter{Songs from the booze} - \input{booze/booze.tex} - -%%%%%%%% S O N G S F R O M T H E W O O D S %%%%%%%% -\chapter{Songs from the woods} - \input{woods/woods.tex} +\maketitle -%%%%%%%% S O N G S F R O M T H E I N S T R U M E N T A L S %%%%%%%% -\chapter{Songs from the dance} - \input{instrumentals/instrumentals.tex} - +\showindex{Index des chansons}{titleidx} -\chapter{Songs from the SET list} -\begin{itemize} - \item Kesh jig / Blackthorn stick - \item Irish rover - \item Mermaid - \item Eileen'og - \item Polkas 1 - \item Johnny I hardly knew ye - \item Whiskey in the jar - \item Quinze marins / Drunken sailor - \item D\'erob\'ee de Guingamp - \item Filles des forges - \item Morrison's jig - \item Dirty old town - \item Forban - \item Drowsy Maggie / Tam lynn - \item Wild rover - \item Polkas 2 - \item Leprechaun - \item Rights of Man / Pride of Petravore - \item Prisons de Nantes - \item Jug of punch - \item Whiskey you're the devil - \item Sally Brown - \item Foggy dew - \item Paddy's return / up in the air / cliffs moher - \item Molly Maguires - \item John Kanak - \item Fisher hornpipe / Saint-Anne's reel - \item Kilkelly Ireland - \item Polka Set 3 = Wedding Polka, Castleisland Polka, John Ryan Polka - \item Farewell to Tchernobyl - \item Magpie Set - \item Bugger Off - \item Weile Weile Waile - \item Rocky Road to Dublin -\end{itemize} -Black Velvet Band -Fields of Athenrye -Erin Ghra Mo Chroi -My Irish Molly O -Don't get married girl -Rare old time -Leaving of Liverpool -Finnegan's wake -Tri Martolod -Star of a County Down -Galway Races +\songsection{Liste des chansons} +\begin{songs}{titleidx,authidx} + \getsongslist +\end{songs} \end{document} -% Fin du document diff --git a/songbookTOC.tex b/songbookTOC.tex deleted file mode 100644 index b97d7a4..0000000 --- a/songbookTOC.tex +++ /dev/null @@ -1,16 +0,0 @@ -\item\ 1. Irish Rover\hbox {, 3} -\item\ 2. The Mermaid\hbox {, 4} -\item\ 3. Quinze Marins (\textit {Dead Man's Chest})\hbox {, 5} -\item\ 4. Drunken Sailor\hbox {, 6} -\item\ 5. Le Forban (version de terre)\hbox {, 7} -\item\ 6. Le Forban (version de mer)\hbox {, 8} -\item\ 7. Johnny I Hardly Knew Ye\hbox {, 9} -\item\ 8. Whiskey In The Jar\hbox {, 11} -\item\ 9. Rocky Road To Dublin\hbox {, 12} -\item\ 10. Dirty Old Town\hbox {, 15} -\item\ 11. Dans les prisons de Nantes\hbox {, 16} -\item\ 12. Eileen Og\hbox {, 17} -\item\ 13. The Leprechaun\hbox {, 19} -\item\ 14. Kilkelly, Ireland\hbox {, 20} -\item\ 15. The Jug of Punch\hbox {, 21} -\item\ 16. Whiskey You're The Devil\hbox {, 22} diff --git a/songs.sty b/songs.sty new file mode 100644 index 0000000..78e3911 --- /dev/null +++ b/songs.sty @@ -0,0 +1,3676 @@ +%% +%% This is file `songs.sty', +%% generated with the docstrip utility. +%% +%% The original source files were: +%% +%% songs.dtx (with options: `package') +%% +%% This is a generated file. +%% +%% Copyright (C) 2011 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 +%% 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.3a or later is part of all distributions of LaTeX version +%% 2004/10/01 or later. +%% +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{songs} + [2011/01/09 v2.12 Songs package] +\newif\ifSB@etex +\ifx\eTeXversion\undefined\else + \ifx\eTeXversion\relax\else + \SB@etextrue + \IfFileExists{etex.sty}{\RequirePackage{etex}}{} + \fi +\fi +\newif\ifSB@pdf\SB@pdffalse +\ifx\pdfoutput\undefined\else + \ifx\pdfoutput\relax\else + \ifnum\pdfoutput<\@ne\else + \SB@pdftrue + \fi + \fi +\fi +\newif\ifSB@preamble +\SB@preambletrue +\newif\ifSB@test +\newcommand\SB@temp{} +\newcommand\SB@tempii{} +\newcommand\SB@tempiii{} +\newcommand\SB@tempiv{} +\newcommand\SB@tempv{} +\newdimen\SB@dimen +\newdimen\SB@dimenii +\newdimen\SB@dimeniii +\newdimen\SB@dimeniv +\newbox\SB@box +\newbox\SB@boxii +\newbox\SB@boxiii +\newtoks\SB@toks +\newcount\SB@cnt +\newcount\SB@cntii +\newskip\SB@skip +\RequirePackage{keyval} +\newcommand\lyricfont{\normalfont\normalsize} +\newcommand\stitlefont{% + \ifslides\sffamily\Huge\else\sffamily\slshape\Large\fi% +} +\newcommand\versefont{} +\newcommand\chorusfont{} +\newcommand\notefont{} +\newcommand\scripturefont{% + \usefont{OT1}{pzc}{mb}{it}% + \shiftdblquotes{-1.1\p@}\z@{-2\p@}\z@% +} +\newcommand\printscrcite[1]{\sffamily\small#1} +\newcommand\snumbgcolor{SongbookShade} +\newcommand\notebgcolor{SongbookShade} +\newcommand\idxbgcolor{SongbookShade} +\newcommand\versejustify{\justifyleft} +\newcommand\chorusjustify{\justifyleft} +\newcommand\notejustify{% + \advance\baselineskip\p@\relax% + \leftskip\z@skip\rightskip\z@skip% + \parfillskip\@flushglue\parindent\z@% +} +\newcommand\placenote[1]{% + \leftskip\z@skip\rightskip\@flushglue\SB@cbarshift% + \noindent#1\par% +} +\newcounter{songnum} +\newcounter{versenum} +\renewcommand\thesongnum{\songnumstyle{songnum}} +\newcommand\songnumstyle{} +\let\songnumstyle\arabic +\renewcommand\theversenum{\versenumstyle{versenum}} +\newcommand\versenumstyle{} +\let\versenumstyle\arabic +\newcommand\printsongnum[1]{\sffamily\bfseries\LARGE#1} +\newcommand\printversenum[1]{\lyricfont#1.\ } +\newcommand\placeversenum[1]{% + \hskip-\leftskip\hskip-\parindent\relax% + \box#1% +} +\newcommand\everyverse{} +\newcommand\everychorus{} +\newcommand\printchord[1]{\sffamily\slshape\large#1} +\newcommand\chordlocals{} +\newskip\versesep +\versesep123456789sp\relax +\newskip\baselineadj +\baselineadj\z@skip +\parindent.25in +\newlength\idxheadwidth +\setlength\idxheadwidth{1.5cm} +\newlength\songnumwidth +\settowidth\songnumwidth{\printsongnum{999.}} +\newlength\versenumwidth +\settowidth\versenumwidth{\printversenum{9\kern1em}} +\newlength\cbarwidth +\setlength\cbarwidth\p@ +\newlength\sbarheight +\setlength\sbarheight\p@ +\interlinepenalty\@m +\newcount\vvpenalty\vvpenalty200 +\newcount\ccpenalty\ccpenalty200 +\newcount\vcpenalty\vcpenalty200 +\newcount\cvpenalty\cvpenalty200 +\newcount\brkpenalty\brkpenalty200 +\newcount\spenalty\spenalty100 +\newcommand\songmark{} +\newcommand\versemark{} +\newcommand\chorusmark{} +\newcommand\extendprelude{\showrefs\showauthors} +\newcommand\extendpostlude{\songcopyright\ \songlicense\unskip} +\newcommand\idxheadfont{\sffamily\bfseries\LARGE} +\newcommand\idxtitlefont{\sffamily\slshape} +\newcommand\idxlyricfont{\rmfamily} +\newcommand\idxscripfont{\sffamily\small\slshape} +\newcommand\idxauthfont{\small\bfseries} +\newcommand\idxrefsfont{\normalfont\normalsize} +\newcommand\idxbook[1]{\small\bfseries#1} +\newcommand\idxcont[1]{\small\textbf{#1} (continued)} +\newcommand\colbotglue{} +\let\colbotglue\z@skip +\newcommand\lastcolglue{} +\let\lastcolglue\@flushglue +\newcount\minfrets\minfrets4 +\newdimen\SB@colwidth +\DeclareOption{slides}{\slides} +\newcommand\slides{% + \slidestrue% + \def\lyricfont{\normalfont\huge}% + \def\chorusfont{\slshape}% + \def\versejustify{\justifycenter}% + \let\chorusjustify\versejustify + \def\placenote##1{\justifycenter\noindent##1\par}% + \scriptureoff% + \onesongcolumn% + \ifSB@preamble\ifSB@chordedspec\else\SB@chordsoff\fi\fi% + \spenalty-\@M% + \let\colbotglue\@flushglue% + \setlength\cbarwidth\z@% + \setlength\sbarheight\z@% +} +\newcommand\justifyleft{% + \leftskip\parindent% + \ifSB@inverse\advance\leftskip\versenumwidth\fi% + \SB@cbarshift% + \parindent-\parindent% +} +\newcommand\justifycenter{% + \centering\SB@cbarshift\rightskip\leftskip% + \def\placeversenum##1{% + \hskip-\leftskip\hskip-\parindent\relax% + \hangindent-\wd##1\hangafter\m@ne% + \box##1\hfil% + }% +} +\newcommand\SB@outer{\outer} +\DeclareOption{unouter}{\let\SB@outer\relax} +\DeclareOption{rawtext}{\rawtexttrue\indexesoff} +\DeclareOption{nopdfindex}{\pdfindexfalse} +\DeclareOption{noshading}{\SB@colorboxesfalse} +\DeclareOption{noindexes}{\indexesoff} +\newcommand\indexeson{% + \ifSB@preamble% + \SB@genindexestrue% + \else% + \ifSB@genindexes\else\SB@warnigen\fi% + \fi% + \songindexestrue% +} +\newcommand\indexesoff{% + \ifSB@preamble\SB@genindexesfalse\fi% + \songindexesfalse% +} +\newif\ifSB@measurespec +\newif\ifSB@chordedspec +\DeclareOption{chorded}{\chordson} +\DeclareOption{lyric}{\chordsoff} +\newcommand\chordson{\SB@chordedspectrue\SB@chordson} +\newcommand\chordsoff{\SB@chordedspectrue\SB@chordsoff} +\newcommand\SB@chordson{% + \ifrawtext% + \SB@errrtopt% + \else% + \chordedtrue\lyricfalse% + \let\SB@bracket\SB@chord% + \let\SB@rechord\SB@@rechord% + \let\SB@ch\SB@ch@on% + \ifSB@measurespec% + \ifmeasures\SB@measureson\else\SB@measuresoff\fi% + \else% + \SB@measureson% + \fi% + \ifSB@preamble\def\colbotglue{\z@\@plus.5\textheight}\fi% + \SB@setbaselineskip% + \fi% +} +\newcommand\SB@chordsoff{% + \chordedfalse\lyrictrue% + \def\SB@bracket##1]{\ignorespaces}% + \let\SB@rechord\relax% + \let\SB@ch\SB@ch@off% + \ifSB@measurespec% + \ifmeasures\SB@measureson\else\SB@measuresoff\fi% + \else% + \SB@measuresoff% + \fi% + \ifSB@preamble\let\colbotglue\z@skip\fi% + \SB@setbaselineskip% +} +\DeclareOption{showmeasures}{\measureson} +\DeclareOption{nomeasures}{\measuresoff} +\newcommand\measureson{\SB@measurespectrue\SB@measureson} +\newcommand\measuresoff{\SB@measurespectrue\SB@measuresoff} +\newcommand\SB@measureson{% + \measurestrue% + \let\SB@mbar\SB@makembar% + \ifchorded% + \let\SB@mch\SB@mch@on% + \else% + \let\SB@mch\SB@mch@m% + \fi% + \ifSB@inverse\SB@loadactives\fi% + \ifSB@inchorus\SB@loadactives\fi% +} +\newcommand\SB@measuresoff{% + \measuresfalse% + \let\SB@mbar\@gobbletwo% + \ifchorded% + \let\SB@mch\SB@ch@on% + \else% + \let\SB@mch\SB@ch@off% + \fi% + \ifSB@inverse\SB@loadactives\fi% + \ifSB@inchorus\SB@loadactives\fi% +} +\DeclareOption{transposecapos}{\transcapostrue} +\DeclareOption{noscripture}{\SB@omitscriptrue} +\newcommand\scriptureon{\SB@omitscripfalse} +\newcommand\scriptureoff{\SB@omitscriptrue} +\DeclareOption{twosongcolumns}{\SB@numcols\tw@} +\DeclareOption{onesongcolumn}{\SB@numcols\@ne} +\newcommand\songcolumns[1]{% + \SB@cnt#1\relax% + \ifnum\SB@cnt=\SB@numcols\else% + \ifSB@preamble\else{\SB@clearpage}\fi% + \fi% + \SB@numcols\SB@cnt% + \ifnum\SB@numcols>\z@% + \SB@colwidth-\columnsep% + \multiply\SB@colwidth\SB@numcols% + \advance\SB@colwidth\columnsep% + \advance\SB@colwidth\textwidth% + \divide\SB@colwidth\SB@numcols% + \else% + \ifrepchorus\SB@warnrc\fi% + \fi% +} +\newcommand\onesongcolumn{\songcolumns\@ne} +\newcommand\twosongcolumns{\songcolumns\tw@} +\newcommand\songlist{} +\newcommand\includeonlysongs[1]{% + \ifSB@songsenv\SB@errpl\else% + \partiallisttrue% + \renewcommand\songlist{#1}% + \fi% +} +\newcommand\nosongnumbers{\setlength\songnumwidth\z@} +\newcommand\noversenumbers{% + \renewcommand\printversenum[1]{}% + \setlength\versenumwidth\z@% +} +\ifSB@etex + \newcommand\repchoruses{% + \ifnum\SB@numcols<\@ne\SB@warnrc\fi% + \repchorustrue% + } +\else + \newcommand\repchoruses{\SB@erretex} +\fi +\newcommand\norepchoruses{\repchorusfalse} +\newcommand\sepverses{% + \vvpenalty-\@M% + \ccpenalty100 % + \vcpenalty\vvpenalty% + \cvpenalty\vvpenalty% + \let\colbotglue\@flushglue% +} +\AtBeginDocument{ + \SB@setversesep + \songcolumns\SB@numcols + \SB@preamblefalse +} +\newbox\SB@songbox +\newcount\SB@numcols\SB@numcols\tw@ +\newcount\SB@colnum +\newbox\SB@colbox +\newbox\SB@pgbox +\newbox\SB@mrkbox +\newcommand\SB@maxmin[3]{\ifdim#1#2#3#1#3\fi} +\newcommand\SB@mkpage[3]{% + \begingroup% + \splitmaxdepth\maxdepth\splittopskip\z@skip% + \global\setbox#1\vbox{% + \unvbox#1% + \nointerlineskip% + \null% + \vfil% + }% + \loop\ifnum#2<\SB@numcols% + \setbox\SB@box\vsplit#1to#3\relax% + \ifvoid#1% + #2\SB@numcols% + \else% + \SB@updatepage% + \global\advance#2\@ne% + \ifrepchorus\ifvoid\SB@chorusbox\else% + \SB@insertchorus#1% + \fi\fi% + \fi% + \repeat% + \global\setbox#1\vbox{% + \unvbox\SB@box% + \unvbox#1% + \unskip% + \setbox\SB@box\lastbox% + }% + \endgroup% +} +\newcommand\SB@updatepage{% + \global\setbox\SB@mrkbox\vbox{% + \unvbox\SB@mrkbox% + \edef\SB@temp{\splitfirstmark}% + \ifx\SB@temp\@empty\else\mark{\splitfirstmark}\fi% + \edef\SB@temp{\splitbotmark}% + \ifx\SB@temp\@empty\else\mark{\splitbotmark}\fi% + }% + \global\setbox\SB@pgbox\hbox{% + \SB@dimen\SB@colwidth% + \advance\SB@dimen\columnsep% + \multiply\SB@dimen\SB@colnum% + \advance\SB@dimen-\wd\SB@pgbox% + \unhbox\SB@pgbox% + \ifdim\SB@dimen=\z@\else\hskip\SB@dimen\relax\fi% + \box\SB@box% + }% +} +\newcommand\SB@droppage{\setbox\SB@box\box\voidb@x} +\newcommand\SB@output{% + \ifnum\SB@numcols>\z@\begingroup% + \loop% + \SB@dimen\textheight% + \ifinner\else\advance\SB@dimen-\pagetotal\fi% + \SB@mkpage\SB@colbox\SB@colnum\SB@dimen% + \ifnum\SB@colnum<\SB@numcols\else% + \unvbox\SB@mrkbox% + \ifinner\else\kern\z@\fi% + \box\SB@pgbox% + \ifinner\else\vfil\break\vskip\vsize\relax\fi% + \global\SB@colnum\z@% + \repeat% + \endgroup\else% + \unvbox\SB@colbox\unskip% + \fi% +} +\newcommand\SB@putboxes[1]{% + \SB@dimen\ifnum\SB@numcols>\z@\ht\SB@colbox\else\p@\fi% + #1\SB@colbox% + \ifdim\SB@dimen>\z@% + \SB@breakpoint\spenalty% + \ifdim\sbarheight>\z@% + \vskip-\sbarheight\relax% + \fi% + \fi% + #1\SB@songbox% +} +\newcommand\SB@nextcol[2]{% + \ifnum#1>\z@% + \ifnum\SB@numcols>\z@% + \global\setbox\SB@colbox\vbox{% + \SB@cnt#1\relax% + \SB@dimen\ht\SB@colbox% + \unvbox\SB@colbox% + \unskip% + \ifdim\SB@dimen>\z@% + \vskip#2\relax% + \break% + \advance\SB@cnt\m@ne% + \fi% + \loop\ifnum\SB@cnt>\z@% + \nointerlineskip% + \null% + \vfil% + \break% + \advance\SB@cnt\m@ne% + \repeat% + }% + \SB@output% + \else% + \ifnum\lastpenalty=-\@M\null\fi% + \break% + \fi% + \fi% +} +\newcommand\SB@selectcol{} +\newcommand\SB@@selectcol{% + \begingroup% + \SB@cnt\z@% + \vbadness\@M\vfuzz\maxdimen% + \let\SB@updatepage\SB@droppage% + \SB@dimen\textheight% + \ifinner\else\advance\SB@dimen-\pagetotal\fi% + \setbox\SB@boxii\vbox{\SB@putboxes\unvcopy}% + \SB@cntii\SB@colnum% + \SB@mkpage\SB@boxii\SB@cntii\SB@dimen% + \SB@spos% + \global\SB@cnt\SB@cnt% + \endgroup% + \SB@nextcol\SB@cnt\colbotglue% +} +\newcommand\SB@spbegnew{% + \setbox\SB@boxiii\copy\SB@songbox% + \SB@cntii\z@% + \SB@mkpage\SB@boxiii\SB@cntii\textheight% +} +\newcommand\SB@spextold{% + \ifodd\c@page\else% + \SB@cntii\z@% + \SB@mkpage\SB@boxii\SB@cntii\textheight% + \fi% +} +\newcommand\SB@spextnew{% + \SB@cntii\z@% + \SB@mkpage\SB@boxiii\SB@cntii\textheight% +} +\newcommand\SB@spdblpg{% + \ifnum\SB@cntii<\SB@numcols% + \SB@cnt\SB@numcols% + \advance\SB@cnt-\SB@colnum% + \if@twoside\ifodd\c@page\else% + \advance\SB@cnt\SB@numcols% + \fi\fi% + \fi% +} +\newcommand\SB@sposi{% + \ifnum\SB@cntii<\SB@numcols\else\if@twoside% + \SB@spextold% + \fi\fi% + \ifnum\SB@cntii<\SB@numcols\else% + \SB@spbegnew% + \ifnum\SB@cntii<\SB@numcols\else\if@twoside% + \SB@spextnew% + \fi\fi% + \SB@spdblpg% + \fi% +} +\newcommand\SB@sposii{% + \ifnum\SB@cntii<\SB@numcols\else% + \SB@spbegnew% + \ifnum\SB@cntii<\SB@numcols% + \SB@cnt\SB@numcols% + \advance\SB@cnt-\SB@colnum% + \else% + \if@twoside% + \SB@spextold% + \ifnum\SB@cntii<\SB@numcols\else% + \SB@spextnew% + \SB@spdblpg% + \fi% + \fi% + \fi% + \fi% +} +\newcommand\SB@sposiii{% + \ifnum\SB@cntii>\SB@colnum% + \SB@cnt\SB@colnum% + \advance\SB@cnt\@ne% + \ifnum\SB@cnt<\SB@numcols% + \setbox\SB@boxiii\copy\SB@songbox% + \SB@mkpage\SB@boxiii\SB@cnt\SB@dimen% + \advance\SB@cnt\m@ne% + \fi% + \ifnum\SB@cnt>\SB@colnum% + \SB@cnt\z@% + \SB@sposii% + \else% + \SB@cnt\@ne% + \fi% + \fi% +} +\newcommand\songpos[1]{% + \ifcase#1% + \let\SB@selectcol\relax% + \let\SB@spos\relax% + \or% + \let\SB@selectcol\SB@@selectcol% + \let\SB@spos\SB@sposi% + \or% + \let\SB@selectcol\SB@@selectcol% + \let\SB@spos\SB@sposii% + \or% + \let\SB@selectcol\SB@@selectcol% + \let\SB@spos\SB@sposiii% + \else% + \SB@errspos% + \fi% +} +\newcommand\SB@spos{} +\songpos\thr@@ +\newcommand\SB@clearpage{% + \SB@testtrue% + \ifvoid\SB@pgbox\ifvoid\SB@colbox\SB@testfalse\fi\fi% + \ifSB@test% + \SB@cnt\SB@numcols% + \advance\SB@cnt-\SB@colnum% + \SB@nextcol\SB@cnt\lastcolglue% + \fi% +} +\newcommand\SB@cleardpage{% + \SB@clearpage% + \if@twoside\ifodd\c@page% + \SB@nextcol\SB@numcols\@flushglue% + \fi\fi% +} +\newcommand\SB@stype{\SB@stypcol} +\newcommand\SB@stypcol{% + \ifnum\SB@numcols>\z@% + \SB@selectcol% + \global\setbox\SB@colbox\vbox{\SB@putboxes\unvbox}% + \SB@output% + \else% + \unvbox\voidb@x% + \SB@breakpoint\spenalty% + \ifdim\sbarheight>\z@% + \vskip-\sbarheight\relax% + \fi% + \unvbox\SB@songbox% + \fi% +} +\newcommand\SB@styppage{% + \ifnum\SB@numcols>\z@% + \SB@clearpage% + \unvbox\SB@songbox% + \null\nointerlineskip% + \else% + \unvbox\SB@songbox% + \fi% +} +\newcommand\SB@sgroup{} +\let\SB@sgroup\@empty +\newcount\SB@groupcnt +\newcommand\SB@submitpart{% + \ifx\SB@sgroup\@empty\else% + \@for\SB@temp:=\songlist\do{% + \ifx\SB@temp\SB@sgroup% + \edef\SB@tempii{\SB@sgroup @\the\SB@groupcnt}% + \expandafter\newbox\csname songbox@\SB@tempii\endcsname% + \global\expandafter\setbox + \csname songbox@\SB@tempii\endcsname\box\SB@songbox% + \global\expandafter\let% + \csname stype@\SB@tempii\endcsname\SB@stype% + \ifrepchorus\ifvoid\SB@chorusbox\else% + \expandafter\newbox\csname chbox@\SB@tempii\endcsname% + \global\expandafter\setbox% + \csname chbox@\SB@tempii\endcsname\box\SB@chorusbox% + \fi\fi% + \fi% + }% + \global\advance\SB@groupcnt% + \ifnum\SB@groupcnt<\z@\m@ne\else\@ne\fi% + \fi% + \setbox\SB@songbox\box\voidb@x% + \setbox\SB@chorusbox\box\voidb@x% +} +\newcommand\SB@submitsong{% + \ifpartiallist\SB@submitpart\else\SB@stype\fi% +} +\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@finloop{% + \loop\edef\SB@tempii{\SB@temp @\the\SB@groupcnt}% + \expandafter\ifx% + \csname songbox@\SB@tempii\endcsname\relax\else% + \setbox\SB@songbox\expandafter\box% + \csname songbox@\SB@tempii\endcsname% + \expandafter\ifx\csname chbox@\SB@tempii\endcsname\relax% + \repchorusfalse% + \else% + \repchorustrue% + \setbox\SB@chorusbox\expandafter\box% + \csname chbox@\SB@tempii\endcsname% + \fi% + \csname stype@\SB@tempii\endcsname% + \advance\SB@groupcnt\ifnum\SB@groupcnt<\z@\m@ne\else\@ne\fi% + \repeat% +} +\newcommand\commitsongs{% + \ifpartiallist% + \ifnum\SB@numcols>\z@% + \@for\SB@temp:=\songlist\do{% + \ifx\SB@temp\SB@songlistnc\SB@nextcol\@ne\@flushglue\else% + \ifx\SB@temp\SB@songlistbrk\SB@nextcol\@ne\colbotglue\else% + \ifx\SB@temp\SB@songlistcp\SB@clearpage\else% + \ifx\SB@temp\SB@songlistcdp\SB@cleardpage\else% + \SB@groupcnt\m@ne\SB@finloop% + \SB@groupcnt\z@\SB@finloop% + \fi\fi\fi\fi% + }% + \else% + \@for\SB@temp:=\songlist\do{% + \ifx\SB@temp\SB@songlistnc\vfil\break\else% + \ifx\SB@temp\SB@songlistbrk\break\else% + \ifx\SB@temp\SB@songlistcp\clearpage\else% + \ifx\SB@temp\SB@songlistcdp% + \clearpage% + \ifodd\c@page\null\newpage\fi% + \else% + \SB@groupcnt\m@ne\SB@finloop% + \SB@groupcnt\z@\SB@finloop% + \fi\fi\fi\fi% + }% + \fi% + \fi% + \SB@clearpage% +} +\newcommand\SB@insertchorus[1]{{% + \vbadness\@M\vfuzz\maxdimen% + \setbox\SB@box\copy#1% + \setbox\SB@box\vsplit\SB@box to\maxdimen% + \edef\SB@temp{\splitfirstmarks\SB@nocmarkclass}% + \ifx\SB@temp\SB@nocmark\else% + \edef\SB@temp{\splitfirstmarks\SB@cmarkclass}% + \ifx\SB@temp\SB@cmark% + \SB@dimen4096\p@% + \SB@dimenii\maxdimen% + \SB@dimeniii\SB@dimen% + \loop% + \SB@dimeniii.5\SB@dimeniii% + \setbox\SB@box\copy#1% + \setbox\SB@box\vsplit\SB@box to\SB@dimen% + \edef\SB@temp{\splitfirstmarks\SB@cmarkclass}% + \ifx\SB@temp\SB@cmark% + \SB@dimenii\SB@dimen% + \advance\SB@dimen-\SB@dimeniii% + \else% + \advance\SB@dimen\SB@dimeniii% + \fi% + \ifdim\SB@dimeniii>2\p@\repeat% + \setbox\SB@box\vsplit#1to\SB@dimenii% + \global\setbox#1\vbox{% + \unvbox\SB@box\unskip% + \SB@inversefalse\SB@prevversetrue\SB@stanzabreak% + \SB@putbox\unvcopy\SB@chorusbox% + \SB@inversetrue\SB@prevversefalse\SB@stanzabreak% + \unvbox#1% + }% + \else\ifx\SB@temp\SB@lastcmark% + \global\setbox#1\vbox{% + \unvbox#1% + \unskip% + \ifdim\sbarheight>\z@% + \setbox\SB@box\lastbox% + \unskip\unpenalty% + \fi% + \setbox\SB@box\lastbox% + \unskip\unskip% + \SB@inversefalse\SB@prevversetrue\SB@stanzabreak% + \marks\SB@nocmarkclass{\SB@nocmark}% + \unvcopy\SB@chorusbox% + \vskip\versesep\vskip2\p@\@plus4\p@% + \nointerlineskip\box\SB@box% + \ifdim\sbarheight>\z@% + \nobreak\vskip2\p@\@plus\p@% + \hrule\@height\sbarheight\@width\SB@colwidth% + \fi% + }% + \fi\fi% + \fi% +}} +\newcommand\nextcol{% + \@ifstar{\SB@nextcol\@ne\@flushglue}% + {\ifpartiallist\else\SB@nextcol\@ne\@flushglue\fi}% +} +\newcommand\sclearpage{% + \@ifstar\SB@clearpage{\ifpartiallist\else\SB@clearpage\fi}% +} +\newcommand\scleardpage{% + \@ifstar\SB@cleardpage{\ifpartiallist\else\SB@cleardpage\fi}% +} +\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@ifempty[3]{% + \edef\SB@temp{\the#1}% + \ifx\SB@temp\SB@emptylist#2\else#3\fi% +} +\newtoks\SB@titlelist +\newtoks\SB@titletail +\newcommand\songtitle{} +\newcommand\resettitles{% + \global\SB@titletail\SB@titlelist% + \nexttitle% +} +\newcommand\nexttitle{% + \SB@ifempty\SB@titletail{% + \global\let\songtitle\relax% + }{% + \SB@lop\SB@titletail\SB@toks% + \edef\songtitle{\the\SB@toks}% + }% +} +\newcommand\foreachtitle[1]{% + \ifx\songtitle\relax\else% + \loop#1\nexttitle\ifx\songtitle\relax\else\repeat% + \fi% +} +\newif\ifSB@songsenv\SB@songsenvfalse +\newif\ifSB@insong\SB@insongfalse +\newif\ifSB@intersong\SB@intersongfalse +\newif\ifSB@inverse\SB@inversefalse +\newif\ifSB@inchorus\SB@inchorusfalse +\newcommand\SB@closeall{} +\newcommand\SB@rawrefs{} +\newcommand\songauthors{} +\newcommand\songcopyright{} +\newcommand\songlicense{} +\newcommand\songrefs{} +\newcommand\setlicense{\gdef\songlicense} +\newcommand\SB@clearbskeys{} +\newcommand\newsongkey[2]{% + \expandafter\gdef\expandafter\SB@clearbskeys\expandafter% + {\SB@clearbskeys#2}% + \define@key{beginsong}{#1}% +} +\newsongkey{sr}{\def\SB@rawrefs{}\gdef\songrefs{}} + {\def\SB@rawrefs{#1}\SB@parsesrefs{#1}} +\newsongkey{by}{\def\songauthors{}}{\def\songauthors{#1}} +\newsongkey{cr}{\def\songcopyright{}}{\def\songcopyright{#1}} +\newsongkey{li}{\setlicense{}}{\setlicense{#1}} +\newsongkey{index}{}{\indexentry{#1}} +\newsongkey{ititle}{}{\indextitleentry{#1}} +\newenvironment{song}{\beginsong}{\SB@endsong} +\newcommand\beginsong[1]{% + \ifSB@insong\SB@errboo\SB@closeall\fi% + \ifSB@intersong\SB@errbor\SB@closeall\fi% + \SB@insongtrue% + \def\SB@closeall{\endsong}% + \SB@parsetitles{#1}% + \global\setbox\SB@songwrites\box\voidb@x% + \SB@clearbskeys% + \@ifnextchar[\SB@bskvfmt\SB@@beginsong% +} +\newcommand\SB@@beginsong{% + \@ifnextchar\bgroup\SB@bsoldfmt\SB@@@beginsong% +} +\newcommand\SB@bsoldfmt[3]{% + \SB@bskvfmt[sr={#1},by={#2},cr={#3}]% +} +\newcommand\SB@bskvfmt{} +\def\SB@bskvfmt[#1]{% + \setkeys{beginsong}{#1}% + \SB@@@beginsong% +} +\newcommand\SB@@@beginsong{% + \global\SB@stanzafalse% + \setbox\SB@chorusbox\box\voidb@x% + \SB@gotchorusfalse% + \setbox\SB@songbox\vbox\bgroup\begingroup% + \ifnum\SB@numcols>\z@\hsize\SB@colwidth\fi% + \leftskip\z@skip\rightskip\z@skip% + \parfillskip\@flushglue\parskip\z@skip% + \SB@raggedright% + \global\SB@transposefactor\z@% + \global\SB@cr@{\\}% + \protected@edef\@currentlabel{\p@songnum\thesongnum}% + \setcounter{versenum}{1}% + \SB@prevversetrue% + \meter44% + \resettitles% + \SB@addtoindexes\songtitle\SB@rawrefs\songauthors% + \nexttitle% + \foreachtitle{\expandafter\SB@addtotitles\expandafter{\songtitle}}% + \resettitles% + \lyricfont% + \SB@setbaselineskip% +} +\newcommand\SB@endsong{% + \ifSB@insong% + \ifSB@inverse\SB@erreov\endverse\fi% + \ifSB@inchorus\SB@erreoc\endchorus\fi% + \global\SB@skip\versesep% + \unskip% + \ifrepchorus\ifvoid\SB@chorusbox\else% + \ifSB@prevverse\ifvnumbered% + \marks\SB@cmarkclass{\SB@lastcmark}% + \fi\fi% + \fi\fi% + \endgroup\egroup% + \setbox\SB@songbox\vbox{% + \songmark% + \unvbox\SB@songwrites% + \ifnum\SB@numcols>\z@\hsize\SB@colwidth\fi% + \leftskip\z@skip\rightskip\z@skip% + \parfillskip\@flushglue\parskip\z@skip\parindent\z@% + \ifdim\sbarheight>\z@% + \hrule\@height\sbarheight\@width\hsize% + \nobreak\vskip5\p@% + \fi% + \ifpdfindex\begingroup% + \ifx\pdfbookmark\undefined\else% + \ifx\pdfbookmark\relax\else% + \resettitles% + \pdfbookmark[\ifnum\c@section=\z@1\else2\fi]% + {\thesongnum. \songtitle}% + {song\theSB@songsnum-\thesongnum}% + \fi\fi% + \endgroup\fi% + \vbox{\makeprelude}% + \nobreak\vskip\SB@skip% + \vskip2\p@\@plus4\p@% + \unvbox\SB@songbox% + \nobreak\vskip\SB@skip% + \vskip2\p@\@plus4\p@% + \nointerlineskip% + \vbox{\makepostlude}% + \ifdim\sbarheight>\z@% + \nobreak\vskip2\p@\@plus\p@% + \nointerlineskip% + \hbox{\vrule\@height\sbarheight\@width\hsize}% + \fi% + }% + \SB@insongfalse% + \edef\SB@sgroup{\thesongnum}% + \global\SB@groupcnt\z@% + \SB@submitsong% + \ifnum\SB@grouplvl=\z@\let\SB@sgroup\@empty\fi% + \stepcounter{songnum}% + \else% + \ifSB@intersong\SB@erreor\SB@closeall% + \else\SB@erreot\fi% + \fi% +} +\newcommand\SB@setbaselineskip{% + \SB@dimen\f@size\p@% + \baselineskip\SB@dimen\relax% + \ifchorded% + \setbox\SB@box\hbox{{\printchord{ABCDEFG\shrp\flt/j7}}}% + \advance\baselineskip\ht\SB@box% + \fi% + \ifslides% + \advance\baselineskip.2\SB@dimen\@plus.5\SB@dimen% + \@minus.2\SB@dimen% + \else% + \advance\baselineskip\z@\@plus.1\SB@dimen\relax% + \fi% + \advance\baselineskip\baselineadj% +} +\newcommand\SB@setversesep{% + \SB@dimen123456789sp% + \edef\SB@temp{\the\SB@dimen}% + \edef\SB@tempii{\the\versesep}% + \ifx\SB@temp\SB@tempii% + \begingroup% + \lyricfont% + \SB@dimen\f@size\p@% + \ifchorded% + \setbox\SB@box\hbox{{\printchord{ABCDEFG\shrp\flt/j7}}}% + \advance\SB@dimen\ht\SB@box% + \fi% + \ifslides% + \global\versesep1.2\SB@dimen\@plus.3\SB@dimen% + \@minus.3\SB@dimen% + \else% + \global\versesep.75\SB@dimen\@plus.25\SB@dimen% + \@minus.13\SB@dimen% + \fi% + \endgroup% + \fi% +} +\newcommand\makeprelude{% + \resettitles% + \ifslides% + \hbox to\hsize{{% + \hfil\stitlefont\songtitle\hfil% + }}% + \vskip5\p@% + \hbox to\hsize{% + \hfil% + \vbox{% + \divide\hsize\tw@\parskip\p@\relax% + \centering\small\extendprelude% + }% + \hfil% + }% + \else% + \ifdim\songnumwidth>\z@% + \setbox\SB@boxii\hbox{{\SB@colorbox\snumbgcolor{% + \hbox to\songnumwidth{% + \printsongnum{\thesongnum}\hfil% + }% + }}}% + \fi% + \setbox\SB@box\vbox{% + \ifnum\SB@numcols>\z@\hsize\SB@colwidth\fi% + \ifdim\songnumwidth>\z@% + \advance\hsize-\wd\SB@boxii% + \advance\hsize-3\p@% + \fi% + \SB@raggedright\offinterlineskip\lineskip\p@% + {\stitlefont% + \songtitle\par% + \nexttitle% + \foreachtitle{(\songtitle)\par}}% + \ifdim\prevdepth=\z@\kern\p@\fi% + \parskip\p@\relax\tiny% + \extendprelude% + \kern\z@% + }% + \ifdim\songnumwidth>\z@% + \hbox{% + \ifdim\ht\SB@boxii>\ht\SB@box% + \box\SB@boxii% + \kern3\p@% + \vtop{\box\SB@box}% + \else% + \SB@colorbox\snumbgcolor{\vbox to\ht\SB@box{{% + \hbox to\songnumwidth{% + \printsongnum{\thesongnum}\hfil% + }\vfil% + }}}% + \kern3\p@% + \box\SB@box% + \fi% + }% + \else% + \unvbox\SB@box% + \fi% + \fi% +} +\newcommand\makepostlude{% + \SB@raggedright\baselineskip\z@skip\parskip\z@skip\parindent\z@% + \tiny\extendpostlude% +} +\newcommand\showauthors{% + \setbox\SB@box\hbox{\bfseries\sfcode`.\@m\songauthors}% + \ifdim\wd\SB@box>\z@\unhbox\SB@box\par\fi% +} +\newcommand\showrefs{% + \setbox\SB@box\hbox{\slshape\songrefs\vphantom,}% + \ifdim\wd\SB@box>\z@\unhbox\SB@box\par\fi% +} +\newcommand\SB@next{} +\newcommand\SB@donext{} +\newcommand\SB@dothis{} +\newcommand\SB@nextname{} +\newcommand\SB@appendsp[1]{#1\expandafter{\the#1 }} +\newcommand\SB@parsetitles[1]{% + \begingroup% + \global\SB@titlelist{\\}% + \SB@toks{}% + \let\\\SB@titlesep% + \let\SB@dothis\SB@pthead% + \SB@ptstart#1\SB@endparse% + \endgroup% +} +\newcommand\SB@ptstart{\futurelet\SB@next\SB@dothis} +\newcommand\SB@pthead{% + \ifcat\noexpand\SB@next\noexpand\@sptoken% + \expandafter\SB@ptsp% + \else% + \SB@toks{}% + \let\SB@dothis\SB@ptmain% + \expandafter\SB@ptmain% + \fi% +} +\newcommand\SB@ptmain{% + \ifcat\noexpand\SB@next\noexpand\@sptoken% + \let\SB@donext\SB@ptsp% + \else\ifcat\noexpand\SB@next\noexpand\bgroup% + \let\SB@donext\SB@ptbg% + \else\ifx\SB@next\SB@endparse% + \global\SB@titlelist\expandafter{\the\SB@titlelist\\}% + \let\SB@donext\@gobble% + \else% + \ifx\SB@next\\% + \SB@toks{}% + \let\SB@dothis\SB@pthead% + \fi% + \let\SB@donext\SB@ptstep% + \fi\fi\fi% + \SB@donext% +} +\newcommand\SB@ptstep[1]{% + \global\SB@titlelist\expandafter\expandafter\expandafter{% + \expandafter\the\expandafter\SB@titlelist\the\SB@toks#1}% + \SB@toks{}% + \SB@ptstart% +} +\newcommand\SB@ptbg[1]{\SB@ptstep{{#1}}} +\newcommand\SB@ptsp{ + \SB@appendsp\SB@toks% + \afterassignment\SB@ptstart% + \let\SB@next= } +\newcommand\SB@titlesep{SB@titlesep} +\newcommand\SB@endparse{% + \SB@Error{Title parsing failed}{This error should not occur.}% +} +\newcommand\SB@testdigit[1]{% + \SB@testfalse% + \ifcat1\noexpand#1\SB@@testdigit#1\fi% +} +\newcommand\SB@@testdigit[1]{% + \ifx0#1\SB@testtrue\else% + \ifx1#1\SB@testtrue\else% + \ifx2#1\SB@testtrue\else% + \ifx3#1\SB@testtrue\else% + \ifx4#1\SB@testtrue\else% + \ifx5#1\SB@testtrue\else% + \ifx6#1\SB@testtrue\else% + \ifx7#1\SB@testtrue\else% + \ifx8#1\SB@testtrue\else% + \ifx9#1\SB@testtrue% + \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi% +} +\newcommand\SB@parsesrefs[1]{% + \begingroup% + \SB@toks{\begingroup\SB@sractives}% + \SB@prloop#1\SB@endparse% + \xdef\songrefs{\the\SB@toks\endgroup}% + \endgroup% +} +\newcommand\SB@prloop{\futurelet\SB@next\SB@prstep} +\newcommand\SB@prstep{% + \ifcat\noexpand\SB@next A% + \expandafter\SB@prcpy% + \else% + \expandafter\SB@@prstep% + \fi% +} +\newcommand\SB@@prstep{% + \ifcat\noexpand\SB@next\noexpand\@sptoken% + \let\SB@donext\SB@prspace% + \else\ifx\SB@next-% + \let\SB@donext\SB@prhyphen% + \else\ifx\SB@next,% + \let\SB@donext\SB@prcomma% + \else\ifx\SB@next\SB@endparse + \let\SB@donext\@gobble% + \else\ifcat\noexpand\SB@next\bgroup% + \let\SB@donext\SB@prgr% + \else% + \let\SB@donext\SB@prcpy% + \fi\fi\fi\fi\fi% + \SB@donext% +} +\newcommand\SB@prcpy[1]{\SB@toks\expandafter{\the\SB@toks#1}\SB@prloop} +\newcommand\SB@prgr[1]{\SB@toks\expandafter{\the\SB@toks{#1}}\SB@prloop} + +\newcommand\SB@prcomma[1]{} +{\catcode`,\active + \gdef\SB@prcomma#1{\SB@toks\expandafter{\the\SB@toks,}\SB@prloop}} +\newcommand\SB@prhyphen[1]{} +{\catcode`-\active + \gdef\SB@prhyphen#1{\SB@toks\expandafter{\the\SB@toks-}\SB@prloop}} +\newcommand\SB@prspace[1]{} +{\obeyspaces +\gdef\SB@prspace{\SB@toks\expandafter{\the\SB@toks }\SB@@prspace}} +\newcommand\SB@@prspace{\afterassignment\SB@prloop\let\SB@temp= } + +\newcommand\SB@sractives{} +{\catcode`,\active\catcode`-\active\obeyspaces\catcode`\^^M\active% +\gdef\SB@sractives{% +\let,\SB@srcomma\let-\SB@srhyphen% +\let \SB@srspace\let^^M\SB@srspace% +\SB@srspacing}% +} +\newcommand\SB@srspacing{% + \nonfrenchspacing\sfcode`\;=1500\sfcode`\,=1250\relax% +} +\newcommand\SB@srcomma{,\futurelet\SB@next\SB@@srcomma} +\newcommand\SB@@srcomma{% + \ifx\SB@next\SB@srspace\else% + \nobreak\thinspace% + \fi% +} +\newcommand\SB@srhyphen{\futurelet\SB@next\SB@@srhyphen} +\newcommand\SB@@srhyphen{% + \ifx\SB@next\SB@srhyphen\expandafter\SB@srdash\else--\fi% +} +\newcommand\SB@srdash[1]{\futurelet\SB@next\SB@@srdash} +\newcommand\SB@@srdash{% + \ifx\SB@next\SB@srhyphen---\expandafter\@gobble\else--\fi% +} +\newcommand\SB@srspace{\futurelet\SB@next\SB@@srspace} +\newcommand\SB@@srspace{% + \let\SB@donext\relax% + \ifx\SB@next\SB@srspace\else% + \ifnum\spacefactor>\@m% + \ifnum\spacefactor>1499 % + \ifcat\noexpand\SB@next0% + \let\SB@donext\SB@srcso% + \else% + \penalty-5\enskip% + \fi% + \else% + \space% + \fi% + \else% + \nobreak\space% + \fi% + \fi% + \SB@donext% +} +\newcommand\SB@srcso[1]{\futurelet\SB@temp\SB@@srcso} +\newcommand\SB@@srcso{% + \ifx\SB@temp\SB@srspace% + \penalty-5\enskip% + \else% + \space% + \fi% + \SB@next% +} +\newif\ifSB@stanza +\newcommand\SB@stanzabreak{% + \ifhmode\par\fi% + \ifSB@stanza% + \SB@breakpoint{% + \ifSB@inverse% + \ifSB@prevverse\vvpenalty\else\cvpenalty\fi% + \else% + \ifSB@prevverse\vcpenalty\else\ccpenalty\fi% + \fi% + }% + \vskip\versesep% + \fi% +} +\newcommand\SB@breakpoint[1]{% + \begingroup% + \ifnum#1<\@M% + \SB@skip\colbotglue\relax% + \SB@skip-\SB@skip% + \else% + \SB@skip\z@skip% + \fi% + \advance\SB@skip\lastskip% + \unskip% + \nobreak% + \ifnum#1<\@M% + \vskip\colbotglue\relax% + \penalty#1% + \fi% + \vskip\SB@skip% + \endgroup% +} +\newcommand\SB@putbox[2]{% + \begingroup% + \SB@dimen\dp#2% + #1#2% + \setbox\SB@box\hbox{{\lyricfont p}}% + \ifdim\SB@dimen<\dp\SB@box% + \advance\SB@dimen-\dp\SB@box% + \vskip-\SB@dimen% + \fi% + \setbox\SB@box\box\voidb@x% + \endgroup% +} +\newcommand\SB@obeylines{% + \let\par\SB@par% + \obeylines% + \let\@par\SB@@par% +} +\newcommand\SB@par{% + \ifhmode% + \SB@cnt\interlinepenalty% + \interlinepenalty\@M% + \endgraf% + \interlinepenalty\SB@cnt% + \ifSB@inchorus% + \ifdim\cbarwidth>\z@\nobreak\else\SB@ilpenalty\fi% + \else% + \SB@ilpenalty% + \fi% + \fi% +} +\newcommand\SB@ilpenalty{% + \ifnum\interlinepenalty=\z@\else% + \penalty\interlinepenalty% + \fi% +} +\newcommand\SB@@par{\let\par\SB@par\par} +\newdimen\SB@parindent +\newcommand\SB@everypar{} +\newcommand\SB@raggedright{% + \SB@parindent\parindent% + \raggedright% + \parindent\SB@parindent% +} +\newif\ifvnumbered +\newif\ifSB@prevverse +\CheckCommand\verse{% + \let\\\@centercr% + \list{}{% + \itemsep\z@% + \itemindent-1.5em% + \listparindent\itemindent% + \rightmargin\leftmargin% + \advance\leftmargin1.5em% + }% + \item\relax% +} +\renewenvironment{verse} + {\vnumberedfalse\SB@beginverse} + {\SB@endverse} +\newenvironment{verse*} + {\vnumberedtrue\SB@beginverse} + {\SB@endverse} +\newcommand\beginverse{% + \begingroup% + \SB@loadactives% + \@ifstar{\endgroup\vnumberedfalse\SB@beginverse}% + {\endgroup\vnumberedtrue\SB@beginverse}% +} +\newcommand\SB@beginverse{% + \ifSB@insong% + \ifSB@inverse\SB@errbvv\endverse\fi% + \ifSB@inchorus\SB@errbvc\endchorus\fi% + \else% + \SB@errbvt\beginsong{Unknown Song}% + \fi% + \ifrepchorus\ifvoid\SB@chorusbox\else% + \SB@gotchorustrue% + \ifSB@prevverse\ifvnumbered% + \marks\SB@cmarkclass{\SB@cmark}% + \fi\fi% + \fi\fi% + \SB@inversetrue% + \def\SB@closeall{\endverse\endsong}% + \SB@stanzabreak% + \versemark\nobreak% + \global\SB@stanzatrue% + \SB@ifempty\SB@cr@\memorize{\replay[]}% + \setbox\SB@box\vbox\bgroup\begingroup% + \ifvnumbered% + \protected@edef\@currentlabel{\p@versenum\theversenum}% + \def\SB@everypar{% + \setbox\SB@box\hbox{{% + \printversenum{\theversenum}% + }}% + \ifdim\wd\SB@box<\versenumwidth% + \setbox\SB@box% + \hbox to\versenumwidth{\unhbox\SB@box\hfil}% + \fi% + \ifchorded\vrule\@height\baselineskip\@width\z@\@depth\z@\fi% + {\placeversenum\SB@box}% + \gdef\SB@everypar{}% + }% + \else% + \def\SB@everypar{% + \ifchorded\vrule\@height\baselineskip\@width\z@\@depth\z@\fi% + \gdef\SB@everypar{}% + }% + \fi% + \everypar{\SB@everypar\everypar{}}% + \versefont\versejustify% + \SB@loadactives% + \SB@obeylines% + \penalty12345 % + \everyverse\relax% +} +\newcommand\SB@endverse{% + \ifSB@insong% + \ifSB@inverse% + \unpenalty% + \endgroup\egroup% + \SB@putbox\unvbox\SB@box% + \SB@inversefalse% + \def\SB@closeall{\endsong}% + \ifvnumbered\stepcounter{versenum}\fi% + \SB@prevversetrue% + \else\ifSB@inchorus\SB@errevc\endchorus% + \else\SB@errevo\fi\fi% + \else% + \SB@errevt% + \fi% +} +\newif\ifSB@chorustop +\newbox\SB@chorusbox +\newif\ifSB@gotchorus +\ifSB@etex + \@ifundefined{newmarks}{ + \@ifundefined{newmark}{ + \mathchardef\SB@cmarkclass83 + \mathchardef\SB@nocmarkclass84 + }{ + \newmark\SB@cmarkclass + \newmark\SB@nocmarkclass + } + }{ + \newmarks\SB@cmarkclass + \newmarks\SB@nocmarkclass + } +\fi +\newcommand\SB@cmark{} +\def\SB@cmark{SB@cmark} +\newcommand\SB@lastcmark{} +\def\SB@lastcmark{SB@lastcmark} +\newcommand\SB@nocmark{} +\def\SB@nocmark{SB@nocmark} +\newenvironment{chorus}{\beginchorus}{\SB@endchorus} +\newcommand\beginchorus{% + \ifSB@insong + \ifSB@inverse\SB@errbcv\endverse\fi% + \ifSB@inchorus\SB@errbcc\endchorus\fi% + \else% + \SB@errbct\beginsong{Unknown Song}% + \fi% + \SB@inchorustrue% + \def\SB@closeall{\endchorus\endsong}% + \SB@chorustoptrue% + \vnumberedfalse% + \SB@stanzabreak% + \chorusmark% + \ifrepchorus% + \ifSB@gotchorus\else\ifSB@prevverse\else% + \global\setbox\SB@chorusbox\vbox{% + \unvbox\SB@chorusbox% + \SB@stanzabreak% + \chorusmark% + }% + \fi\fi% + \fi% + \global\SB@stanzatrue% + \replay[]% + \SB@@beginchorus% + \everychorus\relax% +} +\newcommand\SB@@beginchorus{% + \ifrepchorus\marks\SB@cmarkclass{}\fi% + \setbox\SB@box\vbox\bgroup\begingroup% + \ifchorded% + \def\SB@everypar{% + \vrule\@height\baselineskip\@width\z@\@depth\z@% + \gdef\SB@everypar{}% + }% + \everypar{\SB@everypar\everypar{}}% + \fi% + \chorusfont\chorusjustify% + \SB@loadactives% + \SB@obeylines% + \penalty12345 % +} +\newcommand\SB@endchorus{% + \ifSB@insong% + \ifSB@inchorus% + \unpenalty% + \endgroup\egroup% + \SB@inchorusfalse% + \def\SB@closeall{\endsong}% + \setbox\SB@box\vbox{% + \SB@chorusbar\SB@box% + \SB@putbox\unvbox\SB@box% + } + \ifrepchorus\ifSB@gotchorus\else% + \global\setbox\SB@chorusbox\vbox{% + \unvbox\SB@chorusbox% + \unvcopy\SB@box% + }% + \fi\fi% + \unvbox\SB@box% + \SB@prevversefalse% + \else\ifSB@inverse\SB@errecv\endverse% + \else\SB@erreco\fi\fi% + \else% + \SB@errect% + \fi% +} +\newcommand\SB@cbarshift{% + \ifSB@inchorus\ifdim\cbarwidth>\z@% + \advance\leftskip\cbarwidth% + \advance\leftskip5\p@\relax% + \fi\fi% +} +\newcommand\SB@chorusbar[1]{% + \ifdim\cbarwidth>\z@% + \SB@dimen\ht#1% + \SB@dimenii\dp#1% + \advance\SB@dimen% + \ifSB@chorustop\ifchorded\else2\fi\fi\SB@dimenii% + \SB@skip\SB@dimen\relax% + \SB@computess\SB@skip1\@plus#1% + \SB@computess\SB@skip{-1}\@minus#1% + \nointerlineskip\null\nobreak% + \leaders\vrule\@width\cbarwidth\vskip\SB@skip% + \ifSB@chorustop\ifchorded\else% + \advance\SB@skip-\SB@dimenii% + \fi\fi% + \nobreak\vskip-\SB@skip% + \fi% +} +\newcommand\SB@computess[4]{% + \begingroup% + \vbadness\@M\vfuzz\maxdimen% + \SB@dimen4096\p@% + \setbox\SB@box\vbox spread#2\SB@dimen{\unvcopy#4}% + \ifnum\badness=\z@% + \global\advance#1\z@#31fil\relax% + \else% + \SB@dimenii\SB@dimen% + \loop% + \SB@dimenii.5\SB@dimenii% + \ifnum\badness<100 % + \advance\SB@dimen\SB@dimenii% + \else + \advance\SB@dimen-\SB@dimenii% + \fi% + \setbox\SB@box\vbox spread#2\SB@dimen{\unvcopy#4}% + \ifnum\badness=100 \SB@dimenii\z@\fi% + \ifdim\SB@dimenii>.1\p@\repeat% + \ifdim\SB@dimen<.1\p@\SB@dimen\z@\fi% + \global\advance#1\z@#3\SB@dimen\relax% + \fi% + \endgroup% +} +\newcommand\brk{% + \ifSB@insong% + \ifhmode\penalty-5 \else% + \unpenalty% + \ifSB@inchorus% + \ifdim\cbarwidth=\z@% + \ifrepchorus\marks\SB@cmarkclass{}\fi% + \SB@breakpoint\brkpenalty% + \else% + \endgroup\egroup% + \ifrepchorus\ifSB@gotchorus\else% + \global\setbox\SB@chorusbox\vbox{% + \unvbox\SB@chorusbox% + \SB@chorusbar\SB@box% + \unvcopy\SB@box% + \SB@breakpoint\brkpenalty% + }% + \fi\fi% + \SB@chorusbar\SB@box% + \unvbox\SB@box% + \SB@breakpoint\brkpenalty% + \SB@chorustopfalse% + \SB@@beginchorus% + \fi% + \else% + \SB@breakpoint\brkpenalty% + \fi% + \fi% + \else% + \ifpartiallist\else\SB@nextcol\@ne\colbotglue\fi% + \fi% +} +\newcommand\SB@boxup[1]{% + \setbox\SB@box\hbox{{\notefont#1}}% + \SB@dimen\wd\SB@box% + \advance\SB@dimen6\p@% + \advance\SB@dimen\leftskip% + \advance\SB@dimen\rightskip% + \ifdim\SB@dimen>\hsize% + \vbox{{% + \advance\hsize-6\p@% + \advance\hsize-\leftskip% + \advance\hsize-\rightskip% + \notejustify% + \unhbox\SB@box\par% + \kern\z@% + }}% + \else% + \vbox{\box\SB@box\kern\z@}% + \fi% +} +\newcommand\textnote[1]{% + \ifhmode\par\fi% + \ifnum\lastpenalty=12345\else% + \ifSB@inverse% + \vskip2\p@\relax% + \else\ifSB@inchorus% + \vskip2\p@\relax% + \else\ifSB@stanza% + \nobreak\vskip\versesep% + \fi\fi\fi% + \fi% + \begingroup% + \everypar{}% + \ifchorded\chordedfalse\SB@setbaselineskip\chordedtrue\fi% + \placenote{\SB@colorbox\notebgcolor{\SB@boxup{#1}}}% + \endgroup% + \nobreak% + \ifSB@inverse% + \vskip2\p@\relax% + \else\ifSB@inchorus% + \vskip2\p@\relax% + \else\ifSB@stanza\else% + \nobreak\vskip\versesep% + \fi\fi\fi% +} +\newcommand\musicnote[1]{\ifchorded\textnote{#1}\fi} +\ifSB@etex + \newcommand\echo{\begingroup\@sanitize\SB@echo} + \newcommand\SB@echo[1]{% + \endgroup% + \begingroup% + \ifdim\fontdimen\@ne\font>\z@\upshape\else\slshape\fi% + \endlinechar\m@ne% + \scantokens{(#1)}% + \endgroup% + } +\else + \newcommand\echo{% + \begingroup% + \ifdim\fontdimen\@ne\font>\z@\upshape\else\slshape\fi% + \afterassignment\SB@echo% + \setbox\SB@box\hbox% + } + \newcommand\SB@echo{\aftergroup\SB@@echo(} + \newcommand\SB@@echo{\unhbox\SB@box)\endgroup} +\fi +\newcommand\rep[1]{% + (\raise.25ex\hbox{% + \fontencoding{OMS}\fontfamily{cmsy}\selectfont\char\tw@% + }#1)% +} +\newenvironment{songgroup}{% + \ifnum\SB@grouplvl=\z@% + \edef\SB@sgroup{\thesongnum}% + \global\SB@groupcnt\m@ne% + \fi% + \advance\SB@grouplvl\@ne% +}{% + \advance\SB@grouplvl\m@ne% + \ifnum\SB@grouplvl=\z@\let\SB@sgroup\@empty\fi% +} +\newcount\SB@grouplvl +\newenvironment{intersong}{% + \ifSB@insong\SB@errbro\SB@closeall\fi% + \ifSB@intersong\SB@errbrr\SB@closeall\fi% + \setbox\SB@chorusbox\box\voidb@x% + \SB@intersongtrue% + \def\SB@closeall{\end{intersong}}% + \setbox\SB@songbox\vbox\bgroup\begingroup% + \ifnum\SB@numcols>\z@\hsize\SB@colwidth\fi% + \ifdim\sbarheight>\z@% + \hrule\@height\sbarheight\@width\hsize% + \nobreak% + \fi% +}{% + \ifSB@intersong + \ifdim\sbarheight>\z@% + \ifhmode\par\fi% + \SB@skip\lastskip% + \unskip\nobreak\vskip\SB@skip% + \hbox{\vrule\@height\sbarheight\@width\hsize}% + \fi% + \endgroup\egroup% + \ifSB@omitscrip% + \setbox\SB@songbox\box\voidb@x% + \else% + \SB@submitsong% + \fi% + \SB@intersongfalse% + \else% + \ifSB@insong\SB@errero\SB@closeall\else\SB@errert\fi% + \fi% +} +\newenvironment{intersong*}{% + \ifSB@insong\SB@errbro\SB@closeall\fi% + \ifSB@intersong\SB@errbrr\SB@closeall\fi% + \setbox\SB@chorusbox\box\voidb@x% + \SB@intersongtrue% + \def\SB@closeall{\end{intersong*}}% + \setbox\SB@songbox\vbox\bgroup\begingroup% +}{% + \ifSB@intersong% + \endgroup\egroup% + \ifSB@omitscrip% + \setbox\SB@songbox\box\voidb@x% + \else% + \def\SB@stype{\SB@styppage}% + \SB@submitsong% + \def\SB@stype{\SB@stypcol}% + \fi% + \SB@intersongfalse% + \else% + \ifSB@insong\SB@errero\SB@closeall\else\SB@errert\fi% + \fi% +} +\newbox\SB@srbox +\newenvironment{scripture}{\beginscripture}{\SB@endscripture} +\newcommand\beginscripture[1]{% + \begin{intersong}% + \SB@parsesrefs{#1}% + \setbox\SB@srbox\hbox{{\printscrcite\songrefs}}% + \def\SB@closeall{\endscripture}% + \nobreak\vskip5\p@% + \SB@parindent\parindent\parindent\z@% + \parskip\z@skip\parfillskip\@flushglue% + \leftskip\SB@parindent\rightskip\SB@parindent\relax% + \scripturefont% + \baselineskip\f@size\p@\@plus\p@\relax% + \advance\baselineskip\p@\relax% + \emergencystretch.3em% +} +\newcommand\SB@endscripture{% + \ifSB@intersong + \scitehere% + \ifhmode\par\fi% + \vskip-3\p@% + \end{intersong}% + \fi% +} +\newcommand\scitehere{% + \ifSB@intersong% + \ifvoid\SB@srbox\else% + \ifvmode% + \setbox\SB@box\lastbox% + \nointerlineskip\noindent\hskip-\leftskip% + \unhbox\SB@box\unskip% + \fi% + \unskip\nobreak\hfil\penalty50\hskip.8em\null\nobreak\hfil% + \box\SB@srbox\kern-\SB@parindent% + {\parfillskip\z@\finalhyphendemerits2000\par}% + \fi% + \else% + \SB@errscrip\scitehere% + \fi% +} +\newcommand\Acolon{\SB@colon2\Acolon} +\newcommand\Bcolon{\SB@colon1\Bcolon} +\newcommand\SB@colon[2]{% + \ifSB@intersong\else% + \SB@errscrip#2% + \beginscripture{Unknown}% + \fi% + \ifhmode\par\fi% + \begingroup% + \rightskip\SB@parindent\@plus4em% + \advance\leftskip2\SB@parindent% + \advance\parindent-#1\SB@parindent% + \def\par{\endgraf\endgroup}% + \obeylines% +} +\newcommand\strophe{% + \ifSB@intersong\else% + \SB@errscrip\strophe\beginscripture{Unknown}% + \fi% + \vskip.9ex\@plus.45ex\@minus.68ex\relax% +} +\newcommand\SB@scripdent[2]{% + \ifSB@intersong\else% + \SB@errscrip#2\beginscripture{Unknown}% + \fi% + \ifhmode\par\fi% + \advance\leftskip#1\SB@parindent\relax% +} +\newcommand\scripindent{\SB@scripdent1\scripindent} +\newcommand\scripoutdent{\SB@scripdent-\scripoutdent} +\newcommand\SB@quotesactive{% + \catcode`'\active% + \catcode``\active% +} +\newcommand\shiftdblquotes[4]{} +\newcommand\SB@ldqleft{} +\newcommand\SB@ldqright{} +\newcommand\SB@rdqleft{} +\newcommand\SB@rdqright{} +\newcommand\SB@scanlq{} +\newcommand\SB@scanrq{} +\newcommand\SB@dolq{} +\newcommand\SB@dorq{} +{ + \SB@quotesactive + \gdef\shiftdblquotes#1#2#3#4{% + \def\SB@ldqleft{\kern#1}% + \def\SB@ldqright{\kern#2}% + \def\SB@rdqleft{\kern#3}% + \def\SB@rdqright{\kern#4}% + \SB@quotesactive% + \def`{\futurelet\SB@next\SB@scanlq}% + \def'{\futurelet\SB@next\SB@scanrq}% + } + \gdef\SB@scanlq{% + \ifx\SB@next`% + \expandafter\SB@dolq% + \else% + \expandafter\lq% + \fi% + } + \gdef\SB@scanrq{% + \ifx\SB@next'% + \expandafter\SB@dorq% + \else% + \expandafter\rq% + \fi% + } + \gdef\SB@dolq`{% + \ifvmode\leavevmode\else\/\fi% + \vadjust{}% + \SB@ldqleft\lq\lq\SB@ldqright% + \vadjust{}% + } + \gdef\SB@dorq'{% + \ifvmode\leavevmode\else\/\fi% + \vadjust{}% + \SB@rdqleft\rq\rq\SB@rdqright% + \vadjust{}% + } +} +\newcount\SB@transposefactor +\newif\ifSB@convertnotes +\newcommand\notenameA{} +\newcommand\notenameB{} +\newcommand\notenameC{} +\newcommand\notenameD{} +\newcommand\notenameE{} +\newcommand\notenameF{} +\newcommand\notenameG{} +\newcommand\printnoteA{} +\newcommand\printnoteB{} +\newcommand\printnoteC{} +\newcommand\printnoteD{} +\newcommand\printnoteE{} +\newcommand\printnoteF{} +\newcommand\printnoteG{} +\newcommand\notenamesin[7]{% + \def\notenameA{#1}% + \def\notenameB{#2}% + \def\notenameC{#3}% + \def\notenameD{#4}% + \def\notenameE{#5}% + \def\notenameF{#6}% + \def\notenameG{#7}% + \SB@convertnotestrue% +} +\newcommand\notenamesout[7]{% + \def\printnoteA{#1}% + \def\printnoteB{#2}% + \def\printnoteC{#3}% + \def\printnoteD{#4}% + \def\printnoteE{#5}% + \def\printnoteF{#6}% + \def\printnoteG{#7}% + \SB@convertnotestrue% +} +\newcommand\notenames[7]{% + \notenamesin{#1}{#2}{#3}{#4}{#5}{#6}{#7}% + \notenamesout{#1}{#2}{#3}{#4}{#5}{#6}{#7}% + \SB@convertnotesfalse% +} +\newcommand\alphascale{\notenames ABCDEFG} +\newcommand\solfedge{\notenames{LA}{SI}{DO}{RE}{MI}{FA}{SOL}} +\alphascale +\newif\ifSB@prefshrps +\newif\ifSB@needkey +\newcommand\transpose[1]{% + \advance\SB@transposefactor by#1\relax% + \SB@cnt\SB@transposefactor% + \divide\SB@cnt12 % + \multiply\SB@cnt12 % + \advance\SB@transposefactor-\SB@cnt% + \SB@needkeytrue% +} +\newcommand\capo[1]{% + \iftranscapos\transpose{#1}\else\musicnote{capo #1}\fi% +} +\newcommand\prefersharps{\SB@prefshrpstrue\SB@needkeyfalse} +\newcommand\preferflats{\SB@prefshrpsfalse\SB@needkeyfalse} +\newcommand\transposehere[1]{% + \ifnum\SB@transposefactor=\z@% + \ifSB@convertnotes% + \SB@dotranspose{#1}% + \the\SB@toks% + \else% + #1% + \fi% + \else% + \ifSB@convertnotes% + {\SB@transposefactor\z@% + \SB@dotranspose{#1}% + \xdef\SB@tempv{\the\SB@toks}}% + \else% + \def\SB@tempv{#1}% + \fi% + \SB@dotranspose{#1}% + \expandafter\trchordformat\expandafter{\SB@tempv}{\the\SB@toks}% + \fi% +} +\newcommand\SB@dotranspose[1]{% + \SB@toks{}% + \let\SB@dothis\SB@trmain% + \SB@trscan#1\SB@trend% +} +\newcommand\trchordformat[2]{#2} +\newcommand\SB@trscan{\futurelet\SB@next\SB@dothis} +\newcommand\SB@trmain{% + \ifx\SB@next\bgroup% + \let\SB@donext\SB@trgroup% + \else\ifx\SB@next\egroup% + \SB@toks\expandafter{\the\SB@toks\egroup}% + \let\SB@donext\SB@trskip% + \else\ifcat\noexpand\SB@next\noexpand\@sptoken% + \SB@appendsp\SB@toks% + \let\SB@donext\SB@trskip% + \else% + \let\SB@donext\SB@trstep% + \fi\fi\fi% + \SB@donext% +} +\newcommand\SB@trgroup[1]{% + \SB@toks\expandafter{\the\SB@toks{#1}}% + \SB@trscan% +} +\newcommand\SB@trskip{% + \afterassignment\SB@trscan% + \let\SB@next= } +\newcommand\SB@trstep[1]{% + \let\SB@donext\SB@trscan% + \ifcat\noexpand\SB@next A% + \ifnum\uccode`#1=`#1% + \def\SB@temp{#1}% + \let\SB@dothis\SB@trnote% + \else% + \SB@toks\expandafter{\the\SB@toks#1}% + \fi% + \else\ifx\SB@next\gtab% + \let\SB@donext\SB@trtab% + \else\ifx\SB@next\SB@trend + \let\SB@donext\relax% + \else% + \SB@toks\expandafter{\the\SB@toks#1}% + \fi\fi\fi% + \SB@donext% +} +\newcommand\SB@trnote{% + \ifcat\noexpand\SB@next A% + \let\SB@donext\SB@trnotestep% + \else\ifnum\SB@transposefactor=\z@% + \SB@cnt\z@% + \let\SB@donext\SB@trtrans% + \else\ifx\SB@next\flt% + \SB@cnt\m@ne% + \let\SB@donext\SB@tracc% + \else\ifx\SB@next\shrp% + \SB@cnt\@ne% + \let\SB@donext\SB@tracc% + \else% + \SB@cnt\z@% + \let\SB@donext\SB@trtrans% + \fi\fi\fi\fi% + \SB@donext% +} +\newcommand\SB@trnotestep[1]{% + \ifnum\uccode`#1=`#1% + \expandafter\def\expandafter\SB@temp\expandafter{\SB@temp#1}% + \expandafter\SB@trscan% + \else% + \SB@cnt\z@% + \expandafter\SB@trtrans\expandafter#1% + \fi% +} +\newcommand\SB@tracc[1]{\futurelet\SB@next\SB@trtrans} +\newcommand\SB@trtrans{% + \advance\SB@cnt% + \ifx\SB@temp\notenameA\z@% + \else\ifx\SB@temp\notenameB\tw@% + \else\ifx\SB@temp\notenameC\thr@@% + \else\ifx\SB@temp\notenameD5 % + \else\ifx\SB@temp\notenameE7 % + \else\ifx\SB@temp\notenameF8 % + \else\ifx\SB@temp\notenameG10 % + \else-99 \fi\fi\fi\fi\fi\fi\fi% + \ifnum\SB@cnt<\m@ne% + \SB@toks\expandafter\expandafter\expandafter{% + \expandafter\the\expandafter\SB@toks\SB@temp}% + \else% + \advance\SB@cnt\SB@transposefactor% + \ifnum\SB@cnt<\z@\advance\SB@cnt12 \fi% + \ifnum\SB@cnt>11 \advance\SB@cnt-12 \fi% + \ifSB@needkey\ifnum\SB@transposefactor=\z@\else\SB@setkeysig\fi\fi% + \edef\SB@temp{% + \the\SB@toks% + \ifSB@prefshrps% + \ifcase\SB@cnt\printnoteA\or\printnoteA\noexpand\shrp\or% + \printnoteB\or\printnoteC\or\printnoteC\noexpand\shrp\or% + \printnoteD\or\printnoteD\noexpand\shrp\or\printnoteE\or% + \printnoteF\or\printnoteF\noexpand\shrp\or\printnoteG\or% + \printnoteG\noexpand\shrp\fi% + \else% + \ifcase\SB@cnt\printnoteA\or\printnoteB\noexpand\flt\or% + \printnoteB\or\printnoteC\or\printnoteD\noexpand\flt\or% + \printnoteD\or\printnoteE\noexpand\flt\or\printnoteE\or% + \printnoteF\or\printnoteG\noexpand\flt\or\printnoteG\or% + \printnoteA\noexpand\flt\fi% + \fi}% + \SB@toks\expandafter{\SB@temp}% + \fi% + \let\SB@dothis\SB@trmain% + \SB@trscan% +} +\newcommand\SB@setkeysig{% + \global\SB@needkeyfalse% + \ifcase\SB@cnt% + \global\SB@prefshrpstrue\or% A + \global\SB@prefshrpsfalse\or% Bb + \global\SB@prefshrpstrue\or% B + \ifx\SB@next m% C + \global\SB@prefshrpsfalse% + \else% + \global\SB@prefshrpstrue% + \fi\or% + \global\SB@prefshrpstrue\or% C# + \ifx\SB@next m% D + \global\SB@prefshrpsfalse% + \else% + \global\SB@prefshrpstrue% + \fi\or% + \global\SB@prefshrpsfalse\or% Eb + \global\SB@prefshrpstrue\or% E + \global\SB@prefshrpsfalse\or% F + \global\SB@prefshrpstrue\or% F# + \ifx\SB@next m% G + \global\SB@prefshrpsfalse% + \else% + \global\SB@prefshrpstrue% + \fi\or% + \global\SB@prefshrpsfalse\else% Ab + \global\SB@needkeytrue% non-chord + \fi% +} +\newcommand\SB@trtab{\expandafter\SB@trscan\@firstoftwo} +\newcommand\SB@trend{% + \SB@Error{Internal Error: Transposition failed}% + {This error should not occur.}% +} +\newcommand\SB@metertop{} +\newcommand\SB@meterbot{} +\newcommand\meter[2]{\gdef\SB@metertop{#1}\gdef\SB@meterbot{#2}} +\newcommand\SB@measuremark{SB@IsMeasure} +\newcommand\SB@makembar[2]{% + \ifSB@inverse\else% + \ifSB@inchorus\else\SB@errmbar\fi% + \fi% + \ifhmode% + \SB@skip\lastskip\unskip% + \setbox\SB@box\lastbox% + \copy\SB@box% + \ifvbox\SB@box% + \begingroup% + \setbox\SB@boxii\copy\SB@box% + \vbadness\@M\vfuzz\maxdimen% + \setbox\SB@boxii% + \vsplit\SB@boxii to\maxdimen% + \endgroup% + \long\edef\SB@temp{\splitfirstmark}% + \ifx\SB@temp\SB@measuremark% + \penalty100\hskip1em% + \else% + \penalty100\hskip\SB@skip% + \fi% + \else% + \penalty100\hskip\SB@skip% + \fi% + \fi% + \setbox\SB@box\hbox{\tiny\sffamily{#1}}% + \setbox\SB@boxii\hbox{\tiny\sffamily{#2}}% + \ifdim\wd\SB@box>\wd\SB@boxii% + \SB@dimen\wd\SB@box\relax% + \else% + \SB@dimen\wd\SB@boxii\relax% + \fi% + \ifdim\SB@dimen<.5\p@% + \SB@dimen.5\p@% + \fi% + \SB@dimenii\baselineskip% + \advance\SB@dimenii-2\p@% + \advance\SB@dimenii-\ht\SB@box% + \advance\SB@dimenii-\dp\SB@box% + \advance\SB@dimenii-\ht\SB@boxii% + \advance\SB@dimenii-\dp\SB@boxii% + \ifvmode\leavevmode\fi% + \vbox{% + \mark{\SB@measuremark}% + \hbox to\SB@dimen{% + \hfil% + \box\SB@box% + \hfil% + }% + \nointerlineskip% + \hbox to\SB@dimen{% + \hfil% + \box\SB@boxii% + \hfil% + }% + \nointerlineskip% + \hbox to\SB@dimen{% + \hfil% + \vrule\@width.5\p@\@height\SB@dimenii% + \hfil% + }% + }% +} +\newcommand\mbar{\SB@mbar} +\newcommand\measurebar{% + \mbar\SB@metertop\SB@meterbot% + \meter{}{}% +} +\newcommand\SB@repcolon{{% + \usefont{OT1}{cmss}{m}{n}\selectfont% + \ifchorded% + \baselineskip.5\SB@dimen% + \vbox{\hbox{:}\hbox{:}\kern.5\p@}% + \else% + \raise.5\p@\hbox{:}% + \fi% +}} +\newcommand\lrep{% + \SB@dimen\baselineskip% + \advance\SB@dimen-2\p@% + \vrule\@width1.5\p@\@height\SB@dimen\@depth\p@% + \kern1.5\p@% + \vrule\@width.5\p@\@height\SB@dimen\@depth\p@% + \SB@repcolon% +} +\newcommand\rrep{% + \SB@dimen\baselineskip% + \advance\SB@dimen-2\p@% + \SB@repcolon% + \vrule\@width.5\p@\@height\SB@dimen\@depth\p@% + \kern1.5\p@% + \vrule\@width1.5\p@\@height\SB@dimen\@depth\p@% +} +\newif\ifSB@wordends +\newif\ifSB@brokenword +\newtoks\SB@lyric +\newcount\SB@numhyps +\newtoks\SB@lyricnohyp +\newbox\SB@lyricbox +\newbox\SB@chordbox +\newcommand\SB@chbstok{} +\newcommand\SB@setchord{} +{ + \catcode`^\active + \catcode`!7 + \gdef\SB@setchord#1{% + \SB@gettabindtrue\SB@nohattrue% + \setbox\SB@chordbox\hbox{% + \unhbox\SB@chordbox% + \begingroup% + \ifSB@trackch% + \def\SB@activehat{\ifmmode!\else\global\SB@nohatfalse\fi}% + \else% + \def\SB@activehat{% + \ifmmode!\else\SB@lop\SB@ctail\SB@toks\the\SB@toks\fi% + }% + \fi% + \let^\SB@activehat% + \printchord{% + \ifSB@firstchord\else\kern.15em\fi% + \vphantom/% + \transposehere{#1}% + \kern.2em% + }% + \endgroup% + }% + \SB@gettabindfalse% + \ifSB@trackch\ifSB@nohat% + \global\SB@creg\expandafter{\the\SB@creg#1\\}% + \fi\fi% + \let\SB@noreplay\@firstofone% + } +} +\newcommand\SB@outertest{} +\edef\SB@outertest#1{% + \noexpand\SB@@outertest#1% + \string\outer% + \noexpand\SB@@outertest% +} +\newcommand\SB@@outertest{} +\expandafter\def\expandafter\SB@@outertest% +\expandafter#\expandafter1\string\outer#2\SB@@outertest{% + \def\SB@temp{#2}% + \ifx\SB@temp\@empty\else\SB@testtrue\fi% +} +\newcommand\SB@UTFtest{} +\edef\SB@UTFtest#1{% + \noexpand\SB@UTFtester#1% + \string\UTFviii@zero@octets% + \noexpand\SB@UTFtester% +} +\begingroup + \escapechar\m@ne + \xdef\SB@two{\string\two} + \xdef\SB@three{\string\three} + \xdef\SB@four{\string\four} + \xdef\SB@temp{\string\@octets} +\endgroup +\edef\SB@temp{##1\string\UTFviii@##2\SB@temp##3} +\expandafter\def\expandafter\SB@UTFtester\SB@temp\SB@UTFtester{% + \def\SB@temp{#2}% + \ifx\SB@temp\SB@two% + \SB@cnt\tw@% + \else\ifx\SB@temp\SB@three% + \SB@cnt\thr@@% + \else\ifx\SB@temp\SB@four% + \SB@cnt4 % + \else% + \SB@cnt\z@% + \fi\fi\fi% +} +\newcommand\SB@declare[3]{% + \afterassignment\iffalse\let\SB@next= #3\relax\fi% + \expandafter\SB@UTFtest\expandafter{\meaning\SB@next}% + \ifcase\SB@cnt% + \ifcat\noexpand#3\relax% + \SB@addNtest\SB@macrotests#1#2#3% + \else\ifcat\noexpand#3.% + \SB@addDtest\SB@othertests#1#2#3% + \else\ifcat\noexpand#3A% + \SB@addDtest\SB@lettertests#1#2#3% + \else% + \SB@addDtest\relax0#2#3% + \fi\fi\fi% + \or% + \SB@addNtest\SB@macrotests#1#2#3% + \else% + \SB@addMtest\SB@multitests#1#2{#3}% + \fi% +} +\newcommand\DeclareLyricChar{\SB@declare\SB@testtrue0} +\newcommand\DeclareNonLyric{% + \SB@declare\SB@testfalse\SB@testfalse% +} +\newcommand\DeclareNoHyphen{% + \SB@declare\SB@testfalse\SB@testtrue% +} +\newcommand\SB@lettertests{} +\newcommand\SB@macrotests{} +\newcommand\SB@multitests{} +\newcommand\SB@othertests{} +\newcommand\SB@hyphtests{} +\newcommand\SB@addtest[2]{% + \expandafter\gdef\expandafter#1\expandafter{#1#2}% +} +\newcommand\SB@addDtest[4]{% + \ifx0#2\else\SB@addtest#1{\ifx\SB@next#4#2\fi}\fi% + \ifx0#3\else\SB@addtest\SB@hyphtests{\ifx\SB@next#4#3\fi}\fi% +} +\newcommand\SB@addNtest[4]{% + \ifx0#2\else% + \SB@addtest#1{% + \edef\SB@temp{\string#4}\ifx\SB@temp\SB@nextname#2\fi% + }% + \fi% + \ifx0#3\else% + \SB@addtest\SB@hyphtests{% + \edef\SB@temp{\string#4}\ifx\SB@temp\SB@nextname#3\fi% + }% + \fi% +} +\newcommand\SB@addMtest[4]{% + \ifx0#2\else% + \SB@addtest#1{\def\SB@temp{#4}\ifx\SB@next\SB@temp#2\fi}% + \fi% + \ifx0#3\else\SB@addtest\SB@hyphtests{% + \def\SB@temp{#4}\ifx\SB@next\SB@temp#3\fi}% + \fi% +} +\DeclareLyricChar\` +\DeclareLyricChar\' +\DeclareLyricChar\^ +\DeclareLyricChar\" +\DeclareLyricChar\~ +\DeclareLyricChar\= +\DeclareLyricChar\. +\DeclareLyricChar\u +\DeclareLyricChar\v +\DeclareLyricChar\H +\DeclareLyricChar\t +\DeclareLyricChar\c +\DeclareLyricChar\d +\DeclareLyricChar\b +\DeclareLyricChar\oe +\DeclareLyricChar\OE +\DeclareLyricChar\ae +\DeclareLyricChar\AE +\DeclareLyricChar\aa +\DeclareLyricChar\AA +\DeclareLyricChar\o +\DeclareLyricChar\O +\DeclareLyricChar\l +\DeclareLyricChar\L +\DeclareLyricChar\ss +\DeclareLyricChar\i +\DeclareLyricChar\j +\DeclareLyricChar\/ +\DeclareLyricChar\- +\DeclareLyricChar\discretionary +\DeclareNoHyphen\par +\newcommand\SB@bracket{} +\newcommand\SB@chord{\SB@begincname\SB@@chord} +\newcommand\SB@begincname{} +{\catcode`\^^M\active + \gdef\SB@begincname{% + \begingroup% + \catcode`##\active\catcode`&\active% + \catcode`:12\relax% + \catcode`\^^M\active\SB@outer\def^^M{}% + \SB@outer\def\[{}% + \chordlocals% + } +} +\newcommand\SB@endcname{} +\let\SB@endcname\endgroup +\newcommand\SB@nbsp{} +\def\SB@nbsp{\nobreakspace{}} +\newif\ifSB@firstchord\SB@firstchordtrue +\newcommand*\SB@@chord{} +\def\SB@@chord#1]{% + \SB@endcname% + \ifSB@firstchord% + \setbox\SB@lyricbox\hbox{\kern\SB@tabindent}% + \global\SB@tabindent\z@% + \SB@lyric{}% + \SB@numhyps\z@% + \SB@spcinit% + \setbox\SB@chordbox\box\voidb@x% + \fi% + \SB@setchord{#1}% + \SB@firstchordfalse% + \let\SB@dothis\SB@chstart% + \SB@chscan% +} +\newcommand\SB@spcinit{} +\newcommand\MultiwordChords{% + \def\SB@spcinit{% + \let\SB@chdone\SB@chlyrdone% + \def\SB@chimpspace{\let\SB@donext\SB@chdone}% + \def\SB@chexpspace{\let\SB@donext\SB@chdone}% + \let\SB@chespace\SB@chendspace% + }% +} +\newcommand\SB@chscan{% + \let\SB@nextname\relax% + \futurelet\SB@next\SB@chmain% +} +\newcommand\SB@chmain{\SB@dothis\SB@donext} +\newcommand\SB@chstart{% + \ifx\SB@next\[% + \let\SB@donext\relax% + \else\ifx\SB@next\SB@activehat% + \let\SB@donext\relax% + \else\ifx\SB@next\ch% + \let\SB@donext\relax% + \else\ifx\SB@next\mch% + \let\SB@donext\relax% + \else\ifx\SB@next`% + \let\SB@donext\SB@chstep% + \else\ifx\SB@next'% + \let\SB@donext\SB@chstep% + \else\ifx\SB@next"% + \let\SB@donext\SB@chstep% + \else% + \the\SB@lyric% + \SB@lyric{}% + \SB@firstchordtrue% + \let\SB@dothis\SB@chnorm% + \SB@chnorm% + \fi\fi\fi\fi\fi\fi\fi% +} +\newcommand\SB@chnorm{% + \ifcat\noexpand\SB@next A% + \SB@testtrue\SB@lettertests% + \ifSB@test% + \SB@chespace\let\SB@donext\SB@chstep% + \else% + \let\SB@donext\SB@chdone% + \fi% + \else% + \SB@chtrymacro% + \fi% +} +\newcommand\SB@chtrymacro{% + \ifcat\noexpand\SB@next\relax% + \SB@chmacro% + \else% + \SB@chother% + \fi% +} +\newcommand\SB@chother{% + \ifcat\noexpand\SB@next\noexpand\@sptoken% + \SB@chexpspace% + \else\ifcat\noexpand\SB@next\noexpand\bgroup% + \SB@chespace\let\SB@donext\SB@chbgroup% + \else\ifcat\noexpand\SB@next\noexpand\egroup% + \SB@chespace\let\SB@donext\SB@chegroup% + \else\ifx\SB@next-% + \SB@numhyps\@ne\relax% + \SB@lyricnohyp\expandafter{\the\SB@lyric}% + \let\SB@dothis\SB@chhyph% + \SB@chespace\let\SB@donext\SB@chstep% + \else\ifcat\noexpand\SB@next.% + \SB@testtrue\SB@othertests% + \ifSB@test% + \SB@chespace\let\SB@donext\SB@chstep% + \else% + \let\SB@donext\SB@chdone% + \fi% + \else% + \SB@chespace\let\SB@donext\SB@chstep% + \fi\fi\fi\fi\fi% +} +\newcommand\SB@chmacro{% + \SB@testfalse% + \expandafter\SB@outertest\expandafter{\meaning\SB@next}% + \ifSB@test% + \let\SB@donext\SB@chdone% + \else% + \let\SB@donext\SB@chgetname% + \fi% +} +\newcommand\SB@chgetname[1]{% + \edef\SB@nextname{\string#1}% + \SB@@chmacro\SB@donext#1% +} +\newcommand\SB@@chmacro{% + \ifx\SB@next\SB@activehat% + \let\SB@donext\SB@chdone% + \else\ifx\SB@next\SB@par% + \let\SB@donext\SB@chdone% + \else\ifx\SB@next\measurebar% + \SB@chmbar% + \else\ifx\SB@next\mbar% + \SB@chmbar% + \else\ifx\SB@next\ch% + \SB@chespace\let\SB@donext\SB@chlig% + \else\ifx\SB@next\mch% + \SB@chespace\let\SB@donext\SB@mchlig% + \else\ifx\SB@next\ % + \SB@chimpspace% + \else\ifx\SB@next\SB@nbsp% + \SB@chimpspace% + \else% + \expandafter\SB@UTFtest\expandafter{\meaning\SB@next}% + \ifcase\SB@cnt\SB@chothermac% + \or\or\SB@chespace\let\SB@donext\SB@chsteptwo% + \or\SB@chespace\let\SB@donext\SB@chstepthree% + \or\SB@chespace\let\SB@donext\SB@chstepfour\fi% + \fi\fi\fi\fi\fi\fi\fi\fi% +} +\newcommand\SB@chothermac{% + \SB@testfalse% + \afterassignment\iffalse% + \SB@cnt\expandafter`\SB@nextname x\fi% + \ifnum\the\catcode\SB@cnt=\z@\else\SB@testtrue\fi% + \SB@macrotests% + \ifSB@test% + \SB@chespace\let\SB@donext\SB@chstep% + \else% + \let\SB@donext\SB@chdone% + \fi% +} +\newcommand\SB@chstep[1]{% + \SB@lyric\expandafter{\the\SB@lyric#1}% + \SB@chscan% +} +\newcommand\SB@chsteptwo[2]{\SB@chmulti{#1#2}} +\newcommand\SB@chstepthree[3]{\SB@chmulti{#1#2#3}} +\newcommand\SB@chstepfour[4]{\SB@chmulti{#1#2#3#4}} +\newcommand\SB@chmulti[1]{% + \def\SB@next{#1}% + \let\SB@nextname\relax% + \SB@testtrue\SB@multitests% + \ifSB@test% + \SB@lyric\expandafter{\the\SB@lyric#1}% + \expandafter\SB@chscan% + \else% + \expandafter\SB@chmstop% + \fi% +} +\newcommand\SB@chmstop{\expandafter\SB@chdone\SB@next} +\newcommand\SB@chhyph{% + \ifx\SB@next-% + \advance\SB@numhyps\@ne\relax% + \let\SB@donext\SB@chstep% + \else% + \let\SB@donext\SB@chdone% + \fi% +} +\newcommand\SB@chimpspace{\let\SB@donext\SB@chdone} +\newcommand\SB@chexpspace{\let\SB@donext\SB@chdone} +\newcommand\SB@chespace{} +\newcommand\SB@chendspace{% + \let\SB@chdone\SB@chlyrdone% + \def\SB@chexpspace{\SB@chbspace\SB@chexpspace}% + \def\SB@chimpspace{\SB@chbspace\SB@chimpspace}% + \def\SB@chespace{}% +} +\newcommand\SB@chbspace{% + \setbox\SB@lyricbox\hbox{% + \unhbox\SB@lyricbox% + \the\SB@lyric% + }% + \SB@lyric{}% + \ifdim\wd\SB@lyricbox<\wd\SB@chordbox% + \let\SB@chbstok= \SB@next% + \def\SB@chexpspace{\let\SB@donext\SB@chgetspace}% + \def\SB@chimpspace{\let\SB@donext\SB@chstep}% + \let\SB@chespace\SB@chendspace% + \let\SB@chdone\SB@chspcdone% + \else% + \def\SB@chimpspace{\let\SB@donext\SB@chdone}% + \def\SB@chexpspace{\let\SB@donext\SB@chdone}% + \fi% +} +\newcommand\SB@chgetspace{% + \SB@appendsp\SB@lyric% + \let\SB@nextname\relax% + \afterassignment\SB@chscan% + \let\SB@next= } +\newcommand\SB@chmbar{% + \ifmeasures% + \let\SB@donext\SB@chdone% + \else% + \SB@chespace\let\SB@donext\SB@chstep% + \fi% +} +\newcommand\SB@chbgroup[1]{% + \SB@lyric\expandafter{\the\SB@lyric{#1}}% + \SB@chscan% +} +\newcommand\SB@chegroup{% + \let\SB@nextname\relax% + \afterassignment\SB@chegrpscan% + \let\SB@next= } +\newcommand\SB@chegrpscan{% + \futurelet\SB@next\SB@chegrpmacro% +} +\newcommand\SB@chegrpmacro{% + \ifcat\noexpand\SB@next\relax% + \expandafter\SB@chegrpouter% + \else% + \expandafter\SB@chegrpdone% + \fi% +} +\newcommand\SB@chegrpouter{% + \SB@testfalse% + \expandafter\SB@outertest\expandafter{\meaning\SB@next}% + \ifSB@test% + \expandafter\SB@chegrpdone% + \else% + \expandafter\SB@chegrpname% + \fi% +} +\newcommand\SB@chegrpname[1]{% + \edef\SB@nextname{\string#1}% + \SB@chegrpdone#1% +} +\newcommand\SB@chegrpdone{\SB@chdone\egroup} +\newcommand\SB@chlig[5]{% + \gdef\SB@ligpre{{#3}}% + \gdef\SB@ligpost{\[#2]{#4}}% + \gdef\SB@ligfull{\[\SB@noreplay{\hphantom{{\lyricfont#3}}}#2]{#5}}% + \SB@chdone% +} +\newcommand\SB@mchlig[5]{% + \SB@lyric\expandafter{\the\SB@lyric#3}% + \let\SB@next\measurebar% + \edef\SB@nextname{\string\measurebar}% + \gdef\SB@ligpost{\measurebar\[#2]{#4}}% + \gdef\SB@ligfull{\measurebar\[#2]{#4}}% + \SB@chdone% +} +\newcommand\SB@chlyrdone{% + \setbox\SB@lyricbox\hbox{% + \unhbox\SB@lyricbox% + \ifnum\SB@numhyps=\@ne% + \the\SB@lyricnohyp% + \else% + \the\SB@lyric% + \fi% + }% + \SB@emitchord% +} +\newcommand\SB@chspcdone{% + \let\SB@nextname\relax% + \let\SB@next= \SB@chbstok% + \expandafter\SB@emitchord\the\SB@lyric% +} +\newcommand\SB@chdone{} +\let\SB@chdone\SB@chlyrdone +\newcommand\SB@ligpre{} +\newcommand\SB@ligpost{} +\newcommand\SB@ligfull{} +\newcommand\SB@clearlig{% + \gdef\SB@ligpre{}% + \gdef\SB@ligpost{}% + \gdef\SB@ligfull{}% +} +\newcommand\SB@emitchord{% + \ifSB@inverse\else\ifSB@inchorus\else\SB@errchord\fi\fi% + \SB@testfalse% + \ifcat\noexpand\SB@next\noexpand\@sptoken\SB@testtrue\fi% + \ifcat\noexpand\SB@next.\SB@testtrue\fi% + \ifx\SB@next\SB@par\SB@testtrue\fi% + \ifx\SB@next\egroup\SB@testtrue\fi% + \ifx\SB@next\endgroup\SB@testtrue\fi% + \SB@hyphtests% + \ifSB@test\SB@wordendstrue\else\SB@wordendsfalse\fi% + \SB@dimen\wd\SB@chordbox% + \ifvmode\leavevmode\fi% + \SB@brokenwordfalse% + \ifdim\wd\SB@lyricbox>\z@% + \ifdim\SB@dimen>\wd\SB@lyricbox% + \ifSB@wordends\else\SB@brokenwordtrue\fi% + \fi% + \else% + \SB@skip\lastskip% + \unskip\penalty200\hskip\SB@skip% + \fi% + \ifnum\SB@numhyps>\z@% + \ifnum\SB@numhyps>\@ne% + \SB@brokenwordfalse% + \else% + \SB@brokenwordtrue% + \fi% + \fi% + \SB@testfalse% + \ifnolyrics\ifdim\wd\SB@lyricbox=\z@\SB@testtrue\fi\fi% + \ifSB@test% + \unhbox\SB@chordbox% + \gdef\SB@temp{\expandafter\SB@clearlig\SB@ligfull}% + \else% + \vbox{\baselineskip\f@size\p@\kern2\p@% + \ifSB@brokenword% + \global\setbox\SB@lyricbox\hbox{% + \unhbox\SB@lyricbox% + \SB@ligpre% + }% + \SB@maxmin\SB@dimen<{\wd\SB@lyricbox}% + \advance\SB@dimen.5em% + \hbox to\SB@dimen{\unhbox\SB@chordbox\hfil}% + \kern-2\p@% + \hbox to\SB@dimen{% + \unhcopy\SB@lyricbox\hfil\char\hyphenchar\font\hfil% + }% + \global\SB@cnt\@m% + \gdef\SB@temp{\expandafter\SB@clearlig\SB@ligpost}% + \else% + \hbox{\unhbox\SB@chordbox\hfil}% + \kern-2\p@% + \hbox{% + \unhcopy\SB@lyricbox% + \global\SB@cnt\spacefactor% + \hfil% + }% + \gdef\SB@temp{\expandafter\SB@clearlig\SB@ligfull}% + \fi% + }% + \ifSB@wordends% + \ifdim\wd\SB@lyricbox>\z@\else\nobreak\fi% + \else% + \penalty% + \ifnum\SB@numhyps>\z@\exhyphenpenalty% + \else\ifSB@brokenword\hyphenpenalty% + \else\@M\fi\fi% + \spacefactor\SB@cnt% + \fi% + \fi% + \SB@temp% +} +\newcommand\SB@accidental[1]{{% + \/% + \m@th#1% + \SB@dimen-\fontdimen\@ne\font% + \advance\SB@dimen.088142\p@% + \ifdim\SB@dimen<\z@% + \kern\f@size\SB@dimen% + \fi% +}} +\newcommand\sharpsymbol{\ensuremath{^\#}} +\newcommand\flatsymbol{\raise.5ex\hbox{{\SB@flatsize$\flat$}}} +\newcommand\shrp{\SB@accidental\sharpsymbol} +\newcommand\flt{\SB@accidental\flatsymbol} +\newcommand\DeclareFlatSize[2]{% + \expandafter\xdef\csname SB@flatsize@#1\endcsname{#2}% +} +\DeclareFlatSize\@vpt\@vpt +\DeclareFlatSize\@vipt\@vipt +\DeclareFlatSize\@viipt\@vipt +\DeclareFlatSize\@viiipt\@viipt +\DeclareFlatSize\@ixpt\@viiipt +\DeclareFlatSize\@xpt\@ixpt +\DeclareFlatSize\@xipt\@xpt +\DeclareFlatSize\@xiipt\@xipt +\DeclareFlatSize\@xivpt\@xiipt +\DeclareFlatSize\@xviipt\@xivpt +\DeclareFlatSize\@xxpt\@xviipt +\DeclareFlatSize\@xxvpt\@xxpt +\newcommand\SB@flatsize{% + \@ifundefined{SB@flatsize@\f@size}{}{% + \expandafter\fontsize% + \csname SB@flatsize@\f@size\endcsname\f@baselineskip% + \selectfont% + }% +} +\newcommand\ch{\SB@ch} +\newcommand\SB@ch{} +\newcommand\SB@ch@on{\SB@begincname\SB@@ch} +\newcommand*\SB@@ch[1]{\SB@endcname\SB@@@ch{#1}} +\newcommand*\SB@@@ch[4]{\[\SB@noreplay{\hphantom{#2}}#1]#4} +\newcommand*\SB@ch@off[4]{#4} +\newcommand\mch{\SB@mch} +\newcommand\SB@mch{} +\newcommand*\SB@mch@m[4]{#2\measurebar#3} +\newcommand\SB@mch@on{\SB@begincname\SB@@mch} +\newcommand*\SB@@mch[1]{\SB@endcname\SB@@@mch{#1}} +\newcommand*\SB@@@mch[4]{#2\measurebar\[#1]#3} +\newcommand\SB@activehat{% + \ifmmode^\else\expandafter\SB@rechord\fi% +} +\newcommand\SB@loadactives{} +{ + \catcode`&\active + \catcode`#\active + \catcode`|\active + \catcode`^\active + \global\let&\flt + \global\let#\shrp + \global\let|\measurebar + \global\let^\SB@activehat + \gdef\SB@loadactives{% + \catcode`^\ifchorded\active\else9 \fi% + \catcode`|\ifmeasures\active\else9 \fi% + \def\[{\SB@bracket}% + } +} +\newif\ifSB@trackch +\newtoks\SB@cr@ +\newtoks\SB@ctail +\newcommand\SB@creg{} +\newcommand\newchords[1]{% + \@ifundefined{SB@cr@#1}{% + \expandafter\newtoks\csname SB@cr@#1\endcsname% + \global\csname SB@cr@#1\endcsname{\\}% + }{\SB@errdup{#1}}% +} +\newcommand\memorize{% + \@ifnextchar[\SB@memorize{\SB@memorize[]}% +} +\newcommand\SB@memorize{} +\def\SB@memorize[#1]{% + \@ifundefined{SB@cr@#1}{\SB@errreg{#1}}{% + \SB@trackchtrue% + \global\expandafter\let\expandafter\SB@creg% + \csname SB@cr@#1\endcsname% + \global\SB@creg{\\}% + }% +} +\newcommand\replay{\@ifnextchar[\SB@replay\SB@@replay} +\newcommand\SB@replay{} +\def\SB@replay[#1]{% + \@ifundefined{SB@cr@#1}{\SB@errreg{#1}}{% + \SB@trackchfalse% + \global\expandafter\let\expandafter\SB@creg% + \csname SB@cr@#1\endcsname% + \global\SB@ctail\SB@creg% + }% +} +\newcommand\SB@@replay{% + \SB@trackchfalse% + \global\SB@ctail\SB@creg% +} +\newcommand\SB@rechord{} +\newcommand\SB@@rechord{% + \SB@ifempty\SB@ctail{% + \SB@errreplay% + \SB@toks{}% + \let\SB@donext\@gobble% + }{% + \SB@lop\SB@ctail\SB@toks% + \let\SB@donext\SB@chord% + \let\SB@noreplay\@gobble% + }% + \expandafter\SB@donext\the\SB@toks]% +} +\newif\ifSB@nohat +\newcommand\SB@noreplay{} +\let\SB@noreplay\@firstofone +\newlength\SB@fretwidth +\setlength\SB@fretwidth{6\p@} +\newcommand\SB@fretnum[1]{{% + \sffamily\fontsize\@xpt\@xpt\selectfont#1% +}} +\newcommand\SB@onfret[1]{% + \rlap{\hbox to\SB@fretwidth{\hfil\vrule\@height6\p@\hfil}}% + \hbox to\SB@fretwidth{\hfil#1\hfil}% +} +\newcommand\SB@atopfret[1]{% + \hbox to\SB@fretwidth{\hfil#1\hfil}% +} +\newcommand\SB@fretbar{% + \nointerlineskip% + \hbox to\SB@dimen{% + \advance\SB@dimen-\SB@fretwidth% + \advance\SB@dimen.4\p@% + \hfil% + \vrule\@width\SB@dimen\@height.4\p@\@depth\z@% + \hfil% + }% + \nointerlineskip% +} +\newcommand\SB@topempty{\SB@atopfret\relax} +\newcommand\SB@topX{\SB@atopfret{% + \hbox{% + \kern-.2\p@% + \fontencoding{OMS}\fontfamily{cmsy}% + \fontseries{m}\fontshape{n}% + \fontsize\@viipt\@viipt\selectfont\char\tw@% + \kern-.2\p@% + }% +}} +\newcommand\SB@topO{\SB@atopfret{% + \vrule\@width\z@\@height4.3333\p@\@depth.8333\p@% + \lower.74\p@\hbox{% + \fontencoding{OMS}\fontfamily{cmsy}% + \fontseries{m}\fontshape{n}% + \fontsize\@xpt\@xpt\selectfont\char14% + }% +}} +\newcommand\SB@fretempty{\SB@onfret\relax} +\newcommand\SB@frethit{\SB@onfret{% + \hbox{% + \fontencoding{OMS}\fontfamily{cmsy}% + \fontseries{m}\fontshape{n}% + \fontsize\@xiipt\@xiipt\selectfont\char15% + }% +}} +\newcommand\SB@finger[1]{% + \SB@atopfret{\sffamily\fontsize\@vipt\@vipt\selectfont#1}% +} +\newif\ifSB@gettabind\SB@gettabindfalse +\newdimen\SB@tabindent +\newcommand\SB@targfret{} +\newcommand\SB@targstr{} +\newcommand\SB@targfing{} +\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% +} +\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% +} +\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% +} +\newcommand\SB@gtinc{% + \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}% +} +\newcommand\SB@gtmax[1]{\ifnum\SB@cnt<#1\SB@cnt#1\fi} +\newcommand\gtab{\SB@begincname\SB@gtab} +\newcommand*\SB@gtab[1]{% + \SB@endcname% + \begingroup% + \catcode`:12\relax% + \SB@@gtab{#1}% +} +\newcommand*\SB@@gtab[2]{% + \endgroup% + \let\SB@targfret\@empty% + \let\SB@targstr\@empty% + \let\SB@targfing\@empty% + \SB@tabargs#2:::\SB@tabargs% + \ifx\SB@targstr\@empty% + \def\SB@targstr{\0\0\0\0\0\0}% + \fi% + \ifvmode\leavevmode\fi% + \vbox{% + \normalfont\normalsize% + \setbox\SB@box\hbox{% + \thinspace{\printchord{#1\strut}}\thinspace% + }% + \setbox\SB@boxii\hbox{\SB@fretnum{\SB@targfret}}% + \setbox\SB@boxiii\hbox{{\SB@gttop\SB@targstr}}% + \hsize\wd\SB@box% + \ifSB@gettabind% + \global\SB@tabindent\wd\SB@boxii% + \global\advance\SB@tabindent.5\SB@fretwidth% + \global\advance\SB@tabindent-.5\p@% + \fi% + \SB@dimen\wd\SB@boxii% + \advance\SB@dimen\wd\SB@boxiii% + \ifdim\hsize<\SB@dimen% + \hsize\SB@dimen% + \else\ifSB@gettabind% + \SB@dimenii\hsize% + \advance\SB@dimenii-\SB@dimen% + \divide\SB@dimenii\tw@% + \global\advance\SB@tabindent\SB@dimenii% + \fi\fi% + \hbox to\hsize{\hfil\unhbox\SB@box\hfil}% + \kern-\p@\nointerlineskip% + \hbox to\hsize{% + \hfil% + \vtop{\kern\p@\kern2\p@\box\SB@boxii}% + \vtop{% + \SB@dimen\wd\SB@boxiii% + \box\SB@boxiii% + \SB@cnt\minfrets% + \SB@gtset\relax\SB@gtmax\SB@targstr% + \SB@gtinit% + \loop% + \SB@fretbar\hbox{\SB@targstr}% + \advance\SB@cnt\m@ne% + \ifnum\SB@cnt>\z@\SB@gtinc\repeat% + \SB@fretbar% + \ifx\SB@targsfing\@empty\else% + \kern1.5\p@% + \SB@gtset\SB@topempty\SB@finger% + \hbox{\SB@targfing}% + \fi% + }% + \hfil% + }% + \kern3\p@% + }% + \SB@gettabindfalse% +} +\newcommand\SB@ctoken{} \def\SB@ctoken{:} +\newcommand\SB@tabargs{} +\def\SB@tabargs#1:#2:#3:#4\SB@tabargs{% + \def\SB@temp{#4}% + \ifx\SB@temp\@empty% + \SB@csify\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% + \def\SB@targfret{#1}% + \SB@csify\SB@targstr{#2}% + \fi% + \else% + \def\SB@targfret{#1}% + \SB@csify\SB@targfing{#3}% + \SB@csify\SB@targstr{#2}% + \fi\fi% +} +\newcommand\songchapter{% + \let\SB@temp\@seccntformat% + \def\@seccntformat##1{}% + \@startsection{chapter}{0}{\z@}% + {3.5ex\@plus1ex\@minus.2ex}% + {.4ex\let\@seccntformat\SB@temp}% + {\sffamily\bfseries\LARGE\centering}% +} +\newcommand\songsection{% + \let\SB@temp\@seccntformat% + \def\@seccntformat##1{}% + \@startsection{section}{1}{\z@}% + {3.5ex\@plus1ex\@minus.2ex}% + {.4ex\let\@seccntformat\SB@temp}% + {\sffamily\bfseries\LARGE\centering}% +} +\newenvironment{songs}[1]{% + \ifSB@songsenv\SB@errnse\fi% + \gdef\SB@indexlist{#1}% + \SB@chkidxlst% + \stepcounter{SB@songsnum}% + \setcounter{songnum}{1}% + \let\SB@sgroup\@empty% + \ifinner\else\ifdim\pagetotal>\z@% + \null\nointerlineskip% + \fi\fi% + \songcolumns\SB@numcols% + \SB@songsenvtrue% +}{% + \commitsongs% + \global\let\SB@indexlist\@empty% + \ifinner\else\clearpage\fi% + \SB@songsenvfalse% +} +\newcounter{SB@songsnum} +\newcommand\SB@indexlist{} +\newcommand\SB@newindex[4]{% + \expandafter\newcommand\csname SB@idxfilename@#3\endcsname{#4}% + \expandafter\newcommand\csname SB@idxsel@#3\endcsname[3]{###1}% + \expandafter\newcommand\csname SB@idxref@#3\endcsname{\thesongnum}% + \AtBeginDocument{\SB@openindex{#2}{#3}{#4}}% +} +\newcommand\SB@openindex[3]{% + \ifSB@genindexes\begingroup% + \newwrite\SB@theindex% + \immediate\openout\SB@theindex=#3.sxd% + #1% + \global\expandafter\let\csname SB@index@#2\endcsname\SB@theindex% + \endgroup\fi% +} +\newcommand\newindex{\SB@newindex1\SB@titleinit} +\@onlypreamble\newindex +\newcommand\SB@titleinit{% + \immediate\write\SB@theindex{TITLE INDEX DATA FILE}% +} +\newcommand\newscripindex{\SB@newindex2\SB@scripinit} +\@onlypreamble\newscripindex +\newcommand\SB@scripinit{% + \immediate\write\SB@theindex{SCRIPTURE INDEX DATA FILE}% +} +\newcommand\newauthorindex{\SB@newindex3\SB@authinit} +\@onlypreamble\newauthorindex +\newcommand\SB@authinit{% + \immediate\write\SB@theindex{AUTHOR INDEX DATA FILE}% +} +\newcommand\indexsongsas[1]{% + \@ifundefined{SB@idxref@#1}% + {\SB@errnoidx{#1}\@gobble}% + {\expandafter\renewcommand\csname SB@idxref@#1\endcsname}% +} +\newcommand\SB@percent{} +{\catcode`\%=12\gdef\SB@percent{%}} +\newcommand\SB@idxcmd[2]{% + \expandafter\gdef\expandafter#1\expandafter{% + #1\immediate\write\SB@theindex{\SB@percent#2}% + }% +} +\newcommand\authsepword[1]{\SB@idxcmd\SB@authinit{sep #1}} +\@onlypreamble\authsepword +\newcommand\authbyword[1]{\SB@idxcmd\SB@authinit{after #1}} +\@onlypreamble\authbyword +\newcommand\authignoreword[1]{\SB@idxcmd\SB@authinit{ignore #1}} +\@onlypreamble\authignoreword +\newcommand\titleprefixword[1]{\SB@idxcmd\SB@titleinit{prefix #1}} +\@onlypreamble\titleprefixword +\newbox\SB@songwrites +\newcommand\SB@addtoindex[2]{% + \global\setbox\SB@songwrites\vbox{% + \unvbox\SB@songwrites% + \ifSB@genindexes% + \protected@write{\csname SB@index@#1\endcsname}{}{#2}% + \protected@write{\csname SB@index@#1\endcsname}{}% + {\csname SB@idxref@#1\endcsname}% + \protected@write{\csname SB@index@#1\endcsname}{}{% + song\theSB@songsnum-\thesongnum.% + \ifnum\c@section=\z@1\else2\fi}% + \fi% + }% +} +\newcommand\SB@addtoindexes[3]{% + \@for\SB@temp:=\SB@indexlist\do{% + \SB@addtoindex\SB@temp% + {\csname SB@idxsel@\SB@temp\endcsname{#1}{#2}{#3}}% + }% +} +\newcommand\SB@addtotitles[1]{% + \@for\SB@temp:=\SB@indexlist\do{% + \csname SB@idxsel@\SB@temp\endcsname% + {\SB@addtoindex\SB@temp{#1}}{}{}% + }% +} +\newcommand\SB@chkidxlst{% + \let\SB@temp\SB@indexlist% + \let\SB@indexlist\@empty% + \@for\SB@tempii:=\SB@temp\do{% + \@ifundefined{SB@idxsel@\SB@tempii}{\SB@errnoidx\SB@tempii}{% + \ifx\SB@indexlist\@empty% + \SB@toks\expandafter{\SB@tempii}% + \else% + \SB@toks\expandafter\expandafter\expandafter{% + \expandafter\SB@indexlist\expandafter,\SB@tempii}% + \fi% + \edef\SB@indexlist{\the\SB@toks}% + }% + }% +} +\newcommand\indexentry{\@ifnextchar[{\SB@idxentry*}{\SB@@idxentry*}} +\newcommand\SB@idxentry{} +\def\SB@idxentry#1[#2]#3{{% + \def\SB@indexlist{#2}% + \SB@chkidxlst% + \SB@addtoindexes{#1#3}{#3}{#3}% +}} +\newcommand\SB@@idxentry[2]{\SB@addtotitles{#1#2}} +\newcommand\indextitleentry{% + \@ifnextchar[{\SB@idxentry{}}{\SB@@idxentry{}}% +} +\newbox\SB@idxtitlebox +\newcommand\SB@idxlineskip[1]{% + \vskip#1\p@\@plus#1\p@\@minus#1\p@% +} +\newcommand\SB@ellipspread[2]{% + \begingroup% + \SB@dimen\z@% + \def\SB@temp{#1}% + \SB@toks{#2}% + \setbox\SB@box\hbox{{% + \SB@temp% + \leaders\hbox to.5em{\hss.\hss}\hskip2em\@plus1fil% + {\the\SB@toks}% + }}% + \ifdim\wd\SB@box>\hsize% + \SB@balancerows% + \else% + \hbox to\hsize{\unhbox\SB@box}\par% + \fi% + \endgroup% +} +\newcommand\SB@balancerows{% + \edef\SB@tempii{\the\SB@toks}% + \setbox\SB@box\vbox{% + \SB@toks\expandafter{\expandafter\\\the\SB@toks\\}% + \SB@lop\SB@toks\SB@toks% + \settowidth\SB@dimen{\the\SB@toks}% + \advance\SB@dimen-.5em% + \leftskip.5cm% + {\hbadness\@M\hfuzz\maxdimen% + \hskip-.5cm\relax\SB@temp\unskip\nobreak% + \hskip\SB@dimen\nobreak% + \rightskip2em\@plus1fil\par}% + \setbox\SB@box\lastbox% + \setbox\SB@box\hbox{% + \unhbox\SB@box% + \unskip\unskip\unpenalty% + \unpenalty\unskip\unpenalty% + }% + \expandafter% + }% + \expandafter\SB@dimenii\the\wd\SB@box\relax% + \SB@dimen\hsize% + \advance\SB@dimen-.5cm% + \setbox\SB@box\vbox{% + \SB@multiline{\hbadness\@M\hfuzz\maxdimen}% + }% + \SB@dimeniii.5\SB@dimen% + \SB@dimeniv\SB@dimeniii% + \loop% + \SB@dimeniv.5\SB@dimeniv% + \setbox\SB@boxii\vbox{% + \SB@dimen\SB@dimeniii% + \SB@multiline{\hbadness\@M\hfuzz\maxdimen}% + }% + \ifnum\SB@cnt<\@M% + \ifdim\ht\SB@boxii>\ht\SB@box% + \advance\SB@dimeniii\SB@dimeniv% + \else% + \SB@dimen\SB@dimeniii% + \advance\SB@dimeniii-\SB@dimeniv% + \fi% + \else% + \advance\SB@dimeniii\SB@dimeniv% + \fi% + \ifdim\SB@dimeniv>2\p@\repeat% + \setbox\SB@box\box\voidb@x% + \setbox\SB@boxii\box\voidb@x% + \SB@multiline\relax% +} +\newcommand\SB@multiline[1]{% + \begingroup% + \SB@dimen-\SB@dimen% + \advance\SB@dimen\hsize% + \SB@dimenii-\SB@dimenii% + \advance\SB@dimenii\SB@dimen% + {#1\hskip-.5cm\relax\SB@temp\unskip\nobreak% + \SB@maxmin\SB@dimenii<{1.5em}% + \leftskip.5cm\rightskip2em\@plus1fil% + \interlinepenalty\@M% + \leaders\hbox to.5em{\hss.\hss}\hskip\SB@dimenii\@plus1fill% + \nobreak{\SB@tempii\kern-2em}% + \par\global\SB@cnt\badness}% + \endgroup% +}% +\newcommand\SB@idxitemsep{% + ,\kern-2em\penalty-8\hskip2.33em\@minus.11em% + \hskip-\SB@dimen\@plus-1fill% + \vadjust{}\nobreak% + \hskip\SB@dimen\@plus1fill\relax% +} +\newenvironment{idxblock}[1]{}{} +\newcommand\idxentry[2]{} +\newcommand\idxaltentry[2]{} +\newenvironment{SB@lgidx}[1]{}{} +\newenvironment{SB@smidx}[1]{}{} +\newcommand\SB@idxsetup[1]{% + \hsize\SB@colwidth% + \parskip\z@skip\parfillskip\z@skip\parindent\z@% + \baselineskip\f@size\p@\@plus\p@\@minus\p@% + \lineskiplimit\z@\lineskip\p@\@plus\p@\@minus\p@% + \hyphenpenalty\@M\exhyphenpenalty\@M% +} +\newcommand\SB@makeidxcolumn[1]{% + \ifdim\ht\SB@box=\z@% + \hskip\hsize\relax% + \else% + \splittopskip\z@skip\splitmaxdepth\maxdepth% + \vsplit\SB@box to\SB@dimen% + \global\setbox\SB@box\vbox{% + \SB@idxsetup{#1}% + \splitbotmark% + \unvbox\SB@box% + }% + \fi% +} +\newcommand\SB@oneidxpage{} +\newcommand\SB@displayindex[3]{% + \ifsongindexes\begingroup% + \SB@colwidth\hsize% + \advance\SB@colwidth-#1\columnsep% + \advance\SB@colwidth\columnsep% + \divide\SB@colwidth#1% + \setbox\SB@idxtitlebox\vbox{% + \let\SB@temp\songsection% + \ifx\chapter\undefined\else% + \ifx\chapter\relax\else% + \let\SB@temp\songchapter% + \fi% + \fi% + \SB@temp{#2}% + }% + \IfFileExists{\csname SB@idxfilename@#3\endcsname.sbx}{% + \ifx\hyperlink\undefined\let\hyperlink\@secondoftwo\fi% + \ifx\hyperlink\relax\let\hyperlink\@secondoftwo\fi% + \global\setbox\SB@box\vbox{% + \null% + \vfil% + \unvcopy\SB@idxtitlebox% + \vskip.5in\@minus.3in\relax% + \hbox to\hsize{% + \hfil% + \vbox{% + \hsize\SB@colwidth% + \renewenvironment{idxblock}[1]% + {\begin{SB@smidx}{####1}}{\end{SB@smidx}}% + \let\\\SB@idxitemsep% + \input{\csname SB@idxfilename@#3\endcsname.sbx}% + }% + \hfil% + }% + \vskip\z@\@plus2fil\relax% + }% + {\vbadness\@M\vfuzz\maxdimen% + \splitmaxdepth\maxdepth\splittopskip\z@skip% + \global\setbox\SB@boxii\vsplit\SB@box to\textheight}% + \ifvoid\SB@box% + \box\SB@boxii% + \else% + \global\setbox\SB@box\vbox{% + \renewenvironment{idxblock}[1]% + {\begin{SB@lgidx}{####1}}{\end{SB@lgidx}}% + \let\\\SB@idxitemsep% + \SB@idxsetup{#1}% + \input{\csname SB@idxfilename@#3\endcsname.sbx}% + \unskip% + }% + \SB@toks{\SB@makeidxcolumn{#1}}% + \SB@cnt#1\relax% + \loop\ifnum\SB@cnt>\@ne% + \SB@toks\expandafter{\the\SB@toks% + \kern\columnsep\SB@makeidxcolumn{#1}}% + \advance\SB@cnt\m@ne% + \repeat% + \edef\SB@oneidxpage{\the\SB@toks}% + \unvbox\SB@idxtitlebox% + \vskip.2in\relax% + \nointerlineskip% + \null% + \nointerlineskip% + \SB@cnt\vbadness\vbadness\@M% + \SB@dimenii\vfuzz\vfuzz\maxdimen% + \loop% + \SB@dimen\textheight% + \ifinner\else\kern\z@\advance\SB@dimen-\pagetotal\fi% + \global\setbox\SB@boxii\copy\SB@box% + \global\setbox\SB@boxiii\hbox{\SB@oneidxpage}% + \ifdim\ht\SB@box>\z@% + \box\SB@boxiii% + \vfil\break% + \repeat% + \SB@dimenii\ht\SB@boxii% + \divide\SB@dimenii#1\relax% + \SB@maxmin\SB@dimen>\SB@dimenii% + \loop% + \global\setbox\SB@box\copy\SB@boxii% + \global\setbox\SB@boxiii\hbox{\SB@oneidxpage}% + \ifdim\ht\SB@box>\z@% + \advance\SB@dimen\p@% + \repeat% + \box\SB@boxiii% + \global\setbox\SB@boxii\box\voidb@x% + \vbadness\SB@cnt\vfuzz\SB@dimenii% + \fi% + }% + {% + \vbox to\textheight{% + \vfil% + \unvbox\SB@idxtitlebox% + \vskip1em\relax% + \hbox to\hsize{\hfil[Index not yet generated.]\hfil}% + \vskip\z@\@plus2fil\relax% + }% + }% + \clearpage% + \endgroup\fi% +} +\newcommand\showindex[3][0]{% + \@ifundefined{SB@idxsel@#3}{\SB@errnoidx{#3}}{% + \expandafter\let\expandafter\SB@temp\csname SB@idxsel@#3\endcsname% + \SB@cnt#1\relax% + \ifnum\SB@cnt<\@ne\SB@cnt\SB@temp232\relax\fi% + \expandafter\SB@temp% + \expandafter\SB@maketitleindex% + \expandafter\SB@makescripindex% + \expandafter\SB@makeauthorindex% + \expandafter{\the\SB@cnt}% + {#2}{#3}% + }% +} +\newcommand\SB@maketitleindex{% + \renewenvironment{SB@lgidx}[1]{ + \hbox{\SB@colorbox\idxbgcolor{\vbox{% + \hbox to\idxheadwidth{{\idxheadfont\relax##1}\hfil}% + }}}% + \nobreak\vskip3\p@\@plus2\p@\@minus2\p@\nointerlineskip% + }{\penalty-50\vskip5\p@\@plus5\p@\@minus4\p@}% + \renewenvironment{SB@smidx}[1]{}{}% + \renewcommand\idxentry[2]{% + \SB@ellipspread{\idxtitlefont\relax\ignorespaces##1\unskip}% + {{\idxrefsfont\relax##2}}% + }% + \renewcommand\idxaltentry[2]{% + \SB@ellipspread{\idxlyricfont\relax\ignorespaces##1\unskip}% + {{\idxrefsfont\relax##2}}% + }% + \SB@displayindex% +} +\newcommand\SB@idxcolhead{} +\newcommand\SB@idxheadsep{{% + \SB@dimen4\p@% + \advance\SB@dimen-\prevdepth% + \SB@maxmin\SB@dimen<\z@% + \SB@dimenii\SB@dimen% + \SB@maxmin\SB@dimenii>\p@% + \vskip\SB@dimen\@plus\p@\@minus\SB@dimenii% +}} +\newcommand\SB@idxcont[1]{% + \hbox to\hsize{{\idxcont{#1}}\hfil}% + \nobreak% + \SB@idxheadsep\nointerlineskip% +} +\newcommand\SB@makescripindex{% + \renewenvironment{SB@lgidx}[1]{% + \gdef\SB@idxcolhead{##1}% + \hbox to\hsize{{\idxbook{##1}}\hfil}% + \nobreak% + \SB@idxheadsep\nointerlineskip% + }{% + \mark{\noexpand\relax}% + \penalty-20\vskip3\p@\@plus3\p@\relax% + }% + \renewenvironment{SB@smidx}[1] + {\begin{SB@lgidx}{##1}}{\end{SB@lgidx}}% + \renewcommand\idxentry[2]{% + \SB@ellipspread{\hskip.25cm\idxscripfont\relax##1}% + {{\idxrefsfont\relax##2}}% + \SB@toks\expandafter{\SB@idxcolhead}% + \mark{\noexpand\SB@idxcont{\the\SB@toks}}% + }% + \renewcommand\idxaltentry[2]{\SB@erridx{a scripture}}% + \SB@displayindex% +} +\newcommand\SB@makeauthorindex{% + \renewenvironment{SB@lgidx}[1]{}{}% + \renewenvironment{SB@smidx}[1]{}{}% + \renewcommand\idxentry[2]{% + \SB@ellipspread{{\idxauthfont\relax\sfcode`.\@m##1}}% + {{\idxrefsfont##2}}% + }% + \renewcommand\idxaltentry[2]{\SB@erridx{an author}}% + \SB@displayindex% +} +\newcommand\SB@Error{\PackageError{songs}} +\newcommand\SB@Warn{\PackageWarning{songs}} +\newcommand\SB@errspos{% + \SB@Error{Illegal \protect\songpos\space argument}{The argume% + nt to \protect\songpos\space must be a number from 0 to 3.}% +} +\newcommand\SB@errnse{% + \SB@Error{Nested songs environments are not supported}{End th% + e previous songs environment before beginning the next one.}% +} +\newcommand\SB@errpl{% + \SB@Error{\protect\includeonlysongs\space not permitted with% + in a songs environment}{\protect\includeonlysongs\space can o% + nly be used in the document preamble or between songs environ% + ments in the document body.}% +} +\newcommand\SB@warnigen{% + \PackageWarning{songs}{Indexes shown but index-generation inh% + ibited. Index files may be out of date.}{Indexes were initial% + ly turned off by the end of the document preamble, which mean% + s that the auxiliary files used to keep the indexes up-to-da% + te were not generated. However, indexes were turned on withi% + n the document body using \protect\indexeson, which means th% + e indexes shown in the resulting document are being created f% + rom outdated files. To correct the problem, be sure that inde% + xes are turned on by the end of the preamble so that the auxi% + liary files will be updated.}% +} +\newcommand\SB@errrtopt{% + \SB@Error{Cannot display chords in a rawtext dump}{You have u% + sed the rawtext option in the \protect\usepackage\space lin% + e and have either used the chorded option as well or have use% + d the \protect\chordson\space macro subsequently.}% +} +\newcommand\SB@warnrc{% + \SB@Warn{The \protect\repchoruses\space feature will not wor% + k when the number of columns is set to zero}% +} +\newcommand\SB@errboo{% + \SB@Error{Encountered \protect\beginsong\space without seein% + g an \protect\endsong\space for the previous song}% + {Song \thesongnum\space might be missing a% + n \protect\endsong\space line.}% +} +\newcommand\SB@errbor{% + \SB@Error{Encountered \protect\beginsong\space without seein% + g an \protect\endscripture\space for the preceding scriptur% + e quotation}{A scripture quotation appearing after son% + g \thesongnum\space might be missing a% + n \protect\endscripture\space line.}% +} +\newcommand\SB@erreov{% + \SB@Error{Encountered \protect\endsong\space without seein% + g an \protect\endverse\space for the preceding verse}{Son% + g \thesongnum\space has a \protect\beginverse\space% + line with no matching \protect\endverse\space line.}% +} +\newcommand\SB@erreoc{% + \SB@Error{Encountered \protect\endsong\space without seein% + g an \protect\endchorus\space for the preceding chorus}{Son% + g \thesongnum\space has a \protect\beginchorus\space% + line with no matching \protect\endchorus\space line.}% +} +\newcommand\SB@erreor{% + \SB@Error{Encountered \protect\endsong\space without seein% + g an \protect\endscripture for the preceding scripture quot% + e}{A scripture quote appearing before song \thesongnum\space% + ended with \protect\endsong\space instead of wit% + h \protect\endscripture.}% +} +\newcommand\SB@erreot{% + \SB@Error{Encountered \protect\endsong\space with no matchin% + g \protect\beginsong}{Before song \thesongnum\space there wa% + s an \protect\endsong\space with no matchin% + g \protect\beginsong.}% +} +\newcommand\SB@errbvv{% + \SB@Error{Encountered \protect\beginverse\space without seein% + g an \protect\endverse\space for the preceding verse}{Son% + g \thesongnum\space might have a verse that has n% + o \protect\endendverse\space line.}% +} +\newcommand\SB@errbvc{% + \SB@Error{Encountered \protect\beginverse\space without seein% + g an \protect\endchorus\space for the preceding chorus}{Son% + g \thesongnum\space might have a chorus that has n% + o \protect\endchorus\space line.}% +} +\newcommand\SB@errbvt{% + \SB@Error{Encountered \protect\beginverse\space without firs% + t seeing a \protect\beginsong\space line}{Before son% + g \thesongnum, there is a \protect\beginverse\space line no% + t contained in any song.}% +} +\newcommand\SB@errevc{% + \SB@Error{Encountered \protect\endverse\space while process% + ing a chorus}{Song \thesongnum\space might hav% + e a \protect\beginchorus\space concluded by a% + n \protect\endverse\space instead of an \protect\endchorus.}% +} +\newcommand\SB@errevo{% + \SB@Error{Encountered \protect\endverse\space without firs% + t seeing a \protect\beginverse}{Song \thesongnum\space m% + ight have an \protect\endverse\space with no matchin% + g \protect\beginverse.}% +} +\newcommand\SB@errevt{% + \SB@Error{Encountered an \protect\endverse\space outside o% + f any song}{Before song \thesongnum, there is a% + n \protect\endverse\space line not preceded b% + y a \protect\beginsong\space line.}% +} +\newcommand\SB@erretex{% + \SB@Error{The \protect\repchoruses\space feature requires e-% + TeX compatibility}{Your version of LaTeX2e does not appear t% + o be e-TeX compatible. Find a distribution that includes e-T% + eX support in order to use this feature.}% +} +\newcommand\SB@errbcv{% + \SB@Error{Encountered \protect\beginchorus\space without see% + ing an \protect\endverse\space for the preceding verse}{Son% + g \thesongnum\space might hav% + e a \protect\beginverse\space with no match% + ing \protect\endverse.}% +} +\newcommand\SB@errbcc{% + \SB@Error{Encountered \protect\beginchorus\space without see% + ing an \protect\endchorus\space for the preceding chorus}% + {Song \thesongnum\space might have a \protect\beginchorus% + \space with no matching \protect\endchorus.}% +} +\newcommand\SB@errbct{% + \SB@Error{Encountered \protect\beginchorus\space without see% + ing a \protect\beginsong\space line first}{After son% + g \thesongnum\space there is a \protect\beginchorus\space% + line outside of any song.}% +} +\newcommand\SB@errecv{% + \SB@Error{Encountered an \protect\endchorus\space while proc% + essing a verse}{Song \thesongnum\space might hav% + e a \protect\beginverse\space concluded by \protect\endchorus% + \space instead of \protect\endverse.}% +} +\newcommand\SB@erreco{% + \SB@Error{Encountered \protect\endchorus\space without firs% + t seeing a \protect\beginchorus}{Song \thesongnum\space m% + ight have an \protect\endchorus\space with no match% + ing \protect\beginchorus.}% +} +\newcommand\SB@errect{% + \SB@Error{Encountered an \protect\endchorus\space outside o% + f any song}{Before song \thesongnum, there is a% + n \protect\endchorus\space line not preceded b% + y a \protect\beginsong\space line.}% +} +\newcommand\SB@errbro{% + \SB@Error{Missing \protect\endsong}% + {Nested song and intersong environments are not supported% + . Song \thesongnum\space might be missing a% + n \protect\endsong\space line.}% +} +\newcommand\SB@errbrr{% + \SB@Error{Nested intersong environments are not supported}% + {A scripture quote or other intersong environment before s% + ong \thesongnum\space is missing its ending line.}% +} +\newcommand\SB@errero{% + \SB@Error{Encountered an \protect\endscripture\space whil% + e processing a song}{Song \thesongnum\space ends wit% + h \protect\endscripture\space when it should end wit% + h \protect\endsong.}% +} +\newcommand\SB@errert{% + \SB@Error{Encountered an \protect\endscripture\space with% + out first seeing a \protect\beginscripture}{Before son% + g \thesongnum, there is an \protect\endscripture\space w% + ith no matching \protect\beginscripture.}% +} +\newcommand\SB@errscrip[1]{% + \SB@Error{Encountered a \protect#1\space outside a scriptu% + re quote}{\protect#1\space can only appear betwee% + n \protect\beginscripture\space an% + d \protect\endscripture\space lines.}% +} +\newcommand\SB@errchord{% + \SB@Error{Song \thesongnum\space seems to have chord% + s that appear outside of any verse or chorus}{All chords a% + nd lyrics should appear between \protect\beginverse\space% + and \protect\endverse, or between \protect\beginchorus\space% + and \protect\endchorus.}% +} +\newcommand\SB@errreplay{% + \SB@Error{Replayed chord has no matching chord}{Son% + g \thesongnum\space uses \protect^ more times than the% + re are chords in the previously memorized verse.}% +} +\newcommand\SB@errreg[1]{% + \SB@Error{Unknown chord-replay register name: #1}{Chord-re% + play registers must be declared with \protect\newchords.}% +} +\newcommand\SB@errdup[1]{% + \SB@Error{Duplicate definition of chord-replay register% + : #1}{\protect\newchords\space was used to declare the sa% + me chord-replay register twice.}% +} +\newcommand\SB@errmbar{% + \SB@Error{Song \thesongnum\space seems to have measur% + e bars that appear outside of any verse or chorus}{All mea% + sure bars (produced with \protect\mbar\space or |) must ap% + pear between \protect\beginverse\space an% + d \protect\endverse, or between \protect\beginchorus\space% + and \protect\endchorus.}% +} +\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@errnoidx[1]{% + \SB@Error{Unknown index identifier: #1}{This index identifie% + r was never declared using \protect\newindex.}% +} +\newcommand\SB@erridx[1]{% + \SB@Error{\protect\idxaltentry\space not allowed in #1 index}% + {This error should not occur. The index generation routines ha% + ve malfunctioned. Try deleting all temporary files and then re% + compiling.}% +} +\newif\ifchorded +\newif\iflyric\lyrictrue +\newif\ifslides +\newif\ifmeasures +\newif\ifpartiallist +\newif\ifrepchorus +\newif\iftranscapos +\newif\ifnolyrics +\newif\ifrawtext +\newif\ifpdfindex\pdfindextrue +\newif\ifsongindexes\songindexestrue +\newif\ifSB@colorboxes\SB@colorboxestrue +\newif\ifSB@genindexes\SB@genindexestrue +\newif\ifSB@omitscrip +\newcommand\nolyrics{} +\let\nolyrics\nolyricstrue +\SB@chordson +\ProcessOptions\relax +\ifSB@pdf\else\pdfindexfalse\fi +\ifSB@colorboxes + \RequirePackage{color} + \definecolor{SongbookShade}{gray}{.80} + \newcommand\SB@colorbox[2]{% + \ifx\@empty#1% + \vbox{% + \kern3\p@% + \hbox{\kern3\p@{#2}\kern3\p@}% + \kern3\p@% + }% + \else% + \colorbox{#1}{#2}% + \fi% + } +\else + \newcommand\SB@colorbox[2]{\vbox{% + \kern3\p@% + \hbox{\kern3\p@{#2}\kern3\p@}% + \kern3\p@% + }} +\fi +\ifrawtext + \newwrite\SB@txtout + \immediate\openout\SB@txtout=\jobname.txt + \newif\ifSB@doEOL + {\catcode`\^^M12 % + \catcode`\^^J12 % + \gdef\SB@printEOL{\ifSB@doEOL^^M^^J\fi}} + {\catcode`#12\gdef\SB@hash{#}} + {\catcode`&12\gdef\SB@amp{&}} + \renewcommand\SB@@@beginsong{% + \begingroup% + \def\'{}\def\`{}\def\v{}\def\u{}\def\={}\def\^{}% + \def\.{}\def\H{}\def\~{}\def\"{}\def\t{}% + \def\copyright{(c)}% + \let~\space% + \let\par\SB@printEOL% + \let\#\SB@hash% + \let\&\SB@amp% + \catcode`|9 % + \catcode`*9 % + \catcode`^9 % + \def\[##1]{}% + \resettitles% + \immediate\write\SB@txtout{\thesongnum. \songtitle}% + \nexttitle% + \foreachtitle{\immediate\write\SB@txtout{(\songtitle)}}% + \ifx\songauthors\@empty\else% + \immediate\write\SB@txtout{\songauthors}% + \fi% + \ifx\SB@rawrefs\@empty\else% + \immediate\write\SB@txtout{\SB@rawrefs}% + \fi% + \immediate\write\SB@txtout{}% + \SB@doEOLfalse% + \obeylines% + } + \renewcommand\SB@endsong{% + \SB@doEOLtrue% + \immediate\write\SB@txtout{\songcopyright\space% + \songlicense\SB@printEOL}% + \endgroup% + \SB@insongfalse% + \stepcounter{songnum}% + } + \def\SB@parsesrefs#1{\def\songrefs{#1}} + \long\def\beginverse#1#2\endverse{% + \SB@doEOLtrue\begingroup% + \def\textnote##1{##1}% + \def\SB@temp{#1}% + \def\SB@star{*}% + \ifx\SB@temp\SB@star% + \immediate\write\SB@txtout{\@gobble#2}% + \else% + \immediate\write\SB@txtout{#2}% + \fi% + \endgroup\SB@doEOLfalse} + \long\def\beginchorus#1\endchorus{% + \SB@doEOLtrue\begingroup% + \def\textnote##1{##1}% + \immediate\write\SB@txtout{Chorus:#1}% + \endgroup\SB@doEOLfalse} + \long\def\beginscripture#1\endscripture{} + \def\musicnote#1{} + \def\textnote#1{% + \SB@doEOLtrue% + \immediate\write\SB@txtout{#1\SB@printEOL}% + \SB@doEOLfalse} + \def\brk{} + \def\rep#1{(x#1)} + \def\echo#1{(#1)} + \def\mbar#1#2{} + \def\lrep{} + \def\rrep{} + \def\nolyrics{} + \renewcommand\memorize[1][]{} + \renewcommand\replay[1][]{} +\fi +\endinput +%% +%% End of file `songs.sty'. diff --git a/sea/irish_rover.tex b/songs/Traditional/Irish_Rover.sg similarity index 69% rename from sea/irish_rover.tex rename to songs/Traditional/Irish_Rover.sg index b2eb5c4..d0538fe 100644 --- a/sea/irish_rover.tex +++ b/songs/Traditional/Irish_Rover.sg @@ -1,121 +1,77 @@ -\begin{SBVerse*} -On the \Ch{G}{Fourth} of July, \Ch{C}{1806} - -We set \Ch{G}{sail} from the sweet Cobh of \Ch{D}{Cork} - -We were \Ch{G}{sailing} away with a \Ch{C}{cargo} of bricks - -For the \Ch{G}{Grand} City \Ch{D}{Hall} in New \Ch{G}{York} - -'Twas a \Ch{G}{wonderful} craft, She was \Ch{D}{rigged} fore and aft - -And \Ch{G}{oh}, how the wild wind \Ch{D}{drove} her - -She stood \Ch{G}{several} blasts, She had \Ch{C}{twenty} seven masts - -And they \Ch{G}{called} her The \Ch{D}{Irish} \Ch{G}{Rover} -\end{SBVerse*} - -\bigskip - -\bigskip - -\bigskip - -We had one million bags of the best Sligo rags - -We had two million barrels of stones - -We had three million sides of old blind horses hides' - -We had four million barrels of bones - -We had five million hogs, six million dogs - -Seven million barrels of porter - -We had eight million barrels of old nanny goate tails - -In the hold of the Irish Rover - -\bigskip - -\bigskip - -There was awl Mickey Coote who played hard on his flute - -And the ladies lined up for a set - -He would tootle with skill for each sparkling quadrille - -Though the dancers were fluther'd and bet - -With his smart witty talk, he was cock of the walk - -As he rolled the dames under and over - -They all knew at a glance when he took up his stance - -That he sailed in The Irish Rover - -\bigskip - -\bigskip - -\bigskip - -There was Barney McGee from the banks of the Lee - -There was Hogan from County Tyrone - -There was Johnny McGurk who was scared stiff of work - -And a man from Westmeath called Malone - -There was Slugger O'Toole, who was drunk as a rule - -And Fighting Bill Tracy from Dover - -And your man, Mick McCann, from the banks of the Bann - -Was the skipper of the Irish Rover - -\bigskip - -\bigskip - -For a sailor its' always a bother in life - -It's so lonesome by night and by day - -That he longs for the shore and a charming young whore - -Who will melt all his troubles away - -Oh, the noise and the rout swillin' poiteen and stout - -For him soon the torment's over - -Of the love of a maid he is never afraid - -An old salt from the Irish Rover - -\bigskip - -\bigskip - -We had sailed seven years when the measles broke out - -And the ship lost its way in the fog - -And that whale of a crew was reduced down to two - -Just myself and the Captain's old dog - -Then the ship struck a rock. Oh Lord! what a shock - -The bulkhead was turned right over - -Turned nine times around and the poor old dog was drowned - -I'm the last of The Irish Rover +\selectlanguage{english} +\songcolumns{2} +\beginsong{Irish Rover}[by=Traditional] + +\beginverse +On the \[Sol]Fourth of July, \[Do]1806 +We set \[Sol]sail from the sweet Cobh of \[Ré]Cork +We were \[Sol]sailing away with a \[Do]cargo of bricks +For the \[Sol]Grand City \[Ré]Hall in New \[Sol]York + +'Twas a \[Sol]wonderful craft, She was \[Ré]rigged 'fore and aft' +And \[Sol]oh, how the wild wind \[Ré]drove her +She stood \[Sol]several blasts, She had \[Do]twenty seven masts +And they \[Sol]called her The \[Ré]Irish \[Sol]Rover +\endverse + +\beginverse +We had one million bags of the best Sligo rags +We had two million barrels of stones +We had three million sides of old blind horses hides' +We had four million barrels of bones + +We had five million hogs, six million dogs +Seven million barrels of porter +We had eight million barrels of old nanny goate tails +In the hold of the Irish Rover +\endverse + +\beginverse +There was awl Mickey Coote who played hard on his flute +And the ladies lined up for a set +He would tootle with skill for each sparkling quadrille +Though the dancers were fluther'd and bet + +With his smart witty talk, he was cock of the walk +As he rolled the dames under and over +They all knew at a glance when he took up his stance +That he sailed in The Irish Rover +\endverse + +\beginverse +There was Barney McGee from the banks of the Lee +There was Hogan from County Tyrone +There was Johnny McGurk who was scared stiff of work +And a man from Westmeath called Malone + +There was Slugger O'Toole, who was drunk as a rule +And Fighting Bill Tracy from Dover +And your man, Mick McCann, from the banks of the Bann +Was the skipper of the Irish Rover +\endverse + +\beginverse +For a sailor its' always a bother in life +It's so lonesome by night and by day +That he longs for the shore and a charming young whore +Who will melt all his troubles away + +Oh, the noise and the rout swillin' poiteen and stout +For him soon the torment's over +Of the love of a maid he is never afraid +An old salt from the Irish Rover +\endverse + +\beginverse +We had sailed seven years when the measles broke out +And the ship lost its way in the fog +And that whale of a crew was reduced down to two +Just myself and the Captain's old dog + +Then the ship struck a rock. Oh Lord! what a shock +The bulkhead was turned right over +Turned nine times around and the poor old dog was drowned +I'm the last of The Irish Rover +\endverse + +\endsong \ No newline at end of file diff --git a/battlefield/johnny_i_hardly_knew_ye.tex b/songs/Traditional/Johnny_I_Harldy_Knew_Ye_.sg similarity index 62% rename from battlefield/johnny_i_hardly_knew_ye.tex rename to songs/Traditional/Johnny_I_Harldy_Knew_Ye_.sg index e68db95..f99c92c 100644 --- a/battlefield/johnny_i_hardly_knew_ye.tex +++ b/songs/Traditional/Johnny_I_Harldy_Knew_Ye_.sg @@ -1,76 +1,54 @@ -\begin{SBVerse*} -While \Ch{Em}{goin'} the road to sweet Athy, \Ch{G}{Hurroo!} Hurroo ! - -While \Ch{Em}{goin'} the road to sweet Athy, \Ch{G}{Hurroo} ! \Ch{B7}{Hurroo} ! - -While \Ch{Em}{goin'} the road to \Ch{Am}{sweet} Athy, - -A \Ch{G}{stick} in the hand and a \Ch{B7}{drop} in the eye - -A \Ch{Em}{dole}ful \Ch{Am}{damsel} \Ch{G}{I} heard \Ch{B7}{cry}, - -\Ch{Em}{Johnny} I \Ch{D}{hardly} \Ch{Em}{knew} ye ! -\end{SBVerse*} - -\bigskip - -\begin{SBChorus} -With your drums and guns and drums and guns, Hurroo ! Hurroo ! (bis) - -With your drums and guns and drums and guns, - -The enemy nearly slew ye - -Oh me darling dear, Ye look so queer - -Johnny I hardly knew ye -\end{SBChorus} - -\bigskip - -Where are the eyes that look so mild, Hurroo ! Hurroo ! (bis) - -Where are the eyes that look so mild - -When my poor heart you so beguiled - -Why did ye skedaddle from me and the child - -Oh Johnny, I hardly knew ye. - -\bigskip - -Where are the legs with which ye run, Hurroo ! Hurroo ! (bis) - -Where are the legs with which ye run - -When ye went for to carry a gun - -Indeed your dancing days are done - -Oh Johnny, I hardly knew ye. - -\bigskip - -Ye haven't an arm, Ye haven't a leg, Hurroo ! Hurroo ! (bis) - -Ye haven't an arm, ye haven't a leg - -Ye're an armless, boneless, chickenless egg - -Ye'll have to be put in a bowl to beg - -Oh Johnny I hardly knew ye. - -\bigskip - -I'm happy for to see ye home, Hurroo ! Hurroo ! (bis) - -I'm happy for to see ye home - -All from the island of Sulloon - -So low in flesh, so high in bone - -Oh Johnny I hardly knew ye. - +\selectlanguage{english} +\songcolumns{2} +\beginsong{Johnny, I Harldy Knew Ye !}[by=Traditional] + +\beginverse +While \[Mim]goin' the road to sweet Athy, \[Sol]Hurroo! Hurroo ! +While \[Mim]goin' the road to sweet Athy, \[Sol]Hurroo! \[Si7]Hurroo ! +While \[Mim]goin' the road to \[Lam]sweet Athy, +A \[Sol]stick in the hand and a \[Si7]drop in the eye +A \[Mim]doleful \[Lam]damsel \[Sol]I heard \[Si7]cry, +\[Mim]Johnny I \[Ré]hardly \[Mim]knew ye ! +\endverse + +\beginchorus +With your drums and guns and drums and guns, Hurroo ! Hurroo ! (bis) +With your drums and guns and drums and guns, +The enemy nearly slew ye +Oh me darling dear, Ye look so queer +Johnny I hardly knew ye +\endchorus + +\beginverse +Where are the eyes that look so mild, Hurroo ! Hurroo ! (bis) +Where are the eyes that look so mild +When my poor heart you so beguiled +Why did ye skedaddle from me and the child +Oh Johnny, I hardly knew ye. +\endverse + +\beginverse +Where are the legs with which ye run, Hurroo ! Hurroo ! (bis) +Where are the legs with which ye run +When ye went for to carry a gun +Indeed your dancing days are done +Oh Johnny, I hardly knew ye. +\endverse + +\beginverse +Ye haven't an arm, Ye haven't a leg, Hurroo ! Hurroo ! (bis) +Ye haven't an arm, ye haven't a leg +Ye're an armless, boneless, chickenless egg +Ye'll have to be put in a bowl to beg +Oh Johnny I hardly knew ye. +\endverse + +\beginverse +I'm happy for to see ye home, Hurroo ! Hurroo ! (bis) +I'm happy for to see ye home +All from the island of Sulloon +So low in flesh, so high in bone +Oh Johnny I hardly knew ye. +\endverse + +\endsong \ No newline at end of file diff --git a/road/rocky_road_to_dublin.tex b/songs/Traditional/Rocky_Road_To_Dublin.sg similarity index 62% rename from road/rocky_road_to_dublin.tex rename to songs/Traditional/Rocky_Road_To_Dublin.sg index 413324b..02bc847 100644 --- a/road/rocky_road_to_dublin.tex +++ b/songs/Traditional/Rocky_Road_To_Dublin.sg @@ -1,117 +1,68 @@ -In the merry month of May, From my home I started, - -Left the girls of Tuam, Nearly broken hearted, - -Saluted father dear, Kissed my darlin' mother, - -Drank a pint of beer, My grief and tears to smother, - -Then off to reap the corn, And leave where I was born, - -I cut a stout blackthorn, To banish ghost and goblin, - -In a brand new pair of brogues, I rattled o'er the bogs, - -And frightened all the dogs,On the rocky road to Dublin. - -\bigskip - -\textbf{One, two, three, four five,} - -\textbf{Hunt the hare and turn her} - -\textbf{Down the rocky road} - -\textbf{And all the ways to Dublin,} - -\textbf{Whack-fol-lol-de-ra.} - -\bigskip - -In Mullingar that night, I rested limbs so weary, - -Started by daylight, Next mornin' light and airy, - -Took a drop of the pure, To keep my heart from sinkin', - -That's an Irishman's cure, Whene'er he's on for drinking. - -To see the lasses smile, Laughing all the while, - -At my curious style, 'Twould set your heart a-bubblin'. - -They ax'd if I was hired, The wages I required, - -Till I was almost tired, Of the rocky road to Dublin. - -\bigskip - -In Dublin next arrived, I thought it such a pity, - -To be so soon deprived, A view of that fine city. - -Then I took a stroll, All among the quality, - -My bundle it was stole, In a neat locality; - -Something crossed my mind, Then I looked behind; - -No bundle could I find, Upon my stick a wobblin'. - -Enquirin' for the rogue, They said my Connacht brogue, - -Wasn't much in vogue, On the rocky road to Dublin. - -\bigskip - -From there I got away, My spirits never failin' - -Landed on the quay As the ship was sailin'; - -Captain at me roared, Said that no room had he, - -When I jumped aboard, A cabin found for Paddy, - -Down among the pigs I played some funny rigs, - -Danced some hearty jigs, The water round me bubblin', - -When off Holyhead, I wished myself was dead, - -Or better far instead, On the rocky road to Dublin. - -\bigskip - -The boys of Liverpool, When we safely landed, - -Called myself a fool; I could no longer stand it; - -Blood began to boil, Temper I was losin', - -Poor ould Erin's isle They began abusin', - -\og Hurrah my soul \fg , sez I, My shillelagh I let fly; - -Some Galway boys were by, Saw I was a hobble in, - -Then with a loud hurray, They joined in the affray. - -We quickly cleared the way, For the rocky road to Dublin. - -%KEY Dm \\ - -%verse:\\ -%Dm C \\ -%Dm C\\ -%Dm C\\ -%Dm C\\ -%Dm F Dm F\\ -%Dm F Dm \\ -%Dm F Dm F\\ -%Dm C \\ - -%chorus: C Dm\\ -%Dm \\ -%Dm\\ -%C\\ -%Dm \\ +\selectlanguage{english} +\songcolumns{2} +\beginsong{Rocky Road To Dublin}[by=Traditional] + +\beginverse +In the \[Rém]merry \[Do]month of \[Rém]May, From my home I started, +Left the \[Do]girls of \[Rém]Tuam, Nearly \[Do]broken hearted, +\[Rém]Saluted \[Do]father \[Rém]dear, Kissed my darlin' mother, +Drank a \[Do]pint of \[Rém]beer, My grief and \[Do]tears to smother, +Then \[Rém]off to reap the \[Do]corn, And \[Rém]leave where I was \[Do]born, +I \[Rém]cut a stout \[Do]blackthorn, To banish ghost and goblin, +In a \[Rém]brand new pair of \[Do]brogues, I \[Rém]rattled o'er the \[Do]bogs, +And \[Rém]frightened all the \[Do]dogs, On the rocky road to Dublin. +\endverse + +\beginchorus +\[Lam]One, two, \[Do]three, four \[Rém]five, +Hunt the hare and turn her +Down the rocky road +And all the \[Do]ways to Dublin, +\[Am]Whack-fol-\[Do]lol-de-\[Rém]ra. +\endchorus + +\beginverse +In Mullingar that night, I rested limbs so weary, +Started by daylight, Next mornin' light and airy, +Took a drop of the pure, To keep my heart from sinkin', +That's an Irishman's cure, Whene'er he's on for drinking. +To see the lasses smile, Laughing all the while, +At my curious style, 'Twould set your heart a-bubblin'. +They ax'd if I was hired, The wages I required, +Till I was almost tired, Of the rocky road to Dublin. +\endverse + +\beginverse +In Dublin next arrived, I thought it such a pity, +To be so soon deprived, A view of that fine city. +Then I took a stroll, All among the quality, +My bundle it was stole, In a neat locality; +Something crossed my mind, Then I looked behind; +No bundle could I find, Upon my stick a wobblin'. +Enquirin' for the rogue, They said my Connacht brogue, +Wasn't much in vogue, On the rocky road to Dublin. +\endverse + +\beginverse +From there I got away, My spirits never failin' +Landed on the quay As the ship was sailin'; +Captain at me roared, Said that no room had he, +When I jumped aboard, A cabin found for Paddy, +Down among the pigs I played some funny rigs, +Danced some hearty jigs, The water round me bubblin', +When off Holyhead, I wished myself was dead, +Or better far instead, On the rocky road to Dublin. +\endverse + +\beginverse +The boys of Liverpool, When we safely landed, +Called myself a fool; I could no longer stand it; +Blood began to boil, Temper I was losin', +Poor ould Erin's isle They began abusin', +\og Hurrah my soul \fg , sez I, My shillelagh I let fly; +Some Galway boys were by, Saw I was a hobble in, +Then with a loud hurray, They joined in the affray. +We quickly cleared the way, For the rocky road to Dublin. +\endverse + +\endsong \ No newline at end of file diff --git a/songs/Traditional/The_Furze_in_Bloom_jig_.sg b/songs/Traditional/The_Furze_in_Bloom_jig_.sg new file mode 100644 index 0000000..cd6ca7e --- /dev/null +++ b/songs/Traditional/The_Furze_in_Bloom_jig_.sg @@ -0,0 +1,7 @@ +\selectlanguage{english} +\songcolumns{2} +\beginsong{The Furze in Bloom (jig)}[by=Traditional] + +\lilypond{The_furze_in_bloom} + +\endsong \ No newline at end of file diff --git a/booze/jug_of_punch.tex b/songs/Traditional/The_Jug_of_Punch.sg similarity index 67% rename from booze/jug_of_punch.tex rename to songs/Traditional/The_Jug_of_Punch.sg index 76160e0..b63180d 100644 --- a/booze/jug_of_punch.tex +++ b/songs/Traditional/The_Jug_of_Punch.sg @@ -1,87 +1,65 @@ -One pleasent evening in the month of June, - -As I was sleeping in my room, - -A small bird sat on an ivy bunch, - -And the song he sang was The Jug Of Punch. - -\textbf{Too-ra loo-ra loo, too-ra loo-ra lay,} - -\textbf{Too-ra loo-ra loo, too-ra loo-ra lay,} - -\textbf{A small bird sang on an ivy bunch,} - -\textbf{And the song he sang was the jug of punch.} - -\bigskip - -What more diveration can a man desire, - -Than to sit him by an alehouse fire, - -Upon his knee a pritty wench, - -And on the table a jug of punch. - -\textbf{Too-ra loo-ra loo, too-ra loo-ra lay,} - -\textbf{Too-ra loo-ra loo, too-ra loo-ra lay,} - -\textbf{Upon his knee a pritty wench,} - -\textbf{And on the table a jug of punch.} - -\bigskip - -Let the doctors come with all their art - -They'll make no impression upon me heart - -Even the cripple forgets his hunch - -When he's snug outside of a jug of punch - -\textbf{Too-ra loo-ra loo, too-ra loo-ra lay,} - -\textbf{Too-ra loo-ra loo, too-ra loo-ra lay,} - -\textbf{Even the cripple forgets his hunch} - -\textbf{When he's snug outside of a jug of punch.} - -\bigskip - -If I get drunk, well, me money's me own, - -And them don't like me, they can leave me alone; - -I'll tune me fiddle and I'll rosin me bow - -And I'll be welcome wherever I go. - -\textbf{Too-ra loo-ra loo, too-ra loo-ra lay,} - -\textbf{Too-ra loo-ra loo, too-ra loo-ra lay,} - -\textbf{I'll tune me fiddle and I'll rosin me bow} - -\textbf{And I'll be welcome wherever I go.} - -\bigskip - -And when I'm dead and I'm in me grave - -No costly tombstone will I crave. - -Lay me down by me native peat, - -With a jug of punch at me head and feet. - -\textbf{Too-ra loo-ra loo, too-ra loo-ra lay,} - -\textbf{Too-ra loo-ra loo, too-ra loo-ra lay,} - -\textbf{Lay me down by me native peat,} - -\textbf{With a jug of punch at me head and feet.} +\selectlanguage{english} +\songcolumns{2} +\beginsong{The Jug of Punch}[by=Traditional] + +\beginverse +One \[Ré]pleasent evening in the month of June, +As \[La]I was sleeping \[Ré]in my room, +A small bird sat on an \[Sol]ivy \[La]bunch, +And the \[Ré]song he \[Sol]sang was The \[La7]Jug Of \[Ré]Punch. + +\textbf{Too-ra \[Ré]loo-ra loo, too-ra \[Mim]loo-ra lay,} +\textbf{Too-ra \[La]loo-ra loo, too-ra \[Ré]loo-ra lay,} +\textbf{A small bird sat on an \[Sol]ivy \[La]bunch,} +\textbf{And the \[Ré]song he \[Sol]sang was the \[La7]jug of \[Ré]punch.} +\endverse + +\beginverse +What more diveration can a man desire, +Than to sit him by an alehouse fire, +Upon his knee a pritty wench, +And on the table a jug of punch. + +\textbf{Too-ra loo-ra loo, too-ra loo-ra lay,} +\textbf{Too-ra loo-ra loo, too-ra loo-ra lay,} +\textbf{Upon his knee a pritty wench,} +\textbf{And on the table a jug of punch.} +\endverse + +\beginverse +Let the doctors come with all their art +They'll make no impression upon me heart +Even the cripple forgets his hunch +When he's snug outside of a jug of punch + +\textbf{Too-ra loo-ra loo, too-ra loo-ra lay,} +\textbf{Too-ra loo-ra loo, too-ra loo-ra lay,} +\textbf{Even the cripple forgets his hunch} +\textbf{When he's snug outside of a jug of punch.} +\endverse + +\beginverse +If I get drunk, well, me money's me own, +And them don't like me, they can leave me alone; +I'll tune me fiddle and I'll rosin me bow +And I'll be welcome wherever I go. + +\textbf{Too-ra loo-ra loo, too-ra loo-ra lay,} +\textbf{Too-ra loo-ra loo, too-ra loo-ra lay,} +\textbf{I'll tune me fiddle and I'll rosin me bow} +\textbf{And I'll be welcome wherever I go.} +\endverse + +\beginverse +And when I'm dead and I'm in me grave +No costly tombstone will I crave. +Lay me down by me native peat, +With a jug of punch at me head and feet. + +\textbf{Too-ra loo-ra loo, too-ra loo-ra lay,} +\textbf{Too-ra loo-ra loo, too-ra loo-ra lay,} +\textbf{Lay me down by me native peat,} +\textbf{With a jug of punch at me head and feet.} +\endverse + +\endsong \ No newline at end of file diff --git a/road/whiskey_in_the_jar.tex b/songs/Traditional/Whiskey_In_The_Jar.sg similarity index 58% rename from road/whiskey_in_the_jar.tex rename to songs/Traditional/Whiskey_In_The_Jar.sg index 049d060..002a328 100644 --- a/road/whiskey_in_the_jar.tex +++ b/songs/Traditional/Whiskey_In_The_Jar.sg @@ -1,55 +1,47 @@ -As I was a goin' over the far famed Kerry mountains - -I met with captain Farrell and his money he was counting - -I first produced me pistol and then produced me rapier - -Saying "Stand and deliver" for I am a bold deceiver - -\bigskip - -\textbf{Musha ring dumma do damma da} - -\textbf{whack fol' the daddy 'ol (bis)} - -\textbf{there's whiskey in the jar} - -\bigskip - -I counted out his money and it made a pretty penny - -I put it in me pocket and I took it home to Jenny - -She said and she swore that she never would deceive me - -But the devil take the women for they never can be easy - -\bigskip - -I went up in my chamber, all for to take a slumber - -I dreamt of gold and jewels and for sure 't was no wonder - -But Jenny drew my charges and she filled them up with water - -And sent for captain Farrell to be ready for the slaughter - -\bigskip - -'t was early in the morning, as I rose to travel - -The guards were all around me likewise captain Farrell - -I first produced me pistol for she stole away me rapier - -I couldn't shoot the water, so a prisoner I was taken - -\bigskip - -If anyone can aid me it's my brother in the army - -If I knew his station down in Cork or in Killarney - -And if he'll come and join me, we'll go rovin' near Killkenny - -And sure he'll treat me better than this fuckin' cunt of Jenny +\selectlanguage{english} +\songcolumns{2} +\beginsong{Whiskey In The Jar}[by=Traditional] + +\beginverse +As \[Sol]I was a goin' over the \[Mim]far famed Kerry mountains +I \[Do]met with captain Farrell and his \[Sol]money he was counting +I first produced me pistol and \[Mim]then produced me rapier +Saying \[Do]"Stand and deliver" for I \[Sol]am a bold deceiver +\endverse + +\beginchorus +Musha \[Ré]ring dumma do damma da +\[Sol] whack fol' the daddy 'ol +\[Do] whack fol' the daddy 'ol +there's \[Ré]whiskey \[Sol]in the \[Ré]jar +\endchorus + +\beginverse +I counted out his money and it made a pretty penny +I put it in me pocket and I took it home to Jenny +She said and she swore that she never would deceive me +But the devil take the women for they never can be easy +\endverse + +\beginverse +I went up in my chamber, all for to take a slumber +I dreamt of gold and jewels and for sure 't was no wonder +But Jenny drew my charges and she filled them up with water +And sent for captain Farrell to be ready for the slaughter +\endverse + +\beginverse +'t was early in the morning, as I rose to travel +The guards were all around me likewise captain Farrell +I first produced me pistol for she stole away me rapier +I couldn't shoot the water, so a prisoner I was taken +\endverse + +\beginverse +If anyone can aid me it's my brother in the army +If I knew his station down in Cork or in Killarney +And if he'll come and join me, we'll go rovin' near Killkenny +And sure he'll treat me better than this fuckin' cunt of Jenny +\endverse + +\endsong \ No newline at end of file diff --git a/songs/Traditional/Whiskey_You_re_the_Devil.sg b/songs/Traditional/Whiskey_You_re_the_Devil.sg new file mode 100644 index 0000000..09b1750 --- /dev/null +++ b/songs/Traditional/Whiskey_You_re_the_Devil.sg @@ -0,0 +1,45 @@ +\selectlanguage{english} +\songcolumns{2} +\beginsong{Whiskey, You're the Devil}[by=Traditional] + +\beginchorus +Oh, \[Sol]whiskey you're the devil, You're \[Do]leading me \[Sol]astray +O'er hills and mountains and to \[Ré]Americae +You're \[Sol]sweeter, stronger, decenter, You're \[Do]spunkier than \[Sol]tea +Oh, \[Sol]whiskey you're me darling drunk or \[Ré]so\[Sol]ber +\endchorus + +\beginverse +Now \[Sol]brave boys, we're on the march +\[Ré]Off to Portu\[Do]gal and Spain +\[Sol]Drums a'beating, banners a'waving +\[Do]Devil a'home will \[Ré]come tonight +Lo' fare thee well With me thitery doodelum the \[Ré]da +Me \[Lam]thitery doodelum the \[Do]da +Me \[Sol]right fol' tur-a laddie-o +There's \[Ré]whiskey in the \[Sol]jar +\endverse + +\beginverse +The French are fighting boldly +Men are dying hot and coldly +Give every man his flask of powder +His firelock on his shoulder +Lo' fare thee well With me thitery doodelum the da +Me thitery doodelum the da +Me right fol' tur-a laddie-o +There's whiskey in the jar +\endverse + +\beginverse +Says the mother : \og Do not wrong me +Don't take me daughter from me +For if you do I will torment you +And after death me ghost will haunt you \fg +We're off, fare thee well With me thitery doodelum the da +Me thitery doodelum the da +Me right fol' tur-a laddie-o +There's whiskey in the jar +\endverse + +\endsong \ No newline at end of file diff --git a/templates/ancient.tmpl b/templates/ancient.tmpl new file mode 100644 index 0000000..07204fd --- /dev/null +++ b/templates/ancient.tmpl @@ -0,0 +1,96 @@ +% Copyright (C) 2011 Benjamin Coudrin +% Copyright (C) 2009-2010 Romain Goffe, Alexandre Dupas +% Copyright (C) 2008 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 +% as published by the Free Software Foundation; either version 2 +% of the License, or (at your option) any later version. +% +% This program is distributed in the hope that it will be useful, +% but WITHOUT ANY WARRANTY; without even the implied warranty of +% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +% GNU General Public License for more details. +% +% You should have received a copy of the GNU General Public License +% along with this program; if not, write to the Free Software +% Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, +% MA 02110-1301, USA. +% +% The latest version of this program can be obtained from +% http://songs.sourceforge.net. +% +% Modified to serve personnal purposes. Newer versions can be +% obtained from http://www.lohrun.net. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% Template parameters +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%:[ +%%: {"name":"title", "description":"Title", "default":"Shiver Me Timbers", "mandatory":true}, +%%: {"name":"author", "description":"Author", "default":"Benjamin Coudrin", "mandatory":true}, +%%: {"name":"booktype", "description":"Type", "type":"enum", "values":["chorded","lyric"], "default":"chorded", "mandatory":true}, +%%: {"name":"bookoptions", "description":"Options", "type":"flag", "values":["diagram","lilypond","pictures","tabs"], "join":",", "mandatory":true, "default":["lilypond"]}, +%%: {"name":"version", "description":"Version", "default":"1.0.0"}, +%%: {"name":"subtitle", "description":"Songs from the Book"}, +%%: {"name":"web", "description":"Web", "default":"http://www.myspace.com/shivermetimbersofficial"}, +%%: {"name":"mail", "description":"Email", "default":"benjamin.coudrin@gmail.com"}, +%%: {"name":"picture", "description":"Picture", "type":"file", "default":"shiver"}, +%%: {"name":"picturecopyright", "description":"Copyright", "default":"WTFPL - Do What The Fuck You Want Public License"}, +%%: {"name":"footer", "description":"Footer", "default":"\\begin{flushleft}Shiver Me Timbers\\end{flushleft}"}, +%%: {"name":"license", "description":"License", "default":"\\input{license.tex}"}, +%%: {"name":"mainfontsize", "description":"Font Size", "type":"font", "default":"10"}, +%%: {"name":"songnumberbgcolor", "description":"Number Shade", "type":"color", "default":"#D1E4AE"}, +%%: {"name":"notebgcolor", "description":"Note Shade", "type":"color", "default":"#FFFDB3"}, +%%: {"name":"indexbgcolor", "description":"Index Shade", "type":"color", "default":"#D1E4AE"} +%%:] +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% begin document +\documentclass[\getbooktype,\getbookoptions,\getmainfontsize]{crepbook} +\usepackage[utf8]{inputenc} +\usepackage[english,spanish,french]{babel} +\usepackage[T1]{fontenc} +\usepackage{tex/venturisold} + +\title{\gettitle} +\author{\getauthor} +\subtitle{\getsubtitle} +\version{\getversion} +\mail{\getmail} +\web{\getweb} +\picture{\getpicture} +\picturecopyright{\getpicturecopyright} +\footer{\getfooter} +\licence{\getlicense} + +\newindex{titleidx}{\getname_title} +\newauthorindex{authidx}{\getname_auth} + +\graphicspath{ + {img/}, +} + +\definecolor{SongNumberBgColor}{HTML}{\getsongnumberbgcolor} +\definecolor{NoteBgColor}{HTML}{\getnotebgcolor} +\definecolor{IndexBgColor}{HTML}{\getindexbgcolor} + +\renewcommand{\snumbgcolor}{SongNumberBgColor} +\renewcommand{\notebgcolor}{NoteBgColor} +\renewcommand{\idxbgcolor}{IndexBgColor} + +\renewcommand{\printchord}[1]{\mdseries\ttfamily\upshape#1} +\pagestyle{empty} + +\begin{document} + +\maketitle + +\showindex{Index des chansons}{titleidx} + +\songsection{Liste des chansons} +\begin{songs}{titleidx,authidx} + \getsongslist +\end{songs} + +\end{document} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% end document diff --git a/tex/licence.sty b/tex/licence.sty new file mode 100644 index 0000000..fcb6769 --- /dev/null +++ b/tex/licence.sty @@ -0,0 +1,47 @@ +\RequirePackage{graphicx} +\RequirePackage{calc} + +\newlength{\largeurnota} +\newlength{\largeurlignenota} +\newlength{\indentationnota} +\newlength{\paddingnota} +\setlength{\largeurnota}{0.8cm} +\setlength{\paddingnota}{5pt} + +\newenvironment{pictonote}[1]{% + \begin{list}{}{% + \setlength{\labelsep}{5pt}% + \setlength{\leftmargin}{20pt}% + \setlength{\rightmargin}{25pt}} + \item% + \setlength{\indentationnota}{\@totalleftmargin+\largeurnota+\paddingnota}% + \setlength{\largeurlignenota}{\linewidth-\largeurnota-\paddingnota}% + \parshape=3% + \indentationnota\largeurlignenota% + \indentationnota\largeurlignenota% + \@totalleftmargin\linewidth% + \raisebox{-\largeurnota+2.2ex}[0pt][0pt]{% + \makebox[0pt][r]{% + \includegraphics[width=\largeurnota]{#1}% + \hspace{\paddingnota}}}% + \ignorespaces}{% + \end{list}% + \vspace{0.2cm}% +} + +\newcommand{\@lheader}[1]{% + \textbf{\large #1}% + \vspace{0.2cm}% +} + +\newcommand{\lcondition}[1]{% + \textbf{#1~--~}% +} + +\newenvironment{lblock}[1]{% + \@lheader{#1}}{% + \vspace{0.6cm}% +} + + +\endinput diff --git a/tex/venturisold.sty b/tex/venturisold.sty new file mode 100644 index 0000000..0fa2136 --- /dev/null +++ b/tex/venturisold.sty @@ -0,0 +1,30 @@ +%% Copyright 2010 Clea F. Rees +% +% 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 Clea F. Rees. +% +% This work consists of all files listed in manifest.txt. +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{venturisold}[2010/07/03 v1.005 VenturisOldADF PS] +\RequirePackage[T1]{fontenc} +\RequirePackage{textcomp} +\RequirePackage{nfssext-cfr} +%:Make Venturis Old default for roman text +\renewcommand{\rmdefault}{yvo} +%:introduce special titling commands +\DeclareRobustCommand{\vtstyle}[1][]{% allow an optional argument for consistency with venturis.sty + \not@math@alphabet\vtstyle\relax + \fontfamily{yvod}\selectfont} +\DeclareTextFontCommand{\textvt}{\vtstyle} +\DeclareTextFontCommand{\textvtl}{\vtstyle} +\endinput +%% end venturisold.sty diff --git a/town/dans_les_prisons_de_nantes.tex b/town/dans_les_prisons_de_nantes.tex deleted file mode 100644 index 4579544..0000000 --- a/town/dans_les_prisons_de_nantes.tex +++ /dev/null @@ -1,67 +0,0 @@ -\begin{SBVerse*} -\Ch{Am}{Dans} les prisons de Nantes \Ch{G}{~} (bis) - -Y avait un \Ch{G}{prison}\Ch{Am}{nier} -\end{SBVerse*} - -\bigskip - -Personne ne vint le \og vou\`ere \fg - -Que la fille du ge\^olier - -\bigskip - -Un jour il lui demande - -Et que dit-on de \og mou\'e \fg ? - -\bigskip - -On dit de vous en ville - -Que vous serez pendu - -\bigskip - -Mais s'il faut qu'on me pende - -D\'eliez-moi les pieds - -\bigskip - -La fille \'etait jeunette - -Les pieds lui a d\'eli\'e - -\bigskip - -Le prisonnier alerte - -Dans la Loire s'est jet\'e - -\bigskip - -D\`es qu'il f\^ut sur les rives - -Il se prit \`a chanter - -\bigskip - -Je chante pour les belles - -Surtout celle du ge\^olier - -\bigskip - -Si je reviens \`a Nantes - -Oui je l'\'epouserai - -\bigskip - -Dans les prisons de Nantes - -Y avait un prisonnier - -\bigskip diff --git a/town/dirty_old_town.tex b/town/dirty_old_town.tex deleted file mode 100644 index fedf8c2..0000000 --- a/town/dirty_old_town.tex +++ /dev/null @@ -1,49 +0,0 @@ -\begin{SBVerse*} -I met my \Ch{G}{love}, by the gas yard wall - -Dreamed a \Ch{C}{dream}, by the old \Ch{G}{canal} - -Kissed my \Ch{Em}{girl}, by the factory \Ch{G}{wall} - -Dirty old \Ch{D}{town}, dirty old \Ch{Em}{town} -\end{SBVerse*} - -\bigskip - -I heard a siren from the dock - -Saw a train cut the night on fire - -Smelled the breeze on the smokey wind - -Dirty old town, dirty old town - -\bigskip - -I'm going to make a big sharp ax - -Shining steel tempered in the fire - -I'll cut ye down like an old dead tree - -Dirty old town, dirty old town - -\bigskip - -Clouds are drifting on the street - -Cats are prowling on their beats - -Springs a girl on the streets at night - -Dirty old town, dirty old town - -\bigskip - -I Met my love, by the gas yard wall - -Dreamed a dream, by the old canal - -Kissed my girl, by the factory wall - -Dirty old town, dirty old town diff --git a/town/eileen_og.tex b/town/eileen_og.tex deleted file mode 100644 index b27fe08..0000000 --- a/town/eileen_og.tex +++ /dev/null @@ -1,67 +0,0 @@ -\begin{SBVerse*} -\Ch{Am}{Eileen} Oge, and \Ch{E7}{that} the darlin's \Ch{Am}{name} is, \Ch{G}{through} the barony her \Ch{D}{features} they were \Ch{G}{famous} - -\Ch{Am}{If} we loved her, \Ch{E7}{who} is there to \Ch{Am}{blame} us, for wasn't she the \Ch{E7}{pride} of Petra\Ch{Am}{vore} ? - -\Ch{F}{But} her \Ch{G7}{beauty} \Ch{C}{made} us all so shy, \Ch{Dm}{not} a \Ch{E7}{man} could \Ch{Am}{look} her in the eye - -\Ch{F}{Boys}, O \Ch{G7}{boys}, sure \Ch{C}{that's} reason why we're in \Ch{Am}{mourning} for the \Ch{E7}{pride} of Petra\Ch{Am}{vore} -\end{SBVerse*} -\bigskip -\begin{SBChorus} -\Ch{F}{Eileen} \Ch{G7}{Og}, me \Ch{C}{heart} is growing grey \Ch{Dm}{ever} since the \Ch{E7}{day}, you \Ch{Am}{wandered} far away - -\Ch{F}{Eileen} \Ch{G7}{Og}, there's \Ch{C}{good} fish in the sea but there's \Ch{Am}{none} of them like the \Ch{E7}{pride} of Petra\Ch{Am}{vore} -\end{SBChorus} -\bigskip -Friday at the fair of Ballintubber - -Eileen met McGrath the cattle jobber - -I'd like to set me mark upon the robber - -For he stole away the Pride of Petravore - -He never seemed to see the girl at all - -Even when she ogled him underneath her shawl - -Looking big and masterful when she was looking small - -Most provoking for the Pride of Petravore - -\bigskip - -So it went as it was in the beginning - -Eileen Og was bent upon the winning - -Big McGrath contentedly was grinning - -Being courted by the Pride of Petravore - -Says he, \og I know a girl who'd knock you into fits \fg - -At that Eileen nearly lost her wits - -The upshot of the ruction was that now the robber sits - -With his arm around the Pride of Petravore - -\bigskip - -Boys, O boys, with fate 'tis hard to grapple - -Of my eye 'cause Eileen was the apple - -And to see her walkin' to the chapel - -Wid the hardest featured man in Petravore - -Now me boys, this is all I have to say - -When you do your courting make no display - -If you want them to run after you just walk the other way - -For they're mostly like the Pride of Petravore diff --git a/town/town.tex b/town/town.tex deleted file mode 100644 index dffd987..0000000 --- a/town/town.tex +++ /dev/null @@ -1,13 +0,0 @@ -\begin{song}{Dirty Old Town}{G}{~}{Ewan MacColl}{}{} - \input{town/dirty_old_town.tex} -\end{song} - -\begin{song}{Dans les prisons de Nantes}{Am}{~}{traditionnel breton}{}{} - \input{town/dans_les_prisons_de_nantes.tex} -\end{song} - -\begin{song}{Eileen Og}{Am}{~}{Percy French}{}{} - \input{town/eileen_og.tex} -\end{song} - -\input{town/forges.tex} \ No newline at end of file diff --git a/utils/cover.sh b/utils/cover.sh new file mode 100755 index 0000000..bfca9ae --- /dev/null +++ b/utils/cover.sh @@ -0,0 +1,35 @@ +#!/bin/sh +for directory in songs/*; do + images=`ls $directory/*.{jpg,png} 2> /dev/null` + val=`echo $images | wc -w` + for song in $directory/*.sg; do + sg=`basename $song` + sed -i '0,/\\gtab/s//\\cover\n\\gtab/' $song + if [ $val -gt 1 ] + then + i=1 + for image in $images; do + img=`basename $image .jpg` + img=`echo $img | sed 's/.png$//'` + echo "Apply $img to $song ? ($i/$val)" + i=$(($i+1)) + read answer + case "$answer" in + "y") + sed -i 's/beginsong{\([^}]*\)}\[\([^]]*\)\]/beginsong{\1}[\2,cov='$img']/' $song + break; + ;; + "n") + true + ;; + esac + done; + elif [ $val -eq 1 ] + then + img=`basename $images .jpg` + img=`echo $img | sed 's/.png$//'` + echo "Applying $img to $sg" + sed -i 's/beginsong{\([^}]*\)}\[\([^]]*\)\]/beginsong{\1}[\2,cov='$img']/' $song + fi; + done; +done; diff --git a/utils/emacs-format-file.el b/utils/emacs-format-file.el new file mode 100644 index 0000000..95daab4 --- /dev/null +++ b/utils/emacs-format-file.el @@ -0,0 +1,45 @@ +;;; File: emacs-format-file.el +;;; Description: use this for batch indentation with emacs (see indent.sh) +;;; Author: Romain Goffe +;;; Date: 27/10/2010 +;;; Commentary: based on the work of Stan Warford (emacs-format-mode) and Scott Andrew Borton (indent-mode) + +(defun songbook-indent-line () + "Indent current line as SONGBOOK code." + (interactive) + (beginning-of-line) + (if (bobp) + (indent-line-to 0) ; First line is always non-indented + (let ((not-indented t) cur-indent) + (if (looking-at "^[ \t]*\\(\\\\end\\(song\\|verse\\|chorus\\)\\)") ; If the line we are looking at is the end of a block, then decrease the indentation + (progn + (save-excursion + (forward-line -1) + (setq cur-indent (- (current-indentation) 2))) + (if (< cur-indent 0) ; We can't indent past the left margin + (setq cur-indent 0))) + (save-excursion + (while not-indented ; Iterate backwards until we find an indentation hint + (forward-line -1) + (if (looking-at "^[ \t]*\\(\\\\end\\(song\\|verse\\|chorus\\)\\)") ; This hint indicates that we need to indent at the level of the END_ token + (progn + (setq cur-indent (current-indentation)) + (setq not-indented nil)) + (if (looking-at "^[ \t]*\\(\\\\begin\\(song\\|verse\\|chorus\\)\\)") ; This hint indicates that we need to indent an extra level + (progn + (setq cur-indent (+ (current-indentation) 2)) ; Do the actual indenting + (setq not-indented nil)) + (if (bobp) + (setq not-indented nil))))))) + (if cur-indent + (indent-line-to cur-indent) + (indent-line-to 0)))) ; If we didn't see an indentation hint, then allow no indentation + ) + +(defun emacs-format-function () + "Format the whole buffer." + (set (make-local-variable 'indent-line-function) 'songbook-indent-line) + (indent-region (point-min) (point-max) nil) + (untabify (point-min) (point-max)) + (save-buffer) + ) diff --git a/utils/header-english b/utils/header-english new file mode 100644 index 0000000..ad4d76d --- /dev/null +++ b/utils/header-english @@ -0,0 +1,11 @@ +{ +"template" : "patacrep-en.tmpl", +"bookoptions" : [ + "diagram", + "lilypond", + "pictures" + ], +"booktype" : "chorded", +"subtitle" : "english songs", +"title" : "Guitar Songbook", +"songs" : [ \ No newline at end of file diff --git a/utils/header-french b/utils/header-french new file mode 100644 index 0000000..cda63f2 --- /dev/null +++ b/utils/header-french @@ -0,0 +1,9 @@ +{ +"template" : "patacrep.tmpl", +"subtitle" : "chanson francaise", +"bookoptions" : [ + "diagram", + "lilypond", + "pictures" + ], +"songs" : [ diff --git a/utils/header-volume-3 b/utils/header-volume-3 new file mode 100644 index 0000000..839fdf6 --- /dev/null +++ b/utils/header-volume-3 @@ -0,0 +1,12 @@ +{ +"template" : "patacrep.tmpl", +"bookoptions" : [ + "diagram", + "lilypond", + "pictures" + ], +"booktype" : "chorded", +"picture" : "Mousey_Band_by_Duffzilla", +"picturecopyright" : "duffzilla @ deviantart.com", +"subtitle" : "Tome 3", +"songs" : [ diff --git a/utils/indent.sh b/utils/indent.sh new file mode 100755 index 0000000..0858472 --- /dev/null +++ b/utils/indent.sh @@ -0,0 +1,11 @@ +#!/bin/sh + +#Author: Romain Goffe +#Date: 27/10/2010 +#Descritpion: correctly indent all songs with emacs +#Commentary: can't manage to use a relative path to emacs-format-file.el +# so be sure to indicate the right path + +for song in songs/*/*.sg ; do + emacs -batch $song -l ~/songbook/utils/emacs-format-file.el -f emacs-format-function ; +done; diff --git a/utils/langbooks.sh b/utils/langbooks.sh new file mode 100755 index 0000000..8bbafe6 --- /dev/null +++ b/utils/langbooks.sh @@ -0,0 +1,22 @@ +#!/bin/sh + +#Author: Romain Goffe +#Date: 14/11/2010 +#Description: Generate an sb file containing all the songs in a given language + +if [ $# -ne 1 ]; +then + echo "Usage: $0 LANG" + exit 1 +fi; + +LANG=$1 + +if [ $LANG="english" -o $LANG="french" ]; +then + cp "./utils/header-$LANG" "$LANG.sb" + grep "selectlanguage{$LANG}" songs/*/*.sg | sed 's|songs/\(.*\):.*| \"\1\",|; $ s|,$|\n ]\n}\n|' >> "$LANG.sb" +else + echo "Error: $LANG is not a supported language" + exit 2 +fi; diff --git a/utils/language.sh b/utils/language.sh new file mode 100755 index 0000000..d512fb8 --- /dev/null +++ b/utils/language.sh @@ -0,0 +1,17 @@ +#!/bin/sh +echo "Choose langage: 1 (english), 2 (french), 3 (spanish)" +for song in songs/*/*.sg; do + echo "Apply language to $song ?" + read answer + case "$answer" in + 1) + sed -i '1i\\\\selectlanguage{english}' $song + ;; + 2) + sed -i '1i\\\\selectlanguage{french}' $song + ;; + 3) + sed -i '1i\\\\selectlanguage{spanish}' $song + ;; + esac +done; diff --git a/utils/latex-preprocessing.py b/utils/latex-preprocessing.py new file mode 100755 index 0000000..7a8eba3 --- /dev/null +++ b/utils/latex-preprocessing.py @@ -0,0 +1,75 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- + +# warning: lines beginning with ## are parsed by +# the songbook-client as rules categories + + +import glob + +# the dictionary has target_word:replacement_word pairs +word_dic = { +##: oe inclusion +"coeur": "cÅ“ur", +"boeuf": "bÅ“uf", +"oeuvre": "Å“uvre", +"soeur": "sÅ“ur", +"noeud": "nÅ“ud", +"oeil": "Å“il", +"voeu": "vÅ“u", +"oeuf": "Å“uf", +"oe{}": "Å“", +##: Contractions +"ptit": "p'tit", +##: Punctuation +"’": "'", +"Ca ": "Ça ", +"\\musicnote{Intro": "\\musicnote{intro", +"\\musicnote{Outro": "\\musicnote{outro", +"...": "\\dots ", +"…": "\\dots", +#replace tabs with two spaces +" ": " ", +##: Typo +"New-York": "New York", +" i ": " I ", +"avant hier": "avant-hier", +##: Conversion from anglo-saxon conventions +"\\[A": "\\[La", +"\\[B": "\\[Si", +"\\[C": "\\[Do", +"\\[D]": "\\[Ré]", +"\\[E": "\\[Mi", +"\\[F]": "\\[Fa]", +"\\[G": "\\[Sol", +##: Guitar tabs +"\\[Re]": "\\[Ré]", +"b]": "&]", +#Do +"032010": "X32010", +#La +"002220": "X02220", +"002020": "X02020", +"002210": "X02210", +#Ré +"000232": "XX0232", +"X00232": "XX0232", +"000212": "XX0212", +"000231": "XX0231", +"X00231": "XX0231", +#Si +"021202": "X21202", +### end of rules +} + +# Process song files +songfiles = glob.glob('songs/*/*.sg') +for filename in songfiles: + with open(filename, 'r+') as songfile: + data = songfile.read() + for search, replace in word_dic.items(): + data = data.replace(search, replace) + songfile.seek(0) + songfile.write(data) + songfile.truncate() + diff --git a/utils/make-html b/utils/make-html new file mode 100755 index 0000000..f21775d --- /dev/null +++ b/utils/make-html @@ -0,0 +1,119 @@ +#!/usr/bin/perl -w +# +# Generate html index for the Crep's chorbook. +# +# Usage: make-html [options] source +# source should be an .sg or .sbd file +# + +use warnings; +use strict; +use utf8; + +sub uppercase($) +{ + my $letter = shift; + $letter =~ tr/a-zàéèëê/A-ZAEEEE/; + return $letter; +} + +# Create the latex-proof function +sub latex2utf8($) +{ + my $result = shift; + + $result =~ s/\\'e/é/g; + $result =~ s/\\¨e/ë/g; + $result =~ s/\\`e/è/g; + $result =~ s/\\\^e/ê/g; + $result =~ s/\\\^o/ô/g; + $result =~ s/\\\^a/â/g; + $result =~ s/\\\^i/î/g; + $result =~ s/\\`a/à/g; + $result =~ s/\\`u/ù/g; + $result =~ s/\\&/&/g; + $result =~ s/\\oe\s*{}/oe/g; + + return ($result); +} +#' + +sub usage () +{ + die "usage: make-html [options] source", "\n"; +} + +sub defaultoptions() +{ + return ( + titleprefix => "", + ); +} + +my %options; +sub getoptions () +{ + %options = defaultoptions(); + eval q{use Getopt::Long}; + Getopt::Long::Configure('pass_through'); + GetOptions( +# "verbose|v!" => \$options{verbose}, + "titleprefix|p=s" => \$options{titleprefix}, + ) || usage(); +} + +getoptions(); + +my $prefix = '(('.$options{titleprefix}.')[\s\'])'; + +# Filter function +sub process_titleprefix($) +{ + my $string = shift; + if( $string =~ /^$prefix\W*(\w)/ ) + { + my $letter = uppercase $3; + $string =~ s/^$prefix\W*\w(.*)/$letter$3, $1/; + } + return $string; +} + +# Process command line +usage() unless @ARGV; +my $file = shift; + +# Open file and store date before closing the file +open( FILE, $file ) or die("unable to open $file"); + +# Process data +my %table; +my $author; +my $title; + +while( ) +{ + if( $_ =~ /\\beginsong{(.*)}\[.*by=(.*),.*\]/ ) + { + $author = latex2utf8 $2; + $title = latex2utf8 $1; + $title = process_titleprefix $title unless $options{titleprefix} eq ""; + # Create empty data index if needed + $table{$author} = [] unless exists $table{$author}; + push @{$table{$author}}, $title; + } +} + +close( FILE ); + +# Format output +print '
    '; +foreach my $author ( sort keys %table ) +{ + print '
  • ', $author, '
      '; + foreach my $title ( sort @{$table{$author}} ) + { + print '
    • ',$title,'
    • ' + } + print '
  • '; +} +print '
'; diff --git a/utils/new-songs-list.sh b/utils/new-songs-list.sh new file mode 100755 index 0000000..453a210 --- /dev/null +++ b/utils/new-songs-list.sh @@ -0,0 +1,15 @@ +#!/bin/sh +# +# Helper script to get the list of new songs added since the last version +# The output is supposed to be copy/pasted into the NEWS item. + +if [ $# -eq 1 ] +then + VERSION=$1 +else + # Get current version + VERSION=`git tag | tail -n1` +fi + +# Make new songs list by authors +git shortlog $VERSION..master | egrep '^([^ ].*|.*Add song.*)' | sed 's/Add song.*://' | sed 's/\.$//' | sed 's/ (.*)//' | sed 's/\s\s\s*/ /' diff --git a/utils/resize-cover.sh b/utils/resize-cover.sh new file mode 100755 index 0000000..d94e13d --- /dev/null +++ b/utils/resize-cover.sh @@ -0,0 +1,17 @@ +#!/bin/sh +# Resize image if needed + +for image in songs/*/*.jpg songs/*/*.png ; +do + SIZE=`identify $image | awk '{ print $3}' | sed 's/x/ /'`; + XSIZE=`echo $SIZE | awk '{ print $1}'`; + YSIZE=`echo $SIZE | awk '{ print $2}'`; + + if [ $((XSIZE)) -gt 128 ] + then + convert $image -resize 128x128 $image; + elif [ $((YSIZE)) -gt 128 ] + then + convert $image -resize 128x128 $image; + fi +done; \ No newline at end of file diff --git a/utils/songbook-gtab.py b/utils/songbook-gtab.py new file mode 100755 index 0000000..3a67355 --- /dev/null +++ b/utils/songbook-gtab.py @@ -0,0 +1,83 @@ +#!/usr/bin/python +# + +import sys +import glob +import re +from optparse import OptionParser + +# Pattern set to ignore latex command in title prefix +gtabPattern = re.compile(r"\\gtab\{(.*)\}\{(.*)\}"); + +def main(): + usage = "usage: %prog [options]" + parser = OptionParser(usage) + parser.add_option("-o", "--output", dest="filename", + help="write result into FILE", metavar="FILE") + (options, args) = parser.parse_args() + + # Options processing + if options.filename: + output = open(options.filename,"w") + else: + output = sys.stdout + + # Actual processing + chords = dict() + positions = dict() + + songfiles = glob.glob('songs/*/*.sg') + + for file in songfiles: + for line in open(file): + result = gtabPattern.match(line) + if result: + (chord,position) = result.groups() + if not chords.has_key(chord): + chords[chord] = set() + chords[chord].add(position) + if not positions.has_key(position): + positions[position] = set() + positions[position].add(chord) + + document = [ + '\\documentclass{article}', + '\\usepackage[chorded]{songs}', + '\\usepackage[utf8]{inputenc}', + '\\title{Accords}', + '\\author{Romain Goffe \\and Alexandre Dupas}', + '\\date{}', + '\\begin{document}', + '\\maketitle', + '\\begin{songs}{}', + ] + + document.append('\\section{Chords names}') + + chordskeys = chords.keys() + chordskeys.sort() + + for k in chordskeys: + document.append('\\subsection{'+k.replace('#','\\#').replace('&','\\&')+'}') + for p in chords[k]: + document.append('\\gtab{'+k+'}{'+p+'}') + + document.append('\\section{Chords names}') + + positionskeys = positions.keys() + positionskeys.sort() + + for k in positionskeys: + document.append('\\subsection{'+k+'}') + for p in positions[k]: + document.append('\\gtab{'+p+'}{'+k+'}') + + document.extend([ + '\\end{songs}', + '\\end{document}', + ]) + + output.write('\n'.join(document)) + +if __name__ == '__main__': + main() diff --git a/utils/typo.sh b/utils/typo.sh new file mode 100755 index 0000000..dd841e5 --- /dev/null +++ b/utils/typo.sh @@ -0,0 +1,41 @@ +#!/bin/sh +# +#Author: Romain Goffe and Alexandre Dupas +#Date: 27/10/2010 +#Description: fix typographic mistakes, some depending on language + +FILES=songs/*/*.sg + +if [ $# -gt 0 ] ; then + FILES=$@ +fi + +# remove trailing space and double space +sed -i \ + -e 's/\s*$//g' \ + -e 's/[,\.]$//g' \ + -e '/\s*%/! s/\([^ ]\)\s\+/\1 /g' \ + $FILES + +# formating rules depending on language +for song in $FILES; +do + if grep -q "selectlanguage{english}" $song + then + sed -i \ + -e 's/\s*?/?/g' \ + -e 's/\s*!/!/g' \ + -e 's/\s*:/:/g' \ + $song + elif grep -q "selectlanguage{french}" $song + then + sed -i \ + -e 's/\([^ ]\)?/\1 ?/g' \ + -e 's/\([^ ]\)!/\1 !/g' \ + -e 's/\([^ ]\)!/\1 !/g' \ + -e 's/``/{\\og}/g' \ + -e "s/''/{\\\\fg}/g" \ + -e '/\\gtab.*/ ! s/\([^ ]\):/\1 :/g' \ + $song + fi +done diff --git a/utils/volume-3.sh b/utils/volume-3.sh new file mode 100755 index 0000000..d1f07ab --- /dev/null +++ b/utils/volume-3.sh @@ -0,0 +1,40 @@ +#!/bin/sh +#Author: Romain Goffe +#Date: 07/05/2011 +#Description: Generate an sb file containing all the songs that are not +# already in volume-1 and volume-2 + +#all songs +cd songs +ls -1 */*.sg > ../res1 +cd .. + +#get volume 1 list +tail -n +12 volume-1.sb > tmp1 +head -n -2 tmp1 > list1 +sed -i -e "s/\",//g" -e "s/ \"//g" -e "s/\"//g" list1 + +#remove volume 1 songs +grep -vf list1 res1 > res2 + +#get volume 2 list +tail -n +13 volume-2.sb > tmp2 +head -n -2 tmp2 > list2 +sed -i -e "s/\",//g" -e "s/ \"//g" -e "s/\"//g" list2 + +#remove volume 2 songs +grep -vf list2 res2 > res3 + +#format song list +sed -i -e "s/^/ \"/g" -e "s/$/\",/g" res3 +head -c -2 res3 > res + + +#make volume 3 sb file +cat utils/header-volume-3 > volume-3.sb +cat res >> volume-3.sb +echo "]" >> volume-3.sb +echo "}" >> volume-3.sb + +#remove tmp files +rm -f res res1 res2 res3 list1 list2 tmp1 tmp2 diff --git a/woods/leprechaun.tex b/woods/leprechaun.tex deleted file mode 100644 index fd832c3..0000000 --- a/woods/leprechaun.tex +++ /dev/null @@ -1,72 +0,0 @@ -There's a Leprechaun in me head, and I wish that I were dead - -For I don't think he'll e'er let me be. - -Oh, he tempts me with his gold, and if I were e'er so bold, - -I'd strangle him and leave him in the street. - -\bigskip - -\textbf{Well, he says to me, "Ah, you're no Irish Laddie!} - -\textbf{And ye call that thing a harp?"} - -\textbf{But each time I share the lore that I am learning.} - -\textbf{He hides in shame while my friends they chant. } - -\textbf{La ta tee, da diddley dee, la ta tee ta tee da} - -\textbf{La ta tee, da diddley diddley dai} - -\textbf{La ta tee, da diddley dee, la ta tee ta tee da} - -\textbf{La ta tee, da diddley diddley dai} - -\bigskip - -There's a leprechaun in my room. He swats me with a broom. - -That's the reason I forget the words of this song. - -Well, he shows me a four-leaf clover, and before me song is over, - -It's buried in a bowl of Lucky Charms. - -\bigskip - -Ther'es a leprechaun on the floor, and he says that I'm a bore. - -He yawns aloud as I sing my song. - -He feigns one last breathe stolen, but I see his eyes are open. - -And he's watching me with envy deep inside. - -\bigskip - -There's a leprechaun on a hill, and his gold is buried there. - -So I grab him by the neck 'fore he gets away. - -The pot's too heavy, he giggles, so I pinch me just a little, - -And he thinks he's fooled me as I run away. - -%%%%%%%%%%%%%%%%%%%%%% A AJOUTER %%%%%%%%%%%%%%%%%%%%%% - -%KEY F - -%verse: -%D D G D -%D D D A -%D D G D -%D D D-A-D - -%chorus: -%G G G D -%G G G A -%D D G D -%D D D-A-D -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff --git a/woods/woods.tex b/woods/woods.tex deleted file mode 100644 index 61445e1..0000000 --- a/woods/woods.tex +++ /dev/null @@ -1,6 +0,0 @@ -\begin{song}{The Leprechaun}{?}{St Patrick's Day song}{Marc Gunn}{}{} -TODO : Chords - \input{woods/leprechaun.tex} -\end{song} - -\input{woods/weile.tex} \ No newline at end of file