%%% lilyponddefs.tex -- TeX macros for LilyPond output.
%%%
%%%  source file of the GNU LilyPond music typesetter
%%% 
%%% (c)  1998--2004 Jan Nieuwenhuizen <janneke@gnu.org>
%%%                 Han-Wen Nienhuys <hanwen@cs.uu.nl>
%%%                 Mats Bengtsson <mats.bengtsson@s3.kth.se>
%%%
%% Avoid \par while reading this file.
\edef\lilyponddefsELC{\the\endlinechar}%
\endlinechar -1\relax

%% This runs with plain TeX, LaTeX, pdftex, and texinfo.
%%
%% To avoid interferences, lilyponddefs.tex must be loaded within a group.
%% It is loaded only once, so the definitions must be global.
%%
%% The overall structure of a file created by LilyPond is as follows:
%%
%%   <lilypond parameter definitions>
%%   \ifx\lilypondstart \undefined
%%     \input lilyponddefs
%%   \fi
%%   \lilypondstart
%%   <font setup and note output>
%%   \lilypondend

\newdimen\lytempdim
\newdimen\outputscale

%% Handy macros from the LaTeX manual.
\long\gdef\lilypondfirst#1#2{#1}
\long\gdef\lilypondsecond#1#2{#2}
\gdef\lilypondifundefined#1{
  \expandafter\ifx\csname#1\endcsname\relax
    \expandafter\lilypondfirst
  \else
    \expandafter\lilypondsecond
  \fi
}

\gdef\lilypondstart{
  \begingroup
  \catcode `\@=11\relax
  %% \@nodocument is defined as \relax after `\begin{document}'
  \lilypondifundefined{@nodocument}
    {
      %% either plain TeX or texinfo or not at the beginning of LaTeX input
      \def\x{\endgroup}}
    {
      %% FIXME: a4
      %% provide a proper LaTeX preamble (for A4 paper format)
      \def\x{
        \endgroup
        \def\lilyponddocument{}
        \documentclass[a4paper]{article}
        %% safe-mode
        \nofiles
        \usepackage{inputenc}
        \pagestyle{empty}
        \lilypondifundefined{lilypondclassic}
        {
          %% Nullify [La]TeX page layout settings, page layout by LilyPond.
          \topmargin-1in
          \headheight0pt\headsep0pt
          \oddsidemargin-1in
          \evensidemargin\oddsidemargin
        }
        {
          %% Center staves horizontally on page
          \ifdim\lilypondpaperlinewidth\lilypondpaperunit > 0pt
          \hsize\lilypondpaperlinewidth\lilypondpaperunit
          \lytempdim \paperwidth
          \advance\lytempdim -\the\hsize
          \lytempdim 0.5\lytempdim
          \advance\lytempdim -1in
          \oddsidemargin \lytempdim
          \evensidemargin \lytempdim
          \fi
        }
        \parindent 0pt
        %% TEXINFO workaround: \begin is defined as \outer, use \csname.
        \csname begin\endcsname{document}}}
  \x}

\gdef\lilypondend{
  \lilypondifundefined{lilypondbook}
  {\lilypondifundefined{lilypondpaperlastpagefill}
    {\vskip 0pt plus\lilypondpaperinterscorelinefill00 fill}
    {}}
  {}
  \begingroup
  \lilypondifundefined{lilyponddocument}
    {\def\x{\endgroup}}
    {\def\x{\endgroup\csname end\endcsname{document}}}
  \x}

%% Inversed \loop ... \repeat macro
\def\lilypondloop#1\lilypondrepeat{
  \def\lilypondbody{#1}
  \lilyponditerate
}

\def\lilyponditerate{
  % \if ...
    \lilypondbody
    \let\lilypondnext \relax
  \else
    \let\lilypondnext \lilyponditerate
  \fi
  \lilypondnext
}

%% Allow overriding of pagebreak
\lilypondifundefined{lilypondpagebreak}
{
  \lilypondifundefined{@nodocument}
  {\gdef\lilypondpagebreak{\eject}}
  {\gdef\lilypondpagebreak{\newpage}}
  }
  {}
      
%% Include \special only once.
\gdef\lilypondspecial{
  \special{header=music-drawing-routines.ps}
  \gdef\lilypondspecial{}
}

%% The feta characters.
\input feta20

\global\font\fetasixteen = feta16
\gdef\fetafont{\fetasixteen}
\gdef\fetachar#1{\hbox{\fetasixteen#1}}

\gdef\topalign#1{\vbox to 0pt{\hbox{#1}\vss}}
\gdef\leftalign#1{\hbox to 0pt{#1\hss}}

\gdef\lyitem#1#2#3{
  \topalign{\raise#2\outputscale\leftalign{\kern#1\outputscale#3}}}

\gdef\lybox#1#2#3#4#5{
  \lytempdim\baselineskip
  \advance\lytempdim-#4\outputscale
  \raise\lytempdim
  \vbox to#4\outputscale{
    \leftalign{\kern#1\outputscale\lower#2\outputscale\topalign{#5}}
    \vss}}

\gdef\lyvrule#1#2#3#4{
  \kern#1\outputscale
  \vrule width #2\outputscale depth #3\outputscale height #4\outputscale}

%% FIXME: 'interscoreline' and 'lilypondPAPERinterscoreline
\lilypondifundefined{lilypondpaperinterscorelinefill}
  {\gdef\lilypondpaperinterscorelinefill{0}}
  {\gdef\lilypondpaperinterscorelinefill{1}}

%% Allow overriding of interscoreline, e.g. for lilypond.py's --preview
\lilypondifundefined{interscoreline}
{
  \lilypondifundefined{lilypondclassic}
  {\gdef\interscoreline{}}
  {\gdef\interscoreline{
      \vskip\lilypondpaperinterscoreline\lilypondpaperunit
      plus \lilypondpaperinterscorelinefill fill}}
}
{}

%% Include postscript definitions unless using PDFTeX,
%% in that case use pdf definitions.
%% MiKTeX workaround: use \csname.
\lilypondifundefined{lilypondpostscript}
{\lilypondifundefined{pdfoutput}
  {\input lily-ps-defs }
  {\pdfoutput = 1
    \input lily-pdf-defs }}
{}

%% Restore newline functionality (disabled to avoid \par).
\endlinechar \lilyponddefsELC
\endinput

%% end lilyponddefs.tex
