From e0c6872cf40896c7be36b11dcc744620f10adf1d Mon Sep 17 00:00:00 2001 From: Norbert Preining Date: Mon, 2 Sep 2019 13:46:59 +0900 Subject: Initial commit --- macros/latex/contrib/guitar/README | 10 + macros/latex/contrib/guitar/guitar.dtx | 1366 ++++++++++++++++++++++++++++++++ macros/latex/contrib/guitar/guitar.ins | 21 + macros/latex/contrib/guitar/guitar.pdf | Bin 0 -> 102828 bytes 4 files changed, 1397 insertions(+) create mode 100644 macros/latex/contrib/guitar/README create mode 100644 macros/latex/contrib/guitar/guitar.dtx create mode 100644 macros/latex/contrib/guitar/guitar.ins create mode 100644 macros/latex/contrib/guitar/guitar.pdf (limited to 'macros/latex/contrib/guitar') diff --git a/macros/latex/contrib/guitar/README b/macros/latex/contrib/guitar/README new file mode 100644 index 0000000000..4fc85743a6 --- /dev/null +++ b/macros/latex/contrib/guitar/README @@ -0,0 +1,10 @@ +guitar - (La)TeX macros for typesetting guitar chords over song texts. +The toolbox package is required. +Note that this package only places arbitrary TeX code over the lyrics. +To typeset the chords graphically (and not only by name), +use an additional package such as gchords by K. Peeters. + +Author: M. V\"ath martin@mvath.de + +The package may be distributed and/or modified under the conditions of +the LaTeX Project Public License (version 1.3c or later). diff --git a/macros/latex/contrib/guitar/guitar.dtx b/macros/latex/contrib/guitar/guitar.dtx new file mode 100644 index 0000000000..6a1c355fe0 --- /dev/null +++ b/macros/latex/contrib/guitar/guitar.dtx @@ -0,0 +1,1366 @@ +% \def\fileversion{1.6}\def\filedate{2009/03/17}\def\docdate{2013/11/26} +%\iffalse These lines are necessary for the doc and docstrip utilities +%<*asciidocu> + +%%# +%%# Author and copyright 2001,2009,2013: +%%# +%%# M. V\"ath martin@mvath.de +%%# +%%# The author thanks +%%# Donald Arseneau +%%# Dan Luecking +%%# Heiko Oberdiek +%%# and a colleague who does not want to be named here. + +%%# The package may be distributed and/or modified under the conditions of +%%# the LaTeX Project Public License (version 1.3c or later). + +%%############################################################################# +%%# +%%# guitar.sty - typesetting guitar chords over song texts. +%%# +%%############################################################################# + +%%# +%%# This package should run with plain TeX, LaTeX 2.09, and LaTeX 2e. +%%# Actually, it should run with all TeX formats. +%%# + +%%# This is not the only package available for typesetting guitar songs. +%%# The following packages are also available (and possibly also others: +%%# I do not claim that this list is complete). +%%# +%%# 1. gchords.sty http://www.damtp.cam.ac.uk/user/kp229/gchords/ +%%# 2. songbook.sty http://www.rath.ca/Misc/Songbook/ +%%# or on CTAN: macros/latex/contrib/supported/songbook/ +%%# 3. guitarTeX (which is not a `pure' (La)TeX solution): +%%# http://rz-home.de/~jmiltz/guitartex/ +%%# +%%# The packages 1. and 2. have somewhat different intentions. +%%# It should be possible to combine them with the current package +%%# without any severe problems. + +% If you have access to (reasonable new) docstrip TeXfiles, you should run +% tex/latex on the file +% `guitar.ins' +% to produce the files `guitar.sty', `guitar.txt' and `guitar.tex'. +% (In case `guitar.ins' is lost: You can find its content in the last +% few lines of the file you are currently reading between the +% lines %<*insfile> and %; +% BTW: You should name this file here `guitar.dtx' before you run tex +% on guitar.ins). +% +% The file `guitar.txt' contains a `brief' (but complete) ascii +% documentation. If you have additionally access to LaTeX 2e, you may run +% latex on the generated file `guitar.tex' to produce `guitar.dvi' which +% contains a more luxury documentation. +% +% If you do not have access to the docstrip TeXfiles you may simply +% copy/rename this file here into +% `guitar.sty' +% to use the package and read the ascii documentation in this file. +% The ascii documentation (the content of `guitar.txt') consists of all +% lines in this file which start with %%# (this is the above block and another +% (very large) block which follows soon). +% +% But I do not recommended this, because TeX will need more time to read this +% longer file, and because there might be a (very slight) incompatibility if +% you use it (namely if you load `guitar.sty' with some *extremely* strange +% catcodes). +% I recommend in this case instead to generate the file `guitar.sty' as +% anything between the lines %<*package> and % by hand. +% (This is not precisely the file which you get with the docstrip TeXfiles, +% but a reasonable good substitute. To speed up loading, you may also +% eliminate all lines starting with `% ' in `guitar.sty'). +% For your information: The file `guitar.tex' produced by the docstrip +% TeXfiles is anything between the lines %<*driver> and % +% (with a line containing \endinput and two comment lines appended) +% +% +% In any case, you end up with the file `guitar.sty'. +% +% If you can generate `guitar.tex', you will probably want to stop +% reading now and instead read the `luxury' documentation in `guitar.dvi'. +% +% Otherwise, you have to make due with the following ascii documentation. +% +% +% \fi\catcode\#14\relax\iffalse (This line is needed for the doc utility) +% + +%%# To use guitar, you have to put `guitar.sty' in a path where TeX looks +%%# for its input files. The TeX documents using guitar need the +%%# following modifications in their header: +%%# +%%# a) If you use LaTeX2.09, use guitar as a style option, e.g. +%%# \documentstyle[guitar]{article} +%%# or +%%# \documentstyle[guitar,12pt]{article} +%%# b) If you use LaTeX2e, put in the preamble the command +%%# \usepackage{guitar} +%%# c) If you use some other (non-LaTeX) format, you will probably have to +%%# insert a line like +%%# \catcode`\@=11\input guitar.sty\catcode`\@=12\relax +%%# +%%# For TeX-insiders: +%%# The only LaTeX-specific commands used in `guitar.sty' are: +%%# +%%# \newenvironment +%%# \newcommand (only in the form \newcommand{\command}{} to ensure that +%%# \command was not defined before) +%%# \newsavebox +%%# \newlength +%%# \RequirePackage +%%# \ProvidesPackage +%%# \typeout +%%# +%%# The above commands are used only if they are defined +%%# (otherwise, the plainTeX are used). +%%# + +%%# +%%# Usage: +%%# + +%%# The general usage is very simple: +%%# +%%# \guitarChord{Bb}Really. \guitarChord{G#}Oh yes. +%%# +%%# This puts the chord "B flat" and "G sharp" over the "R" resp. "O". +%%# (in the chord, "b" and "#" always translate into "flat" resp. "sharp"). +%%# When you switch into "magic" mode, you can even use [...] instead of +%%# \guitarChord{...}. +%%# E.g., in LaTeX, you can just write +%%# +%%# \begin{guitar} +%%# [Cm]This [Bb]is a [G#]very [Gm]simple song. +%%# You can still use any [\TeX]macros in the chord text. +%%# Actually, each accord reads a second argument over +%%# which it is [A]{centered}. +%%# By default, the linefeeds in the source lead to linebreaks % +%%# in the output, unless you put a percentage sign at the end of the line. % +%%# If a single line gets too long, the wrapped lines are right-aligned. +%%# To force the wrapping use \verb|\newline|\newline like here. +%%# To stretch the first line, use \verb|\linebreak|\linebreak like here. +%%# +%%# Two subsequent linefeeds in the source start a new verse. +%%# +%%# +%%# Three or more subsequent linefeeds in the source start a new verse with a % +%%# slightly larger space. +%%# +%%# Unfortunately, if the chords get too long, they may [Ebm+7]o[G#]verlap. +%%# To avoid this, the following solutions are supported: +%%# +%%# 1. If the token after your chord is a space, like in "[Ebm+7] space", +%%# this space is stretched. +%%# Note that this is different from the notation "[Ebm+7]{ }space". +%%# 2. Inside words, put a _ at the end like for [Ebm+7_]O[G#]K. +%%# 3. Outside words, put a | at the end like for [Ebm+7|]{OK}[G#|]. +%%# If the chord is short enough (compared to its argument) then the symbols +%%# | and _ do not harm like in [E|]{long} or [E_]{long}er. +%%# +%%# You may (and in plainTeX you must) replace "\begin{guitar}" and +%%# "\end{guitar}" by "\guitarOn" and "\guitarOff", respectively. +%%# +%%# If you only want to put the guitar chords as above but do not like the +%%# feature concerning the linefeeds, you can use the environment +%%# \begin{guitarMagic} +%%# \end{guitarMagic} +%%# or the respective commands \guitarMagicOn and \guitarMagicOff. +%%# Similarly, you can also use only the linefeed feature by the environment +%%# \begin{guitarCr} +%%# \end{guitarCr} +%%# or the respective commands \guitarCrOn and \guitarCrOff. +%%# +%%# As a matter of fact, you can also e.g. use \guitarCrOff *within* a +%%# {guitar} environment, but then you have to use \guitarCrOn before you +%%# end the environment to have a proper nesting of modes. +%%# + +%%# +%%# Customization +%%# + +%%# The output of the "#" and "b" tokens in the chords is generated by the two +%%# commands +%%# +%%# \guitarSharp +%%# \guitarFlat +%%# +%%# Thus, for, example the customization +%%# +%%# \def\guitarSharp{$^{\sharp}$} +%%# +%%# will make the sharp symbol be written as an upper index. + +%%# In a similar way, the macros +%%# +%%# \guitarEndLine +%%# \guitarEndPar +%%# \guitarEndDoublePar +%%# +%%# are expanded when the song text contains one, two, or three (or more) +%%# linefeeds.\par + +%%# After the macro +%%# +%%# \guitarNoChord +%%# +%%# has been used, no chords are output anymore. You can make the effect +%%# local by putting this command in a group. (\guitarNoChord redefines the +%%# macros which are responsible for the actual output of the chords - see the +%%# description at the end). +%%# +%%# The command +%%# +%%# \guitarPreAccord +%%# +%%# is expanded before the actual chord is typeset: You can change this +%%# definition to e.g. modify the font used for the chord. By default, this +%%# command contains a \strut which ensures that the lines with chords +%%# usually all have the same height. +%%# The macro \guitarPreAccord may also use and modify the macro +%%# +%%# \guitarAccord +%%# +%%# which contains the actual chord which is then output (you may use this +%%# feature to e.g. calculate a modulation in \guitarPreAccord or to +%%# replace the text of \guitarAccord by some graphic equivalent). +%%# +%%# It is guaranteed that the macros \guitarPreAccord and \guitarAccord +%%# are expanded precisely once. +%%# In contrast, it might happen that the argument of the chord (i.e. the +%%# text over which the chord is put) is expanded twice. +%%# (The doubled expansion could have been avoided, but the price were that +%%# in some cases the TeX kerning mechanism would then fail if the argument +%%# is a syllable of some word which is continued afterwards). +%%# +%%# Whenever the "guitar" mode or the "linefeed" mode is turned +%%# on or off, the corresponding macro +%%# +%%# \guitarMagicOnHook +%%# \guitarMagicOffHook +%%# \guitarCrOnHook +%%# \guitarCrOffHook +%%# +%%# is expanded (for switching on, the macro is expanded even before the +%%# necessary catcode changes are done, and for switching off, the macro +%%# is expanded after the catcodes have been restored). +%%# In the current defaults, a group is opened and closed in +%%# \guitarCrOnHook and \guitarCrOffHook: This is the reason why these +%%# commands must be properly nested. +%%# (The reason for this group is that"\parindent should be changed locally). +%%# +%%# In the current implementation, TeX forgets everything following the magic +%%# tokens "|" and "_" in the chord (because these symbols are intended to be +%%# the last one in the chord). If you want to use these tokens within a chord: +%%# They loose their magic meaning if they occur in a braced context +%%# (i.e. between { and }). If you regularly have to use these tokens within +%%# chords, you can change the default choice of this tokens by the respective +%%# commands +%%# +%%# \toolboxMakeSplit{token}{guitarSplitDist} +%%# \toolboxMakeSplit{token}{guitarSplitMerge} +%%# +%%# (See the "toolbox" package for details of the command \toolboxMakeSplit +%%# used here). +%%# It should be pointed out that {token} may actually be a *sequence* +%%# of tokens, so that for the `magic tokens' "|" and "_" you may instead use +%%# whole phrases if you prefer. +%%# +%%# Some fine tuning of the spacing can be done by redefining +%%# +%%# \guitarCalcDim +%%# +%%# When this macro is called, the skip register +%%# +%%# \guitarDim +%%# +%%# contains the width of the chord which should be put over the text. +%%# After \guitarCalcDim has been expanded, it is ensured that at least +%%# \guitarDim (horizontal) space is reserved for the chord. Thus, if +%%# \guitarCalcDim increases e.g. \guitarDim by 2pt (which is the +%%# default behavior of \guitarCalcDim), then 2pt more space is reserved +%%# for the chord than its actual size: This ensures that two subsequent +%%# chords are always separated by some space. +%%# +%%# Finally, you can modify the macros which do the actual setting of the +%%# chords: This setting is done by the commands +%%# +%%# \guitarPut +%%# \guitarPutOnSpace +%%# \guitarPutDist +%%# \guitarPutMerge +%%# +%%# which with the exception of \guitarPutOnSpace all expect one argument +%%# (namely the text on which they should be put). The command +%%# \guitarPutOnSpace is called, if a space followed the chord argument. +%%# Similarly, \guitarPutDist and \guitarPutMerge are called if the chord +%%# argument ended with the magic symbol "|" respectively "_". +%%# Before one of the above four macros is called, the chord text is stored in +%%# the macro \guitarAccord (and has not been expanded to this time); also the +%%# argument has not been expanded to this time. The above four macros are also +%%# responsible for the appropriate expansion (also of the expansion of the +%%# macros \guitarCalcDim and \guitarPreAccord, if +%%# the latter should still keep their meaning). +%%# The above four macros may freely use the skip register \guitarDim and the +%%# box register \guitarBox (which are both not used or +%%# modified by the other macros of this package). +%%# + +%%# +%%# Possible Problems: +%%# + +%%# The special treatment of [ # b and linefeed is implemented by a changing of +%%# catcodes. This may cause essentially two sorts of problems: +%%# +%%# 1. In some cases, you will want to avoid the automatic replacement of '#' +%%# and 'b'. For example, in [\textbf{F#}] or in \guitarChord{\textbf{F#}} +%%# the "b" of "\textbf" gets replaced which is of course not what you want. +%%# To avoid this replacement, there is a * version of the respective +%%# commands, i.e. the above example works in the intended way if you write +%%# instead [*\textbf{F\guitarSharp}] or +%%# \guitarChord*{\textbf{F\guitarSharp}} +%%# (you have to use the command "\guitarSharp", because due to the * also +%%# the # would not be replaced). +%%# +%%# 2. There are some situations in which catcodes are set too early, +%%# e.g. if you use the macros within the argument of certain macros. +%%# In this case, these symbols keep their usual \TeX\ meaning +%%# (which may either lead to an error in case of "#" (and sometimes "[") or +%%# just to a false output). If this happens to you, you have to replace at +%%# the corresponding place the above one-symbol shortcuts by their longer +%%# macro equivalents. In other words: You might have to replace in +%%# certain special situations some occurrences of the symbols according to +%%# the following table: +%%# +%%# [...] -> \guitarChord{...} +%%# # -> \guitarSharp +%%# b -> \guitarFlat +%%# linefeed -> \guitarEndLine +%%# 2 linefeeds -> \guitarEndPar +%%# 3+ linefeeds -> \guitarEndDoublePar +%%# + + +% This is the end of the ascii documentation +% +%\fi\catcode\#6\relax +% +% \iffalse +%<*metainfo> +% \fi + +% \def\basename{guitar} + +%% \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 \~} + +% \CheckSum{532} + +% \iffalse +% \RecordChanges +% \fi +% \def\mypar{} +% \def\ChangesTab{}\let\orichanges\changes +% \def\changes#1#2#3{\orichanges{#1}{#2}{#3} +% \expandafter\def\expandafter\ChangesTab\expandafter{\ChangesTab +% \item[v#1 {\mdseries(\emph{#2})}] {#3.}}} +% \newcommand{\cmdcite}[1]{\texttt{\textbackslash#1}} +% \newcommand{\filecite}[1]{\texttt{#1}} +% +% \changes{1.6}{2013/11/26}{Update email, clarify license. Date/version remains the +% same since only commments and documentation are modified} +% \changes{1.6}{2009/03/17}{Do not redefine commands on new catcodes globally. +% Instead save and restore the original definition when changing catcodes. +% Thanks to Heiko Oberdiek for pointing out this bug} +% \changes{1.5}{2001/08/27}{Included references to other packages in +% documentation; slightly modified the \cmdcite{typeout} of the package name} +% \changes{1.4}{2001/08/27}{Introduced \texttt{*} versions to avoid changing +% of catcodes in special situation} +% \changes{1.3}{2001/08/24}{Improved technique of right-alignment thanks to +% valuable hints of Donald Arseneau \texttt{}. Introduced +% \cmdcite{\guitarFirstLeft} and made \cmdcite{guitarFirstFlush} the default} +% \changes{1.2}{2001/08/21}{Right-alignment of broken lines. Added remarks +% about catcode-changes in the documentation} +% \changes{1.1}{2001/08/19}{First release} +% +% \iffalse +% +% The following part is the code needed to compile the documentation. +% We do some trickery here, because we want that this file here could be used +% for *both*: Compiling the documentation *and* as `guitar.sty' +% (if really required). +% Everything between the lines %<*driver> and % +% goes to the file `guitar.tex'. +% +% \fi +\ifcat @a% If this test is positive, then `@' has letter catcode which means +% that this file is loaded as a style file (or as described in the +% install section of the documentation). +\def\TemporaryDummy{} +\else\long\def\TemporaryDummy{% +% +% +% \iffalse +% +%<*driver> +\documentclass{ltxdoc} +\usepackage{guitar} +\OnlyDescription%% Comment this out, or +%%\AlsoImplementation%% uncomment this line, if you want to see the source. + +%% If you want an index, uncomment one of the following lines. +%% After running latex a first time, you have to use +%% makeindex -s gind.ist guitar +%% Then run latex again. +%%\CodelineIndex% comment this out if you want an index referring to codelines +%%\PageIndex% comment this out if you want an index referring to pages +%%\OldMakeindex% uncomment this line, if your MakeIndex is pre-v2.9 + +\setlength\hfuzz{15pt} +\hbadness=7000 +\begin{document} +\DocInput{guitar.dtx} +\end{document} +% +%<*metainfo> +% \fi +} +\fi\TemporaryDummy\let\TemporaryDummy\undefined +% +% \iffalse +% Personal macros used for the doc utility: +% \fi +% \MakeShortVerb{"} +% \def\bracemeta#1{\texttt{\{}\meta{#1}\texttt{\}}} +% \def\cmdmeta{\textbackslash\meta} +% \def\nocomment{} +% \def\myspace{\texttt{\textvisiblespace}} +% \toolboxMakeSplit{/}{guitarSplitDist} + +% \title{The \texttt{guitar} package\thanks +% {This package has version number \fileversion, last revised \filedate. +% The package may be distributed and/or modified under the conditions of the +% LaTeX Project Public License, either version 1.3c of this license or (at +% your option) any later version. The latest version of this license is in +% \texttt{http://www.latex-project.org/lppl.txt}, and version 1.3c or later +% is part of all distributions of LaTeX version 2005/12/01 or later.}} +% \author{Martin V\"ath\relax +%\thanks{\texttt{martin@mvath.de}} +%{}\thanks{The author thanks +% Donald Arseneau \texttt{}, +% Dan Luecking \texttt{}, +% and a colleague who does not want to be named here.}} +% \date{\docdate} +% \maketitle + +% \begin{abstract} +% This package allows you to typeset guitar chords over song texts. +% This package requires the \filecite{toolbox} package. +% To typeset graphical chords, you need an additional package like e.g.\ +% \filecite{gchords.sty}, available from +% \texttt{http://www.damtp.cam.ac.uk/user/kp229/gchords/} +% \end{abstract} + +% This is not the only package available for typesetting guitar songs. +% The following packages are also available (and possibly also others: +% I do not claim that this list is complete). +% \begin{enumerate} +% \item \filecite{gchords.sty}; +% \texttt{http://www.damtp.cam.ac.uk/user/kp229/gchords/} +% \item \filecite{songbook.sty}; +% \texttt{http://www.rath.ca/Misc/Songbook/}\newline +% (or on CTAN: \texttt{macros/latex/contrib/supported/songbook/}) +% \item guitar\TeX\ (which is not a `pure' (La)\TeX solution):\newline +% \texttt{http://rz-home.de/\~{ }jmiltz/guitartex/} +% \end{enumerate} +% The packages 1.\ and 2.\ have somewhat different intentions. +% It should be possible to combine them with the current package +% without any severe problems. + +% \tableofcontents + +% +% \section{Changes} +% +% \begin{description} +% \def\mypar{\par}\ChangesTab +% \end{description} +% +% +% \section{Installation} +% +% This package should run with plain \TeX, \LaTeX 2.09, and \LaTeXe. +% Actually, it should actually run with all \TeX\ formats. + +% To use \filecite{guitar}, you have to put the file \filecite{guitar.sty} +% in a path where \TeX\ looks for its input files. The \TeX\ documents using +% \filecite{guitar} need the following modifications in their header: +% +% \begin{itemize} +% \item If you use \LaTeXe, put in the preamble the command +% \begin{verbatim} +% \usepackage{guitar}\end{verbatim} +% +% \item If you use \LaTeX 2.09, use "guitar" as a style option, e.g.\ +% \begin{verbatim} +% \documentstyle[guitar]{article}\end{verbatim} +% or +% \begin{verbatim} +% \documentstyle[guitar,12pt]{article}\end{verbatim} +% +% \item If you use some other (non-\LaTeX) format, you will probably have to +% insert a line like +% \begin{verbatim} +% \catcode`\@=11\input guitar.sty\catcode`\@=12\relax\end{verbatim} +% +% \end{itemize} +% +% For \TeX-insiders: +% The only \LaTeX-specific commands used in "guitar.sty" are: +% +% \begin{itemize} +% \item "\newenvironment" +% \item "\newcommand" (used only in the form "\newcommand{"\meta{command}"}{}" +% to ensure that \meta{command} was not defined before) +% \item "\newsavebox" +% \item "\newlength" +% \item "\RequirePackage" +% \item "\ProvidesPackage" +% \item "\typeout" +% \end{itemize} +% The above commands are used only if they are defined +% (otherwise, the plain\TeX\ substitutes are used). +% +% \section{Example and Usage} +% +% The general usage is very simple: +% \DescribeMacro{\guitarChord}\begin{verbatim} +% \guitarChord{Bb}Really. \guitarChord{G#}Oh yes.\end{verbatim} +% produces the output +% \begin{quote} +% \guitarChord{Bb}Really. \guitarChord{G#}Oh yes. +% \end{quote} +% (in the chord, "b" and "#" always translate into $\flat$ resp. $\sharp$). +% When you switch into ``magic'' mode, you can even use "[...]" instead of +% "\guitarChord{...}". +% E.g., in \LaTeX, you can just write +% \DescribeEnv{guitar}\begin{verbatim} +%\begin{guitar} +%[Cm]This [Bb]is a [G#]very [Gm]simple song. +%You can still use any [\TeX]macros in the chord text. +%Actually, each accord reads a second argument over which it is [A]{centered}. +%By default, the linefeeds in the source lead to linebreaks % +%in the output, unless you put a percentage sign at the end of the line. % +%If a single line gets too long, the wrapped lines are right-aligned. +%To force the wrapping use \verb|\newline|\newline like here. +%To stretch the first line, use \verb|\linebreak|\linebreak like here. +% +%Two subsequent linefeeds in the source start a new verse. +% +% +%Three or more subsequent linefeeds in the source start a new verse with a % +%slightly larger space on top. +%\end{guitar}\end{verbatim} +% This will produce the output +% \begin{quote} +% \begin{guitar} +% [Cm]This [Bb]is a [G#]very [Gm]simple song. +% You can still use any [\TeX]macros in the chord text. +% Actually, each accord reads a second argument over which it is ^^A +% [A]{centered}. +% By default, the linefeeds in the source lead to linebreaks ^^A +% in the output, unless you put a percentage sign at the end of the line. ^^A +% If a single line gets too long, the wrapped lines are right-aligned. +% To force the wrapping use "\newline"\newline like here. +% To stretch the first line, use "\linebreak"\linebreak like here. +% +% Two subsequent linefeeds in the source start a new verse. +% +% +% Three or more subsequent linefeeds in the source start a new verse with a ^^A +% slightly larger space on top. +% \end{guitar}\end{quote} +% \noindent +% Unfortunately, if the chords get too long, they may overlap. +% For example, "[Ebm+7]O[G#]K" produces the unreadable output +% \begin{guitar}[Ebm+7]O[G#]K\end{guitar}. +% To avoid this, the following solutions are supported: +% \begin{enumerate} +% \item +% If the token after your chord is a space, like in ``"a[Ebm+7] space"'', this +% space is stretched: \begin{guitar}a[Ebm+7] space\end{guitar}. +% Note that this is different from the notation "a[Ebm+7]{ }space" which +% produces instead: \begin{guitarMagic}a[Ebm+7]{ }space\end{guitarMagic}. +% \item +% Inside words, you can put a "_" at the end like for "[Ebm+7_]O[G#]K". +% This stretches the word: \begin{guitarMagic}[Ebm+7_]O[G#]K\end{guitarMagic}. +% \item +% Outside words, you can put a "|" at the end like for +% "[Ebm+7|]{OK}[G#|].[C#m]"\textvisiblespace\,: +% \begin{guitarMagic}[Ebm+7/]{OK}[G#/].[C#m] \end{guitarMagic} +% \end{enumerate} +% If the chord is short enough (compared to its argument) then the symbols +% "|" and "_" do not harm: "[E|]{long}" and "[E_]{long}er" produce +% \begin{guitarMagic}[E/]{long} and [E_]{long}er\end{guitarMagic}.\bigskip\par +% +% You may (and in plain\TeX\ you must) replace "\begin{guitar}" and +% "\end{guitar}" by \DescribeMacro{\guitarOn}"\guitarOn" and +% \DescribeMacro{\guitarOff}"\guitarOff", respectively. +% +% If you only want to put the guitar chords as above but do not like the +% feature concerning the linefeeds, you can use the environment +% \begin{verbatim} +% \begin{guitarMagic} +% \end{guitarMagic}\end{verbatim}\DescribeEnv{guitarMagic} +% or the respective commands +% \DescribeMacro{\guitarMagicOn}"\guitarMagicOn" and +% \DescribeMacro{\guitarMagicOff}"\guitarMagicOff". +% Similarly, you can also use only the linefeed feature by the environment +% \begin{verbatim} +% \begin{guitarCr} +% \end{guitarCr}\end{verbatim}\DescribeEnv{guitarCr} +% or the respective commands \DescribeMacro{\guitarCrOn}"\guitarCrOn" and +% \DescribeMacro{\guitarCrOff}"\guitarCrOff". +% +% As a matter of fact, you can also e.g.\ use "\guitarCrOff" \emph{within} a +% "{guitar}" environment, but then you have to use "\guitarCrOn" before you +% end the environment to have a proper nesting of modes. +% +% \section{Customization} +% +% If you want that the first line in a broken phrase is always left-aligned +% (i.e.\ the spaces between words are not enlarged to fill the line), enter +% before your line the command +% \begin{quote} +% \DescribeMacro{\guitarFirstLeft}"\guitarFirstLeft" +% \end{quote} +% You can switch back into the default mode with +% \begin{quote} +% \DescribeMacro{\guitarFirstLeft}"\guitarFirstFlush" +% \end{quote} +% The output of the "#" and "b" tokens in the chords is generated by the two +% commands +% \begin{quote} +% \DescribeMacro{\guitarSharp}"\guitarSharp"\\ +% \DescribeMacro{\guitarFlat}"\guitarFlat". +% \end{quote} +% Thus, for, example the customization +% \begin{verbatim} +% \def\guitarSharp{$^{\sharp}$}\end{verbatim} +% will make the chord "[F#]" look like {\footnotesize F$^{\sharp}$} +% (instead of the default {\footnotesize F$\sharp$}).\par +% +% In a similar way, the macros +% \begin{quote} +% \DescribeMacro{\guitarEndLine}"\guitarEndLine"\\ +% \DescribeMacro{\guitarEndPar}"\guitarEndPar"\\ +% \DescribeMacro{\guitarEndDoublePar}"\guitarEndDoubePar" +% \end{quote} +% are expanded when the song text contains one, two, or three (or more) +% linefeeds.\par +% +% After the macro +% \begin{quote} +% \DescribeMacro{\guitarNoChord}"\guitarNoChord" +% \end{quote} +% has been used, no chords are output anymore. You can make the effect +% local by putting this command in a group. ("\guitarNoChord" redefines the +% macros which are responsible for the actual output of the chords -- see the +% description at the end).\par +% +% The command +% \begin{quote} +% \DescribeMacro{\guitarPreAccord}"\guitarPreAccord" +% \end{quote} +% is expanded before the actual chord is typeset: You can change this +% definition to e.g.\ modify the font used for the chord. By default, this +% command contains a "\strut" which ensures that the lines with chords +% usually all have the same height. +% The macro "\guitarPreAccord" may also use and modify the macro +% \begin{quote} +% \DescribeMacro{\guitarAccord}"\guitarAccord" +% \end{quote} +% which contains the actual chord which is then output (you may use this +% feature to e.g.\ calculate a modulation in "\guitarPreAccord" or to +% replace the text of "\guitarAccord" by some graphic equivalent). +% +% It is guaranteed that the macros "\guitarPreAccord" and "\guitarAccord" +% are expanded precisely once. +% In contrast, it might happen that the argument of the chord (i.e.\ the +% text over which the chord is put) is expanded twice. +% (The doubled expansion could have been avoided, but the price were that +% in some cases the \TeX\ kerning mechanism would then fail if the argument +% is a syllable of some word which is continued afterwards). +% \par +% +% Whenever the ``guitar'' mode or the ``linefeed'' mode is turned +% on or off, the corresponding macro +% \begin{quote} +% \DescribeMacro{\guitarMagicOnHook}"\guitarMagicOnHook"\\ +% \DescribeMacro{\guitarMagicOffHook}"\guitarMagicOffHook"\\ +% \DescribeMacro{\guitarCrOnHook}"\guitarCrOnHook"\\ +% \DescribeMacro{\guitarCrOffHook}"\guitarCrOffHook" +% \end{quote} +% is expanded (for switching on, the macro is expanded even before the +% necessary catcode changes are done, and for switching off, the macro +% is expanded after the catcodes have been restored). +% In the current defaults, a group is opened and closed in +% "\guitarCrOnHook" and "\guitarCrOffHook": This is the reason why these +% commands must be properly nested. +% (The reason for this group is that "\parindent" should be changed locally). +% \par +% +% In the current implementation, \TeX\ forgets everything following the magic +% tokens "|" and "_" in the chord (because these symbols are intended to be +% the last one in the chord). If you want to use these tokens within a chord: +% They loose their magic meaning if they occur in a braced context +% (i.e.\ between "{" and "}"). If you regularly have to use these tokens within +% chords, you can change the default choice of this tokens by the respective +% commands +% \begin{quote} +% \DescribeMacro{\guitarSplitDist}"\toolboxMakeSplit"\bracemeta{token}\relax +%"{guitarSplitDist}"\\ +% \DescribeMacro{\guitarSplitMerge}"\toolboxMakeSplit"\bracemeta{token}\relax +%"{guitarSplitMerge}". +% \end{quote} +% (See the \filecite{toolbox} package for details of the command +% \DescribeMacro{\toolboxMakeSplit}"\toolboxMakeSplit" used here). +% It should be pointed out that \meta{token} may actually be a \emph{sequence} +% of tokens, so that for the `magic tokens' "|" and "_" you may instead use +% whole phrases if you prefer. +% \par +% +% Some fine tuning of the spacing can be done by redefining +% \begin{quote} +% \DescribeMacro{\guitarCalcDim}"\guitarCalcDim". +% \end{quote} +% When this macro is called, the skip register +% \begin{quote} +% \DescribeMacro{\guitarDim}"\guitarDim" +% \end{quote} +% contains the width of the chord which should be put over the text. +% After "\guitarCalcDim" has been expanded, it is ensured that at least +% "\guitarDim" (horizontal) space is reserved for the chord. Thus, if +% "\guitarCalcDim" increases e.g.\ "\guitarDim" by "2pt" (which is the +% default behavior of "\guitarCalcDim"), then "2pt" more space is reserved +% for the chord than its actual size: This ensures that two subsequent +% chords are always separated by some space.\par +% +% Finally, you can modify the macros which do the actual setting of the chords: +% This setting is done by the commands +% \begin{quote} +% \DescribeMacro{\guitarPut}"\guitarPut"\\ +% \DescribeMacro{\guitarPutOnSpace}"\guitarPutOnSpace"\\ +% \DescribeMacro{\guitarPutDist}"\guitarPutDist"\\ +% \DescribeMacro{\guitarPutMerge}"\guitarPutMerge" +% \end{quote} +% which with the exception of "\guitarPutOnSpace" all expect one argument +% (namely the text on which they should be put). The command +% "\guitarPutOnSpace" is called, if a space followed the chord argument. +% Similarly, "\guitarPutDist" and "\guitarPutMerge" are called if the chord +% argument ended with the magic symbol "|" respectively "_".\par +% Before one of the above four macros is called, the chord text is stored in +% the macro "\guitarAccord" (and has not been expanded to this time); also the +% argument has not been expanded to this time. The above four macros are also +% responsible for the appropriate expansion (also of the expansion of the +% macros \DescribeMacro{\guitarCalcDim}"\guitarCalcDim" and +% \DescribeMacro{\guitarPreAccord}"\guitarPreAccord", if +% the latter should still keep their meaning). +% The above four macros may freely use the skip register +% \DescribeMacro{\guitarDim}"\guitarDim" and the box register +% \DescribeMacro{\guitarBox}"\guitarBox" (which are both not used or +% modified by the other macros of this package). +% +% +% \section{Possible Problems} +% +% The special treatment of "[" "#" "b" and \meta{linefeed} is implemented by a +% changing of catcodes. This may cause essentially two sorts of problems: +% \begin{enumerate} +% \item +% In some cases, you will want to avoid the automatic replacement of "#" +% and "b". For example, in "[\textbf{F#}]" or in "\guitarChord{\textbf{F#}}" +% the "b" of "\textbf" gets replaced which is of course not what you want. +% To avoid this replacement, there is a "*"~version of the respective +% commands, i.e.\ the above example works in the intended way if you write +% instead "[*\textbf{F\guitarSharp}]" or +% "\guitarChord*{\textbf{F\guitarSharp}}" +% (you have to use the command "\guitarSharp", because due to the "*" also +% the "#" would not be replaced). +% \item +% There are some situations in which catcodes are set +% too early, e.g.\ if you use the macros within the argument of certain +% macros. In this case, these symbols keep their usual \TeX\ meaning +% (which may either lead to an error in case of "#" (and sometimes "[") or +% just to a false output). If this happens to you, you have to replace at +% the corresponding place the above one-symbol shortcuts by their longer +% macro equivalents. In other words: You might have to replace in +% certain special situations some occurrences of the symbols according to +% the following table: +% \bigskip\par +% \begin{tabular}[T]{l@{$\quad\to\quad$}l} +% "[...]" &"\guitarChord{...}"\\ +% "#" &"\guitarSharp"\\ +% "b" &"\guitarFlat"\\ +% linefeed &"\guitarEndLine"\\ +% $2$ linefeeds &"\guitarEndPar"\\ +% $3{+}$ linefeeds&"\guitarEndDoublePar" +% \end{tabular} +% \end{enumerate} +% +% \iffalse +% +% \fi +% \iffalse--------------------------------------------------------------\fi +% \StopEventually{\PrintChanges} +% \section{Implementation} +% +% \iffalse-------------------------------------------------------------- +% +% +%<*package> +% \fi +% \begin{macrocode} +%% +%% This file was generated by the docstrip utility from guitar.dtx. +%% You may distribute this file only together with the source guitar.dtx +%% (and if possible with guitar.ins) and only if these files are unmodified. +%% +%% Author: +%% +%% M. V\"ath martin@mvath.de +%% + +\ifx\typeout\undefined + \def\tbx@tmp{\immediate\write17}\expandafter\tbx@tmp +\else + \expandafter\typeout +\fi{guitar.sty by M. Vaeth: Guitar chords over song texts 1.6} + +\ifx\ProvidesPackage\undefined\else + \ProvidesPackage{guitar}[2009/03/17 v1.6] +\fi +\ifx\RequirePackage\undefined + \ifx\toolboxDef\undefined + \input toolbox.sty + \fi +\else + \RequirePackage{toolbox}[2001/04/08] +\fi +\ifx\toolboxIfNextGobbling\undefined + \errmessage{guitar.sty requires toolbox.sty version 2.0 or higher} +\fi + +\ifx\newenvironment\undefined\else + \newenvironment{guitar}{\guitarOn}{\guitarOff} + \newenvironment{guitarMagic}{\guitarMagicOn}{\guitarMagicOff} + \newenvironment{guitarCr}{\guitarCrOn}{\guitarCrOff} +\fi + +\ifx\newcommand\undefined\else + \newcommand{\guitarChord}{} + + \newcommand{\guitarOn}{} + \newcommand{\guitarOff}{} + \newcommand{\guitarMagicOn}{} + \newcommand{\guitarMagicOff}{} + \newcommand{\guitarCrOn}{} + \newcommand{\guitarCrOff}{} + + \newcommand{\guitarSharp}{} + \newcommand{\guitarFlat}{} + \newcommand{\guitarMagicOnHook}{} + \newcommand{\guitarMagicOffHook}{} + \newcommand{\guitarCrOnHook}{} + \newcommand{\guitarCrOffHook}{} + \newcommand{\guitarEndLine}{} + \newcommand{\guitarEndPar}{} + \newcommand{\guitarEndDoublePar}{} + \newcommand{\guitarCalcDim}{} + \newcommand{\guitarPreAccord}{} + + \newcommand{\guitarPut}{} + \newcommand{\guitarPutOnSpace}{} + \newcommand{\guitarPutDist}{} + \newcommand{\guitarPutMerge}{} + + \newcommand{\guitarNoChord}{} + + \newcommand{\guitarAccord}{} + \newcommand{\guitarSplitDist}{} + \newcommand{\guitarSplitMerge}{} +\fi + +% \end{macrocode} +% \begin{macro}{\guitarBox}\nocomment +% \begin{macrocode} +\ifx\newsavebox\undefined + \newbox\guitarBox +\else + \newsavebox{\guitarBox} +\fi +% \end{macrocode} +% \end{macro} +% \begin{macro}{\guitarBox}\nocomment +% \begin{macrocode} +\ifx\newlength\undefined + \newskip\guitarDim +\else + \newlength{\guitarDim} +\fi + +% \end{macrocode} +% \end{macro} +% \begin{macro}{\guitarSharp}\nocomment +% \begin{macrocode} +\def\guitarSharp{$\sharp$} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\guitarFlat}\nocomment +% \begin{macrocode} +\def\guitarFlat{$\flat$} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\guitarCalcDim}\nocomment +% \begin{macrocode} +\def\guitarCalcDim{\advance\guitarDim by 2pt} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\guitarPreAccord}\nocomment +% \begin{macrocode} +\def\guitarPreAccord{\footnotesize\strut} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\guitarMagicOnHook}\nocomment +% \begin{macrocode} +\let\guitarMagicOnHook\toolboxEmpty +% \end{macrocode} +% \end{macro} +% \begin{macro}{\guitarMagicOffHook}\nocomment +% \begin{macrocode} +\let\guitarMagicOffHook\toolboxEmpty +% \end{macrocode} +% \end{macro} +% \begin{macro}{\guitarCrOnHook}\nocomment +% \begin{macrocode} +\def\guitarCrOnHook{\begingroup\leftskip 0pt plus 1fill\relax + \parindent 0pt\leavevmode\gtr@CrOnHook\nobreak\hskip-\leftskip\relax + \finalhyphendemerits=0\everypar{\nobreak\hskip-\leftskip\relax}\sloppy\relax + \linepenalty=50\relax\parskip0pt\relax} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\guitarFirstLeft}\nocomment +% \begin{macrocode} +\def\guitarFirstLeft{\def\gtr@CrOnHook + {\rightskip 0pt plus 1fil\relax\parfillskip 0pt\relax}} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\guitarFirstFlush}\nocomment +% \begin{macrocode} +\def\guitarFirstFlush{\let\gtr@CrOnHook\toolboxEmpty} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\gtr@CrOnHook}\nocomment +% \begin{macrocode} +\guitarFirstFlush +% \end{macrocode} +% \end{macro} +% \begin{macro}{\guitarCrOffHook}\nocomment +% \begin{macrocode} +\let\guitarCrOffHook\endgroup +% \end{macrocode} +% \end{macro} +% \begin{macro}{\guitarEndLine}\nocomment +% \begin{macrocode} +\def\guitarEndLine{\par\leavevmode} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\guitarEndPar}\nocomment +% \begin{macrocode} +\def\guitarEndPar{\medskip\par\leavevmode} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\guitarEndDoublePar}\nocomment +% \begin{macrocode} +\def\guitarEndDoublePar{\bigskip\par\leavevmode} + +% \end{macrocode} +% \end{macro} +% \begin{macro}{\guitarPut}\nocomment +% \begin{macrocode} +\def\guitarPut#1{\setbox0\hbox{\strut#1}\leavevmode + \raise\ht0\hbox to 0pt{\hbox to\wd0{\guitarPreAccord + \hfill\guitarAccord\hfill\hss}\hss}#1} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\guitarPutOnSpace}\nocomment +% \begin{macrocode} +\def\guitarPutOnSpace{\leavevmode\raise\ht\strutbox + \hbox{\guitarPreAccord\guitarAccord}} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\guitarPutDist}\nocomment +% \begin{macrocode} +\def\guitarPutDist{\gtr@distMerge\hfil} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\guitarPutMerge}\nocomment +% \begin{macrocode} +\def\guitarPutMerge{\gtr@distMerge\hrulefill} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\gtr@distMerge}\nocomment +% \begin{macrocode} +\def\gtr@distMerge#1#2{\setbox\guitarBox\hbox{\strut#2}% + \setbox0\hbox{\guitarPreAccord\guitarAccord}\leavevmode + \guitarDim=\wd0\relax\guitarCalcDim + \ifdim\wd\guitarBox<\guitarDim% Accord is too large: + \hbox to 0pt{\raise\ht\guitarBox\hbox{\copy0}\hss}% + \hbox to\guitarDim{\box\guitarBox#1}% + \let\guitarAccord\toolboxEmpty%now used as a temporary variable. + \else + \hbox to 0pt{\raise\ht\guitarBox + \hbox to\wd\guitarBox{\hfil\box0\hfil}\hss}% + \def\guitarAccord{#2}% + \fi\guitarAccord} + +% \end{macrocode} +% \end{macro} +% \begin{macro}{\guitarNoChord}\nocomment +% \begin{macrocode} +\def\guitarNoChord{\def\guitarPut##1{##1}% + \let\guitarPutDist\guitarPut + \let\guitarPutMerge\guitarPut + \let\guitarPutOnSpace\toolboxSpace} + +% \end{macrocode} +% \end{macro} +% \begin{macro}{\guitarSplitDist}\nocomment +% \begin{macrocode} +\toolboxMakeSplit{|}{guitarSplitDist} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\guitarSplitMerge}\nocomment +% \begin{macrocode} +\toolboxMakeSplit{_}{guitarSplitMerge} + +% \end{macrocode} +% \end{macro} +% \begin{macro}{\guitarOn}\nocomment +% \begin{macrocode} +\def\guitarOn{\guitarCrOn\guitarMagicOn} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\guitarOff}\nocomment +% \begin{macrocode} +\def\guitarOff{\guitarMagicOff\guitarCrOff} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\guitarMagicOn}\nocomment +% \begin{macrocode} +\def\guitarMagicOn{\guitarMagicOnHook\gtr@magicOn\gtr@ignorespaces} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\guitarMagicOff}\nocomment +% \begin{macrocode} +\def\guitarMagicOff{\gtr@magicOff\guitarMagicOffHook} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\gtr@crMagicCondOn} +% During the scanning of the chord and its argument, we switch off +% the magic meaning of "[" and of linefeeds. After the scanning, the codes are +% restored again with "\gtr@crMagicCondOn". Of course, we have to take care +% that we switch on the catcodes only if we `are' in the corresponding mode. +% We thus have to redefine the commands executed by "\gtr@crMagicCondOn" when +% we change the mode. +% \begin{macrocode} +\def\gtr@crMagicCondOn{\gtr@magicCondOn\gtr@crCondOn} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\gtr@crMagicCondOff} +% "\gtr@crMagicCondOff" is the opposite of "\gtr@crMagicOn" and used to +% switch off the catcodes during the scanning of the chord and its argument. +% \begin{macrocode} +\def\gtr@crMagicCondOff{\gtr@magicCondOff\gtr@crCondOff} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\gtr@magicOn}\nocomment +% \begin{macrocode} +\def\gtr@magicOn{\gtr@magicOnCat + \let\gtr@magicCondOff\gtr@magicOffCat + \let\gtr@magicCondOn\gtr@magicOnCat} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\gtr@magicOn}\nocomment +% \begin{macrocode} +\def\gtr@magicOff{\gtr@magicOffCat + \let\gtr@magicCondOff\toolboxEmpty + \let\gtr@magicCondOn\toolboxEmpty} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\gtr@braceOnDef} +% "\gtr@braceOnDef" will later save/redefine the "[" command. +% For the very first call below we must make it a dummy command now. +% \begin{macrocode} +\let\gtr@magicOnDef\toolboxEmpty +% \end{macrocode} +% \end{macro} +% \begin{macro}{\gtr@magicOnCat}\nocomment +% \begin{macrocode} +\def\gtr@magicOnCat{\catcode`\[=13\gtr@magicOnDef} +% \end{macrocode} +% \end{macro} +% \begin{macro}{gtr@magicSave}\nocomment +% "\gtr@magicSave" is the content of the original "[" command +% \begin{macrocode} +\gtr@magicOnCat\def\gtr@magicOnDef{\let\gtr@magicSave[\let[\gtr@magicNew}% +% \end{macrocode} +% \end{macro} +% \begin{macro}{\gtr@magicNew}\nocomment +% "\gtr@magicNew" is the magic new "[" command +% \begin{macrocode} +\def\gtr@magicNew{\gtr@chordTest\gtr@scanBrace} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\gtr@magicOffCat}\nocomment +% \begin{macrocode} +\def\gtr@magicOffCat{\let[\gtr@magicSave\catcode`\[=12\relax} +\gtr@magicOnDef\gtr@magicOff + +% \end{macrocode} +% \end{macro} +% \begin{macro}{\gtr@scanBrace}\nocomment +% \begin{macrocode} +\def\gtr@scanBrace#1]{\gtr@parse{#1}} + +% \end{macrocode} +% \end{macro} +% \begin{macro}{\gtr@scanBrace}\nocomment +% \begin{macrocode} +\def\guitarChord{\gtr@chordTest\gtr@parse} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\gtr@chordTest}\nocomment +% "\gtr@chordTest"\bracemeta{arg} first disables the magic catcodes for "[". +% Unless the next token is a "*", it enables the magic catcodes for +% "#" and "b" (the "*" is gobbled). Then \meta{arg} is expanded. +% It should be noted that the scanning for "*" happens with catcodes +% for "#" and "b" enabled (this is necessary to parse properly, e.g.\ "[b]"). +% \begin{macrocode} +\def\gtr@chordTest#1{\gtr@crMagicCondOff\gtr@change + \toolboxIfNextGobbling*{\gtr@normal#1}{#1}} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\gtr@parse}\nocomment +% "\gtr@parse"\bracemeta{chrd} parses the chord \meta{chord} and possibly a +% following space (gobbling). Depending on what it finds, it expands the +% corresponding "\guitarPut..." command. +% \begin{macrocode} +\def\gtr@parse#1{\gtr@normal\gtr@changeDef + \guitarSplitDist{#1}\guitarAccord\gtr@dist + \expandafter + \guitarSplitMerge\expandafter{\guitarAccord}\guitarAccord\gtr@merge + \gtr@changeUndef + \toolboxIfNextGobbling\toolboxSpaceToken + {\gtr@crMagicCondOn\guitarPutOnSpace}\gtr@para} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\gtr@para}\nocomment +% \begin{macrocode} +\def\gtr@para#1{\gtr@crMagicCondOn + \ifx\gtr@dist\undefined + \ifx\gtr@merge\undefined + \let\gtr@tmp\guitarPut + \else + \let\gtr@tmp\guitarPutMerge + \fi + \else + \let\gtr@tmp\guitarPutDist + \fi\gtr@tmp{#1}} + +% \end{macrocode} +% \end{macro} +% \begin{macro}{\gtr@change}\nocomment +% \begin{macrocode} +\def\gtr@change{\catcode`\#=13\catcode`b=13\relax} +% \end{macrocode} +% \end{macro} +% \begin{macro}{gtr@sharpSave} +% "\gtr@sharpSave" is the content of the original sharp command +% \end{macro} +% \begin{macro}{gtr@flatSave} +% "\gtr@flatSave" is the content of the original flat command +% \end{macro} +% \begin{macro}{\gtr@changeDef} +% "\gtr@changeDef" will later save/redefine the sharp and flat command. +% \begin{macrocode} +\gtr@change\def\gtr@changeDef{\let\gtr@sharpSave#\let#\gtr@sharpNew + \let\gtr@flatSave b\let b\gtr@flatNew} +% \end{macrocode} +% \end{macro} +% \begin{macro}{gtr@ChangeUndef} +% "\gtr@ChangeUndef" restores the change made by "\gtr@changeDef" +% \begin{macrocode} +\def\gtr@changeUndef{\let#\gtr@sharpSave\let b\gtr@flatSave} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\gtr@sharpNew}\nocomment +% "\gtr@sharpNew" is the magic new "#" command +% \begin{macrocode} +\def\gtr@sharpNew{\guitarSharp} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\gtr@flatNew}\nocomment +% "\gtr@flatNew" is the magic new "#" command +% \begin{macrocode} +\def\gtr@flatNew{\guitarFlat} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\gtr@normal}\nocomment +% \begin{macrocode} +\def\gtr@normal{\catcode`\#=6\catcode`b=11\relax} +\gtr@changeDef\gtr@normal + +% \end{macrocode} +% \end{macro} +% \begin{macro}{\guitarCrOn}\nocomment +% \begin{macrocode} +\def\guitarCrOn{\guitarCrOnHook\gtr@crOn\gtr@ignorespaces} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\guitarCrOff}\nocomment +% \begin{macrocode} +\def\guitarCrOff{\gtr@crOff\guitarCrOffHook} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\gtr@crOn}\nocomment +% \begin{macrocode} +\def\gtr@crOn{\gtr@crOnCat + \let\gtr@crCondOff\gtr@crOffCat + \let\gtr@crCondOn\gtr@crOnCat} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\gtr@crOn}\nocomment +% \begin{macrocode} +\def\gtr@crOff{\gtr@crOffCat + \let\gtr@crCondOff\toolboxEmpty + \let\gtr@crCondOn\toolboxEmpty} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\gtr@crOnDef} +% "\gtr@crOnDef" will later save/redefine the linefeed command. +% For the very first call below we must make it a dummy command now. +% \begin{macrocode} +\let\gtr@crOnDef\toolboxEmpty +% \end{macrocode} +% \end{macro} +% \begin{macro}{\gtr@crOnCat}\nocomment +% \begin{macrocode} +\def\gtr@crOnCat{\catcode`\^^M=13\gtr@crOnDef} +% \end{macrocode} +% \end{macro} +% \begin{macro}{gtr@crSave}\nocomment +% "\gtr@crSave" is the content of the original linefeed command +% \begin{macrocode} +\gtr@crOnCat\def\gtr@crOnDef{\let\gtr@crSave^^M\let^^M\gtr@crNew}% +% \end{macrocode} +% \end{macro} +% \begin{macro}{gtr@crNew}\nocomment +% "\gtr@crNew" is the special new linefeed command +% \begin{macrocode} +\def\gtr@crNew{\toolboxIfNextGobbling^^M\gtr@par\guitarEndLine}% +% \end{macrocode} +% \end{macro} +% \begin{macro}{gtr@par}\nocomment +% \begin{macrocode} +\def\gtr@par{\toolboxIfNextGobbling^^M\gtr@dblpar\guitarEndPar}% +% \end{macrocode} +% \end{macro} +% \begin{macro}{gtr@dblpar}\nocomment +% \begin{macrocode} +\def\gtr@dblpar{\toolboxIfNextGobbling^^M\gtr@dblpar\guitarEndDoublePar}% +% \end{macrocode} +% \end{macro} +% \begin{macro}{gtr@ignorespaces}\nocomment +% \begin{macrocode} +\def\gtr@ignorespaces{\toolboxIfNextGobbling^^M\gtr@ignorespaces\ignorespaces}% +% \end{macrocode} +% \end{macro} +% \begin{macro}{gtr@crOffCat}\nocomment +% \begin{macrocode} +\def\gtr@crOffCat{\let^^M\gtr@crSave\catcode`\^^M=5\relax}% +\gtr@crOnDef\gtr@crOff + +% \end{macrocode} +% \end{macro} +% +% \iffalse +% +% \fi +% \Finale\PrintIndex +% +% +% +% \iffalse +%<*metainfo> +% \fi +\iffalse ------------------------------------------------------------- +% +% Just in case that for some reason the file `guitar.ins' got lost: +% The content of this file is between the lines %<*insfile> and %. +% +%\iffalse +% +%<*insfile> +\def\batchfile{guitar.ins} +\input docstrip.tex +\keepsilent +\nopreamble +\generateFile{guitar.sty}{f}{\from{guitar.dtx}{package}} +\generateFile{guitar.txt}{f}{\from{guitar.dtx}{asciidocu}} +\generateFile{guitar.tex}{f}{\from{guitar.dtx}{driver}} +%%\generateFile{guitar.ins.dup}{f}{\from{guitar.dtx}{insfile}} + +\Msg{***************************************************************} +\Msg{*} +\Msg{* To finish the installation you have to move the} +\Msg{* file 'guitar.sty' into a directory searched by TeX.} +\Msg{*} +\Msg{*} +\Msg{* Run the file guitar.tex through LaTeX to produce the} +\Msg{* documentation or read the ascii documentation in guitar.txt} +\Msg{*} +\Msg{*} +\Msg{***************************************************************} +\endbatchfile +% +%<*metainfo> +% \fi +\fi +% \iffalse +% +% \fi +\endinput + +%%% Local Variables: +%%% mode: latex +%%% TeX-master: "guitar.tex" +%%% End: diff --git a/macros/latex/contrib/guitar/guitar.ins b/macros/latex/contrib/guitar/guitar.ins new file mode 100644 index 0000000000..f37602fe48 --- /dev/null +++ b/macros/latex/contrib/guitar/guitar.ins @@ -0,0 +1,21 @@ +\def\batchfile{guitar.ins} +\input docstrip.tex +\keepsilent +\nopreamble +\generateFile{guitar.sty}{f}{\from{guitar.dtx}{package}} +\generateFile{guitar.txt}{f}{\from{guitar.dtx}{asciidocu}} +\generateFile{guitar.tex}{f}{\from{guitar.dtx}{driver}} +%%\generateFile{guitar.ins.dup}{f}{\from{guitar.dtx}{insfile}} + +\Msg{***************************************************************} +\Msg{*} +\Msg{* To finish the installation you have to move the} +\Msg{* file 'guitar.sty' into a directory searched by TeX.} +\Msg{*} +\Msg{*} +\Msg{* Run the file guitar.tex through LaTeX to produce the} +\Msg{* documentation or read the ascii documentation in guitar.txt} +\Msg{*} +\Msg{*} +\Msg{***************************************************************} +\endbatchfile diff --git a/macros/latex/contrib/guitar/guitar.pdf b/macros/latex/contrib/guitar/guitar.pdf new file mode 100644 index 0000000000..2d8da82573 Binary files /dev/null and b/macros/latex/contrib/guitar/guitar.pdf differ -- cgit v1.2.3