Engine for LaTeX songbooks http://www.patacrep.com
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

405 lines
9.8 KiB

% Songbook Package -- version 0.1 for LaTeX2e
%
% This package provides macro for automatic songbook
% generation. See http://github.com/patacrep/songbook-core/
\NeedsTeXFormat{LaTeX2e}[1994/06/01]
\ProvidesPackage{SongbookUtils}[2014/04/13 Songbook Package, version 0.1]
\RequirePackage{graphicx,xcolor} %
\RequirePackage{epstopdf} %
\RequirePackage{fancybox}
\RequirePackage{xstring}
\RequirePackage{framed}
\RequirePackage{currfile}
\RequirePackage{ifthen}
\RequirePackage{tikz}
% tabs: display the guitar tabs
\newif{\iftabs}
\DeclareOption{tabs}{\tabstrue}
% lilypond: display Lilypond music sheets
\newif{\iflilypond}
\DeclareOption{lilypond}{\lilypondtrue}
\newif{\iflilypondauto}
\DeclareOption{lilypond}{\lilypondautotrue\lilypondtrue}
% diagram: display chord diagrams at the beginning
\newif{\ifdiagram}
\DeclareOption{diagram}{\diagramtrue}
% importantdiagramonly: only display important chords
\newif{\ifimportantdiagramonly}
\DeclareOption{importantdiagramonly}{\importantdiagramonlytrue\diagramtrue}
% pictures: display song covers and songbook titlepage picture
\newif{\ifpictures}
\DeclareOption{pictures}{\picturestrue}
% repeatchords: display chords in every verse if the song allows it
\newif{\ifrepeatchords}
\DeclareOption{repeatchords}{\repeatchordstrue}
% onesongperpage: force single page for each song
\newif{\ifonesongperpage}
\DeclareOption{onesongperpage}{\onesongperpagetrue}
%%% Instruments
% ukulele: display ukulele tabs
\newif{\ifukulele}
\DeclareOption{ukulele}{\ukuleletrue}
% guitar: display guitar tabs
\newif{\ifguitar}
\DeclareOption{guitar}{\guitartrue}
% Remaining options are passed to the songs package
\DeclareOption*{\PassOptionsToPackage{\CurrentOption}{songs}}
\ProcessOptions\relax
\RequirePackage{songs} %
\iflyric
\tabsfalse %
\lilypondfalse%
\diagramfalse%
\picturesfalse%
\renewcommand{\colbotglue}{0pt plus .5\textheight minus 0pt}%
\fi
% Patch for Debian TeXLive 2012
% A bug may produce corrupted PDF
\pdfobjcompresslevel=0
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Multilanguage management
\def\lang#1{\def\mainlanguage{#1}}
\AtBeginDocument{
% Default names (english)
\def\songlistname{Songs list}
\def\originalsongname{Original song:}
\def\introname{intro}
\def\outroname{outro}
\def\bridgename{bridge}
\def\chorusname{chorus}
\def\versename{verse}
\def\soloname{solo}
\def\patternname{pattern}
\def\rythmname{rythm}
\def\transpositionname{transposition:}
\def\songindexname{Songs Index}
\def\authorindexname{Authors Index}
\def\chordlistname{Chords list}
\IfStrEq{\mainlanguage}{french}{
% French names
\def\songlistname{Liste des chansons}
\def\originalsongname{Chanson originale :}
\def\introname{intro}
\def\outroname{outro}
\def\bridgename{pont}
\def\chorusname{refrain}
\def\versename{couplet}
\def\soloname{solo}
\def\patternname{motif}
\def\rythmname{rythme}
\def\transpositionname{transposition :}
\def\songindexname{Index des chansons}
\def\authorindexname{Index des auteurs}
\def\chordlistname{Liste des accords}
}{}
}
\def\andname{and}
\def\lastandname{\unskip, and}
% End of multilanguage management
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Add some informations to the songs
\newlength{\coverheight}
\setlength{\coverheight}{2cm}
\newlength{\coverspace}
\setlength{\coverspace}{0.1cm}
\newcommand{\songcover}{}
\newcommand{\songalbum}{}
\newsongkey{cov}{\let\songcover\@empty}{\def\songcover{\currfiledir#1}}
\newsongkey{vcov}{\let\songcover\@empty}{\def\songcover{#1}}
\newsongkey{album}{\let\songalbum\@empty}{\def\songalbum{#1}}
\newsongkey{url}{\let\songurl\@empty}{\def\songurl{#1}}
\newsongkey{original}{\let\songoriginal\@empty}{\def\songoriginal{#1}}
% Insert cover pictures
\newcommand\cover{%
\ifpictures%
\ifx\songcover\@empty\else%
\mbox{%
\includegraphics[width=\coverheight]{\songcover}%
\hspace{\coverspace}%
}%
\fi%
\fi%
}
% display album in song header
\renewcommand{\extendprelude}{
{\bfseries\showauthors}
{\footnotesize\it\songalbum}
\IfStrEq{\songurl}{}{}{
\href{\songurl}{\includegraphics[width=.3cm]{internet}}
}
}
% display original song name in the postlude
\renewcommand{\extendpostlude}{
{\footnotesize%
\IfStrEq{\songoriginal}{}{}{
\originalsongname
\songoriginal
}
}
}
\let\utab\gtab
\let\utab@Original\utab
\newcommand{\utab@Hidden}[2]{}%
\let\gtab@Original\gtab
\newcommand{\gtab@Hidden}[2]{}%
\ifdiagram%
\ifimportantdiagramonly%
\renewcommand{\gtab}{\@ifstar
\gtab@Original%
\gtab@Hidden%
}
\renewcommand{\utab}{\@ifstar
\utab@Original%
\utab@Hidden%
}
\else%
\renewcommand{\gtab}{\@ifstar
\gtab@Original%
\gtab@Original%
}
\renewcommand{\utab}{\@ifstar
\utab@Original%
\utab@Original%
}
\fi%
\else%
\renewcommand{\gtab}{\@ifstar
\gtab@Hidden%
\gtab@Hidden%
}
\renewcommand{\utab}{\@ifstar
\utab@Hidden%
\utab@Hidden%
}
\fi%
\ifguitar%
\else
\renewcommand{\gtab}{\@ifstar
\gtab@Hidden%
\gtab@Hidden%
}
\fi%
\ifukulele%
\else
\renewcommand{\utab}{\@ifstar
\utab@Hidden%
\utab@Hidden%
}
\fi%
% End of the new informations
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Lilypond
% On-the-fly compilation of lilypond files
\iflilypondauto
\def\HSizeInPT{\strip@pt\hsize\space pt}
\epstopdfDeclareGraphicsRule{.ly}{pdf}{.pdf}{%
lilypond -e "(set! paper-alist (cons '(\@backslashchar"patasize\@backslashchar" . %
(cons (* \HSizeInPT) (* 1 cm) )) paper-alist))" %
-dpaper-size=\@backslashchar"patasize\@backslashchar" %
--format=pdf --output=\Gin@base\ETE@suffix\space %
#1 }
\AppendGraphicsExtensions{.ly}
\fi
% Conditional inclusion of lilypond sheet music.
\newcommand{\lilypond}[1]{%
\iflilypond%
\includegraphics{\currfiledir#1}%
\fi%
}
\newcommand{\vlilypond}[1]{%
\iflilypond%
\includegraphics{#1}%
\fi%
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Useful commands
\newcommand{\image}[2][]{%
\ifpictures%
\begin{flushright}%
\includegraphics[#1]{#2}%
\end{flushright}%
\fi%
}
\newcommand*{\Intro}{%
\introname%
}%
\newcommand*{\Outro}{%
\outroname%
}%
\newcommand*{\Bridge}{%
\bridgename%
}%
\newcommand*{\Chorus}{%
\chorusname%
}%
\newcommand*{\Verse}{%
\versename%
}%
\newcommand*{\Solo}{%
\soloname%
}%
\newcommand*{\Pattern}{%
\patternname%
}%
\newcommand*{\Rythm}{%
\rythmname%
}%
\newcommand*{\Adlib}{%
\emph{ad~lib.}%
}%
% Use a new framed command for bridges
\renewcommand{\FrameCommand}[1]{
\begin{tikzpicture}
\node[rectangle] (rect) {
\begin{minipage}{.8\textwidth}
#1
\end{minipage}
};
\draw[very thick, dashed] (rect.north west) -- (rect.south west);
\end{tikzpicture}
}
\newenvironment{bridge}
{%
\begin{framed}
\vspace{-.4cm}
\begin{verse*}
}
{%
\end{verse*}
\vspace{-.2cm}
\end{framed}
}
%% \SB@chordsoff with a greater for the line spacing
\newcommand{\CB@chordshidden}{%
\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@\@plus.5\textheight}\fi%
\SB@setbaselineskip%
}
\newenvironment{repeatedchords}{%
\ifrepeatchords%
\else%
\CB@chordshidden%
\fi
}{}%
\def\removefirstch@r#1{}
\newcommand{\transposition}[1]{%
\ifrepeatchords%
\transpose{#1}
\else%
\musicnote{%
\transpositionname~
\ifthenelse{#1>0}{#1$\Uparrow$}{\removefirstch@r#1$\Downarrow$}%
}%
\fi%
}%
% Definition of environment "tab"
\iftabs
\RequirePackage{tabs}
\else
\RequirePackage{verbatim}
\newenvironment{tab}{\comment}{\endcomment}
\fi
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% One song per page?
\ifonesongperpage%
\renewcommand\songcolumns[1]{%
\SB@cnt#1\relax%
\ifSB@preamble\else{\SB@clearpage}\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%
}
\fi
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Enhance \textnote and \musicnote, to display them according to the current language.
\let\@textnoteold\textnote
\renewcommand{\textnote}[2][]{%
\vspace{.1cm}
\IfStrEq{}{#1}{\@textnoteold{#2}}{
\iflanguage{#1}{\@textnoteold{#2}}{}
}
}
\let\@musicnoteold\musicnote
\renewcommand{\musicnote}[2][]{%
\vspace{.1cm}
\IfStrEq{}{#1}{\@musicnoteold{#2}}{
\iflanguage{#1}{\@musicnoteold{#2}}{}
}
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\endinput