%%% 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\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
        %% Nullify [La]TeX page layout settings, page layout by LilyPond.
        \pagestyle{empty}
        \topmargin-1in
        %% FIXME: empirical computer science: page is ca 5mm too low.
        \advance\topmargin-5mm
        \headheight0pt\headsep0pt
        \oddsidemargin-1in
        \evensidemargin\oddsidemargin
        \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
}

%% 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\XXXlybox#1#2#3#4#5{
  \vbox to #4\outputscale{
    \hbox to #3\outputscale{
      \leftalign{\kern#1\outputscale\lower#2\outputscale\topalign{#5}}}
    \hss}\vss}

%% FIXME: no dimensions, should fix at toplevel
\gdef\lybox#1#2#3#4#5{
  \leftalign{\kern#1\outputscale\lower#2\outputscale\topalign{#5}}}

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

\lilypondifundefined{lilypondpaperinterscorelinefill}
  {\gdef\lilypondpaperinterscorelinefill{0}}
  {\gdef\lilypondpaperinterscorelinefill{1}}

%% Allow overriding of interscoreline, e.g. for lilypond.py's --preview
\lilypondifundefined{interscoreline}
{\gdef\interscoreline{}}{}

%% 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
