# Chords & lyrics, songbook

I'd like to make something like a songbook - just chords and lyrics. I have found several packages, but I also wanted to improve my TeXing skills by making my own commands/environmnets etc. Now I am struggling with this: I want to put chords above certain parts of lyrics, for example.

Gm
Remember when you were young,

Gb                 Bb
You shone like the sun.

Eb   Dm   Cm   Bb    F
Shine on you crazy diamond.


But I don't want to do this manually for maybe hundreds of songs. I'm hoping for a better way than counting the space between each two chords, something like this:

% ... TeX code
Eb\hspace*{XYpt}Dm\hspace*{XYpt}Cm\hspace*{XYpt}Bb\hspace*{XYpt}F
Shine on you crazy diamond.
% .. TeX code


or:

% .. TeX code
Eb\verb=   =Dm\verb=   =Cm\verb=   =Bb\verb=    =F
Shine on you crazy diamond.
% .. TeX code


I would be happy to find solution that would look like:

% .. TeX code
\chord{Eb}Shine\chords{Dm} y\chord{Cm}ou cr\chord{Bb}azy di\chord{F}amond
% .. TeX code


Maybe it looks more "messy", bud I think the result would be more precise. And as soon as I will find the solution to this problem, I will write some script in C or Python to format the songs for me.

• do you still have your C or Python script for formatting the songs? In the end it would be most awesome to be able to input text files from ultimate-guitar.com, detect the chord positions and then placing them by a method like in one of the two answers below – riddleculous Mar 8 '16 at 18:16
• I did not finish the scripts before and started working on it again few days ago. I am not aiming for ultimate-guitar.com, but I like that idea quite a lot. If anything worth mentioning comes out from my work, I'll let you know. – quapka Apr 8 '16 at 9:54
• thanks! ultimate-guitar.com was an example, but similar input (monospace font where the chord position is decoded by the number of spaces) would be a great thing. Anyway, I'm interested about any outcome! – riddleculous Apr 8 '16 at 14:03
• I think, that with the assumption about monospace font (and decoding the position of chords based on number of white spaces) it would be quite easy. I don't know much about ultimate-guitar.com, this looks like monospace (at least Libre Writer interprets it that way). I am currently working on maybe worse scenario, where sample input looks like this: $Eb$Shine $Dm$on you$Cm$ cr$Bb$azy di$F$amond. So chords are enclosed in  signs (later parsed with regex \$\w+\$). – quapka Apr 8 '16 at 18:01

\documentclass{article}

\newcommand\chord[2][l]{%
\makebox[0pt][#1]{\begin{tabular}[b]{@{}l@{}}#2\\\mbox{}\end{tabular}}}

\begin{document}

\chord{Eb}Shine \chord[c]{Dm}on you\chord[r]{Cm} cr\chord{Bb}azy di\chord{F}amond

\end{document}

• Thanks, I think it precisely satisfies my need. I understand most of it, but could you next time explain some of your steps? Well, it's just lack of my knowledge about \makebox and \mbox. – quapka Dec 1 '13 at 11:32
• @quapka I could but you learn more from looking them up, given the hint of running code:-) – David Carlisle Dec 1 '13 at 11:34
• That's totally true, I'm probably just lazier today:) – quapka Dec 1 '13 at 11:36
• Come on you target for faraway laughter, come on you stranger, you legend, you martyr, and shine! – Paulo Cereda Dec 2 '13 at 9:13
• @David: \chord{Eb}Come on you target for \chord{C7}faraway laughter, \chord{Bb}come on you stranger, you \chord{Dm}legend, you \chord{D7}martyr, and \chord{Gm}shine! :) – Paulo Cereda Dec 2 '13 at 10:14

The code from my other answer was the beginning for my leadsheets package which is on CTAN and in TeX Live since January 2015 (and which I now use extensively myself).

\documentclass{article}

\definesongtitletemplate{empty}{}

\begin{document}

\begin{song}{title=Nobody Knows You When You're Down And Out}
\begin{verse}
^*{C}O nce I lived the ^{E7}life of a ^*{A7}mil lionaire \\
^{Dmi} Spent all my ^*{A7}mon ey, didn't ^{Dmi}have any cares \\
^{F}Took all my ^{F#dim}friends out for a ^*{C}migh ty good ^{A7}time \\
^{D7} Bought bootleg liquor, ^*{G7}cham pagne and wine
\end{verse}
\end{song}

title-template = empty ,
song-format = \ttfamily ,
chords/sharp = \# ,
chords/flat = b
}

\begin{song}{title=Nobody Knows You When You're Down And Out}
\begin{verse}
^*{C}O nce I lived the ^{E7}life of a ^*{A7}mil lionaire \\
^{Dmi} Spent all my ^*{A7}mon ey, didn't ^{Dmi}have any cares \\
^{F}Took all my ^{F#dim}friends out for a ^*{C}migh ty good ^{A7}time \\
^{D7} Bought bootleg liquor, ^*{G7}cham pagne and wine
\end{verse}
\end{song}

\end{document}


• skimming through the documentation your package seems like a strong competitor of the songs package that I mentioned, I'll need to try it out later. Do you know the songs package? If yes, could you list a few differences (where which package is stronger)? It's okay if you're biased ;-) – riddleculous Apr 16 '16 at 11:45
• @riddleculous I don't know the songs package very much but I believe that one of the biggest advantages of leadsheets is that the user has complete control over layout (through the template mechanism) – cgnieder Apr 17 '16 at 9:57
• The songs package is indeed very restricted in that aspect. Luckily the syntax for the chords is quite so I can test and compare both. I'll give you some feedback in case I notice anything that works better in the songs package (I guess that one is more suited for the creation of congregational song books which I intend to do, too) – riddleculous Apr 17 '16 at 10:43
• @riddleculous for what it's worth: I used leadsheets to create a few songbooks for my personal use already and use it extensively to create the leadsheets for my band. – cgnieder Apr 17 '16 at 10:50

There exists a package for this, too, an example can be found here, I steal an example from there:

\documentclass[letterpaper]{article}
\usepackage[chorded]{songs}
\newindex{titleidx}{cbtitle}

\begin{document}
\begin{songs}{titleidx}
\beginsong{Amazing Grace}[
by={John Newton},
sr={Luke 15:4; 2 Corinthians 4:8,9; Ephesians 2:8; Revelation 14:3},
cr={Public domain.}]
\beginverse
A\[E]mazing \[E/D#]grace! How \[A/C#]sweet the \[E/B]sound
That \[E]saved a \[E/C#]wretch like \[B7]me!
I \[E]once was \[E/D#]lost, but \[A/C#]now am \[E/B]found;
Was \[A]blind, but \[A/B]now I \[E]see.
\endverse
\beginverse
T'was ^grace that ^taught my ^heart to ^fear,
And ^grace my ^fears re^lieved;
How ^precious ^did that ^grace ap^pear
The ^hour I ^first be^lieved!
\endverse
\endsong
\end{songs}
\end{document}


you'll get the right image by replacing chorded in the package option by lyric.

Every now and then I create a lead sheet. For that purpose I created an environment Verse that enumerates its contents (it is an enumerate environment, really) and a command \chord with the following syntax:

\chord*{<chord symbol>}<text><space>


where the star and <text> are optional. The starred version gobbles the trailing space and the unstarred doesn't. If <text> is empty \quad is inserted for some horizontal space.

Below is the code I used. (The second example uses my realbookchords package for typesetting the chords and needs XeLaTeX or LuaLaTeX and of course the package and the font installed.)

% arara: xelatex
\documentclass{article}
\usepackage{fontspec}
\usepackage{realbookchords}
\newfontfamily\Augie[Ligatures=TeX]{Augie}

\makeatletter

% \chord*{<chord>}<word><space>
%  * gobbles following space
%  <chord> chord symbol specification
%  <word> chord is placed above this (optional)
%  <space> mandatory end of argument

\newcommand*\printchord[1]{#1}

\newif\if@chord@gobble
\newcommand*\chord{%
\@ifstar
{\@chord@gobbletrue\@chord}
{\@chord@gobblefalse\@chord}%
}
\newcommand*\@chord[1]{%
\@chord@aux{#1}%
}
\newcommand*\@chord@aux{}
\def\@chord@aux#1#2 #3{%
\if\relax\detokenize{#3}\relax
\else
\if@chord@gobble\else\space\fi
\fi
#3%
}
\if\relax\detokenize{#1}\relax
\else
\expandafter\@firstofone
\fi
{#1}%
}

\newcommand*\placeabove[2]{%
\begingroup
\begin{tabular}[b]{@{}c@{}}#1\\#2\end{tabular}%
\endgroup
}

% \begin{Verse}[<text>]
% if <text> is not present then the Verse is enumerated, else <text> is
% inserted as a label

\newcounter{Verse}
\renewcommand\theVerse{\arabic{Verse}.}
\newcommand*\Versefont{\normalfont}

% enumerated:
\newenvironment{Verse}[1][]
{%
\if\relax\detokenize{#1}\relax
\stepcounter{Verse}%
\enumerate\item[\theVerse]\relax
\else
\enumerate\item[{#1}]\relax
\fi
\par\Versefont
}
{\endenumerate}

% not enumerated:
\newenvironment{Verse*}[1][]
{%
\if\relax\detokenize{#1}\relax
\itemize\item[]\relax
\else
\itemize\item[{#1}]\relax
\fi
\par\Versefont
}
{\enditemize}
\makeatletter

\begin{document}

\begin{Verse*}
\chord*{C}O nce I lived the \chord{E7}life of a \chord*{A7}mil lionaire \\
\chord{Dmi} Spent all my \chord*{A7}mon ey, didn't \chord{Dmi}have any
cares \\
\chord{F}Took all my \chord{F\#dim}friends out for a \chord*{C}migh ty
good \chord{A7}time \\
\chord{D7} Bought bootleg liquor, \chord*{G7}cham pagne and wine
\end{Verse*}

\renewcommand*\printchord[1]{{\footnotesize\rbc{#1}}}
\renewcommand*\Versefont{\Augie}

\begin{Verse*}
\chord*{C}O nce I lived the \chord{E7}life of a \chord*{A7}mil lionaire \\
\chord{Dmi} Spent all my \chord*{A7}mon ey, didn't \chord{Dmi}have any
cares \\
\chord{F}Took all my \chord{F\s dim}friends out for a \chord*{C}migh ty
good \chord{A7}time \\
\chord{D7} Bought bootleg liquor, \chord*{G7}cham pagne and wine
\end{Verse*}

\renewcommand*\printchord[1]{\texttt{#1}}
\renewcommand*\Versefont{\ttfamily}

\begin{Verse*}
\chord*{C}O nce I lived the \chord{E7}life of a \chord*{A7}mil lionaire \\
\chord{Dmi} Spent all my \chord*{A7}mon ey, didn't \chord{Dmi}have any
cares \\
\chord{F}Took all my \chord{F\#dim}friends out for a \chord*{C}migh ty
good \chord{A7}time \\
\chord{D7} Bought bootleg liquor, \chord*{G7}cham pagne and wine
\end{Verse*}

\end{document}


Remark: the above is now implemented in a more general way in my leadsheets package…

• Pretty cool! Thanks. Momentarily I am working on the coding part, but I'll come back later and take a better look at you answer. – quapka Dec 1 '13 at 17:19
• No Pink Floyd? :) I'll let you pass this time because it's Clapton. :) – Paulo Cereda Dec 2 '13 at 9:15
• @PauloCereda lol :) It has a bigger variety of chords. But it's Jimmy Cox, actually: en.wikipedia.org/wiki/… – cgnieder Dec 2 '13 at 9:47
• @cgnieder: ooh! ❤ – Paulo Cereda Dec 2 '13 at 10:15
• @cgnieder Didn't know that, thanks. Also one of the songs i enjoy! – quapka Dec 2 '13 at 23:16

You can type your songs in both lyrics and chord template, http://patacrep.com/en/static1/downloads , its a gui software using latex