X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=tex%2Flilyponddefs.tex;h=467f5639951c6118cbba7060c057a05af1f12b25;hb=9d9e2e5637e06d98245c3395b58207ec173e7e7d;hp=8a345d603c0b32229a76c89ce29f9241a62906ea;hpb=95de6911a5cd1f90dfcd72ec798f089f6522f50f;p=lilypond.git diff --git a/tex/lilyponddefs.tex b/tex/lilyponddefs.tex index 8a345d603c..467f563995 100644 --- a/tex/lilyponddefs.tex +++ b/tex/lilyponddefs.tex @@ -1,309 +1,370 @@ +%%% lilyponddefs.tex -- TeX macros for LilyPond output. +%%% +%%% source file of the GNU LilyPond music typesetter +%%% +%%% (c) 1998--2007 Jan Nieuwenhuizen +%%% Han-Wen Nienhuys +%%% Mats Bengtsson +%%% %% -%% include file for LilyPond +%% Avoid \par while reading this file. %% -%% this file defines various macros to accomodate lilypond output -%% -%% let's not make par before endinput -% -% TeXbook ex 7.7 -\def\ifundefined#1{\expandafter\ifx\csname#1\endcsname\relax} -% -% skip if included already -\def\SkipLilydefs{\endinput} -\ifundefined{EndLilyPondOutput} - \def\EndLilyPondOutput{\csname bye\endcsname} - \def\SkipLilydefs{} -\fi -\SkipLilydefs -% -\ifundefined{mudelacopyright} - \def\mudelacopyright{\copyright\ \number\year} -\fi -\ifundefined{LilyIdString} - \def\LilyIdString{Lily was here} -\fi - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% macros to shorten other definitions -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\def\musicdef#1#2{\def#1{\musicchar{#2}}} -\def\musicchar#1{\musicfnt\char#1} -\def\rationalmultiply#1*#2/#3{\multiply #1 by #2 \divide #1 by #3} - - -\def\maccentraise#1#2{\dimen0=\noteheight - \rationalmultiply\dimen0*#2% - \raise\dimen0\hbox{#1}} -\def\maccentdef#1#2#3{\def#1{\maccentraise{\musicchar{#2}}{#3}}} -\def\vertcenter#1{\vbox to 0pt{\vss #1\vss}} - -\def\musicmathdef#1#2{\def#1{\musicmathchar{#2}}} -\def\musicmathchar#1{\musicmathfont\char#1} - -\def\topalign#1{\vbox to 0pt{#1\vss}} -\def\botalign#1{\vbox to 0pt{\vss #1}} - -\def\centeralign#1{\hbox to 0pt{\hss#1\hss}} -\def\leftalign#1{\hbox to 0pt{#1\hss}} -\def\rightalign#1{\hbox to 0pt{\hss#1}} - - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% set up dimensions -\parindent=0pt -\newdimen\smallspace -\newdimen\interlinedist -\newdimen\stemthickness -\newcount\n -\newdimen\staffheight -\newdimen\notewidth -\newdimen\noteheight -\newdimen\staffrulethickness -\newdimen\interstaffrule -\newdimen\dist - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% set fonts and primary dimensions -% ugh -\def\musixtwentydefs{ - \twentyfonts - \musixcalc -} - - \def\cmrtwenty{ - \font\smalltextfont=cmr8 - \font\meterfont=cmbx15 - \font\textmusic=cmmi12 -% \font\musicmathfont=cmsy10 %%Not used?? /MB - \ifundefined{documentclass} - \font\normaltextfont=cmr10 %\textfont is a primitive - \font\italicfont=cmti10 scaled \magstep1 - \font\boldfont=cmbx10 - \font\largefont=cmbx12 - \else - \def\settext##1{{\normalfont\normalsize ##1}} - \def\setitalic##1{\textit{\normalsize ##1}} - \def\setbold##1{\textbf{\normalsize ##1}} - \def\setlarge##1{\textbf{\large ##1}} - \fi - } - \def\cmrsixteen{ - \font\smalltextfont=cmr6 - \font\meterfont=cmbx12 - \font\textmusic=cmmi10 - \ifundefined{documentclass} - \font\normaltextfont=cmr8 %\textfont is a primitive - \font\italicfont=cmti9 - \font\boldfont=cmbx8 - \font\largefont=cmbx10 - \else - \def\settext##1{{\normalfont\footnotesize ##1}} - \def\setitalic##1{\textit{\small ##1}} - \def\setbold##1{\textbf{\footnotesize ##1}} - \def\setlarge##1{\textbf{\normalsize ##1}} - \fi - } - \def\cmreleven{ - \font\smalltextfont=cmr5 - \font\meterfont=cmbx8 - \font\textmusic=cmmi8 - \ifundefined{documentclass} - \font\normaltextfont=cmr6 - \font\italicfont=cmti6 - \font\boldfont=cmbx6 - \font\largefont=cmbx8 - \else - \def\settext##1{{\normalfont\tiny ##1}} - \def\setitalic##1{\textit{\tiny ##1}} - \def\setbold##1{\textbf{\tiny ##1}} - \def\setlarge##1{\textbf{\footnotesize ##1}} - \fi - } - - \def\cmrthirteen{ - \font\smalltextfont=cmr6 - \font\meterfont=cmbx9 - \font\textmusic=cmmi9 - \ifundefined{documentclass} - \font\normaltextfont=cmr7 - \font\italicfont=cmti7 - \font\boldfont=cmbx7 - \font\largefont=cmbx9 - \else - \def\settext##1{{\normalfont\scriptsize ##1}} - \def\setitalic##1{\textit{\scriptsize ##1}} - \def\setbold##1{\textbf{\scriptsize ##1}} - \def\setlarge##1{\textbf{\small ##1}} - \fi - } -\def\musixsixteendefs{ - \sixteenfonts - \musixcalc -} -\def\musixtwentysixdefs{ - \twentysixfonts - \musixcalc -} -\def\musixthirteendefs{ - \thirteenfonts - \musixcalc -} -\def\musixelevendefs{ - \elevenfonts - \musixcalc -} - -\def\textsharp{\raise.4ex\hbox{\textmusic\char"5D}} -\def\textnatural{\raise.4ex\hbox{\textmusic\char"5C}} -\def\textflat{\raise.2ex\hbox{\textmusic\char"5B}} - - +\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: +%% +%% +%% +%% \ifx\lilypondstart \undefined +%% \input lilyponddefs +%% \fi +%% \lilypondstart +%% +%% \lilypondend + +%% A temporary variable. +%% +\newdimen\lytempdim -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% do derivative calcs +%% The scaling factor for all dimensions. +%% +\newdimen\outputscale -% this has to be synced with the font definition -\def\musixcalc{ - \staffheight=\mudelapaperbarsize pt - \interlinedist=\staffheight - \divide\interlinedist by 4 - \notewidth=\mudelapapernotewidth pt +\long\gdef\lilypondfirst#1#2{#1} +\long\gdef\lilypondsecond#1#2{#2} - \smallspace=.3\interlinedist - \interstaffrule=\staffheight - \divide\interstaffrule by 4 - \staffrulethickness=\mudelapaperrulethickness pt - \stemthickness=\staffrulethickness +%% \lilypondundefined{xxx}{foo}{bar} +%% +%% If `xxx' (without the leading backslash) is an undefined macro, +%% execute block `foo'. Otherwise, execute block `bar'. Based on +%% a similar macro from the LaTeX kernel. +%% +\gdef\lilypondifundefined#1{ + \expandafter\ifx\csname#1\endcsname\relax + \expandafter\lilypondfirst + \else + \expandafter\lilypondsecond + \fi } -% stacked numbers; may be overruled in fetdefs -\def\generalmeter#1#2{\vbox to 0pt{\vss\hbox{\meterfont - #1}\nointerlineskip - \hbox{\meterfont #2}\vss}} - -% stacked horizontal lines - -\input dyndefs -\input fetdefs - - - -\def\emptybar{} - -\def\defaultthinbar{\thinbar{\staffheight}} -\def\defaultthickbar{\thickbar{\staffheight}} -%? what-s wrong with rightalign? -\def\repeatstopbar{\hss\rightalign{\repeatcolon\hskip2\smallspace\defaultthinbar\hskip\smallspace\defaultthickbar}} -\def\repeatstartbar{\hbox{\defaultthickbar\kern\smallspace\defaultthinbar\kern2\smallspace\repeatcolon}} -\def\repeatstopstart{\hbox{\repeatcolon\kern2\smallspace\defaultthickbar\kern\smallspace\defaultthickbar\kern2\smallspace\repeatcolon}} - -%compatibility -\def\repeatbar{\repeatstopbar} -\def\startrepeat{\repeatstartbar} -\def\repeatbarstartrepeat{\repeatstopstart} - -\def\vruler#1{{% - \def\wid{\dimen0}% - \def\inc{\dimen1}% - \wid=#1pt - \inc=\wid - \divide\inc by #1 - \divide\wid by 2 - \here=-\wid - \loop\ifdim\here<\wid\advance\here by\inc - \hbox to0pt{\vbox to0pt{\vss\hrule width2pt height 0.05pt\kern\here}\hss}% - \repeat% -}} -\def\hruler#1#2{\hbox{% - \def\wid{\dimen0}% - \def\here{\dimen3}% - \wid=#1pt - \divide\wid by 2 - \here=-\wid - \loop\ifdim\here<\wid\advance\here by #2 - \hbox to0pt{\kern\here\vrule width0.05pt height 1pt depth 1pt\hss}% - \repeat% -}} - - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% parametric symbols -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -\def\doublebar#1{\hbox{\thinbar{#1}\hskip\smallspace\thinbar{#1}}} -\def\thinbar#1{\dimen0=#1% - \vrule height .5\dimen0 depth .5\dimen0 width 1.6\staffrulethickness} % TODO parametric. -\def\thickbar#1{\dimen0=#1% - \vrule height .5\dimen0 depth .5\dimen0 width 2\smallspace} -\def\maatstreep#1{\thinbar{#1}} -\def\startbar#1{\leftalign{\thickbar{#1}\kern\smallspace\thinbar{#1}}} -\def\finishbar#1{\rightalign{\thinbar{#1}\kern\smallspace\thickbar{#1}}} - - -\def\stem#1#2{\hbox{\kern -.5\stemthickness - \vrule width\stemthickness height#2 depth-#1}} - -\def\placebox#1#2#3{% - \botalign{\hbox{\raise #1\leftalign{\kern #2{}#3}}}% +%% Urgh. LilyPond uses EC fonts, but texinfo is based on CM. We thus +%% have to handle T1 font encoding by ourselves; all manipulations are +%% collected in the macro \lilypondECencoding. Note that the following +%% code only provides the texinfo interface, not complete access to all +%% EC glyphs. +%% +%% All definitions are taken from texinfo or LaTeX (with modifications +%% if necessary). +%% +\begingroup +\catcode `\@=11\relax +\gdef\lilypondECencoding{ + \def\"##1{ + {\accent4 ##1}} + \def\'##1{ + {\accent1 ##1}} + \def\,##1{ + {\leavevmode + \setbox\z@\hbox{##1} + \ifdim\ht\z@=1ex + \accent11 ##1 + \else + {\ooalign{ + \unhbox\z@ + \crcr + \hidewidth + \char11 + \hidewidth}} + \fi}} + \def\=##1{ + {\accent9 ##1}} + \def\^##1{ + {\accent2 ##1}} + \def\`##1{ + {\accent0 ##1}} + \def\~##1{ + {\accent3 ##1}} + \def\dotaccent##1{ + {\accent10 ##1}} + \def\H##1{ + {\accent5 ##1}} + \def\ringaccent##1{ + {\accent6 ##1}} +% \def\tieaccent##1{} % unsupported: this is TS1 + \def\u##1{ + {\accent8 ##1}} + \def\ubaraccent##1{ + {\o@lign{ + \relax + ##1 + \crcr + \hidewidth + \sh@ft{29}\vbox to.2ex{ + \hbox{\char9} + \vss} + \hidewidth}}} + \def\udotaccent##1{ + {\o@lign{ + \relax + ##1 + \crcr + \hidewidth + \sh@ft{10}. + \hidewidth}}} + \def\v##1{ + {\accent7 ##1}} + + \chardef\exclamdown=189 + \chardef\questiondown=190 + + \def\aa{ + \ringaccent{a}} + \def\AA{ + \ringaccent{A}} + \chardef\AE=198 + \chardef\ae=230 + \chardef\ptexi=25 + \chardef\j=26 + \chardef\L=138 + \chardef\l=170 + \chardef\O=216 + \chardef\o=248 + \chardef\OE=215 + \chardef\oe=247 + \chardef\ss=255 } +\endgroup + +%% This macro provides the necessary setup to make the lilypond data +%% work with plain TeX, LaTeX, and texinfo. +%% +%% The reason of using \begingroup and \endgroup is to make the macro \x +%% immediately disappear after it has been executed. Since we have \def +%% within \def within \gdef, four hash signs (`#') are needed for +%% parameters. +%% +%% \lilypondfontencoding is emitted by LilyPond to set the encoding of +%% text strings. +%% +\gdef\lilypondstart{ + \frenchspacing + \outputscale \lilypondpaperoutputscale\lilypondpaperunit + + \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 + + \def\lilypondfontencoding####1{ + \lilypondECencoding} + \def\lilypondpagebreak{ + \eject} + \def\lilypondnopagebreak{ + \ifvmode + \penalty 10000\relax + \fi}}} + + {%% LaTeX mode: Provide a complete preamble. + \def\x{ + \endgroup + + %% Indicate that we shall emit `\end{document}' while executing + %% \lilypondend. + \def\lilyponddocument{} + + \def\lilypondfontencoding####1{ + \fontencoding{####1} + \selectfont} + \def\lilypondpagebreak{ + \newpage} + \def\lilypondnopagebreak{ + \nopagebreak} + + \documentclass[\lilyponddocumentclassoptions]{article} + + %% As a safety guard, don't produce auxiliary files. + \nofiles + + %% FIXME: workaround non-existent TeX.def. + \def\TeXdef{TeX}\ifx\TeXdef\lilypondpaperinputencoding + \usepackage[latin1]{inputenc} + \else + \usepackage[\lilypondpaperinputencoding]{inputenc} + \fi + \pagestyle{empty} + + \usepackage{color} + + \lilypondifundefined{lilypondclassic} + {%% If not in `classic' mode, undo LaTeX's page layout settings + %% since LilyPond does the layout by itself. + \topmargin-1in + \headheight0pt\headsep0pt + \oddsidemargin-1in + \evensidemargin\oddsidemargin} + + {%% Otherwise center output horizontally, without changing the + %% vertical positioning. + \hsize\lilypondpaperlinewidth\lilypondpaperunit + \lytempdim \paperwidth + \advance\lytempdim -\the\hsize + \lytempdim 0.5\lytempdim + \advance\lytempdim -1in + \oddsidemargin \lytempdim + \evensidemargin \lytempdim} + + \parindent 0pt + + %% We can't directly say `\begin{document}' in this macro since + %% older versions of texinfo.tex define \begin as \outer; this + %% means that it causes an error if \begin is found within another + %% macro (even if the corresponding code will never be executed). + %% As a workaround we use \csname to call \begin. + \csname begin\endcsname{document}}} + \x} + +%% The opposite of \lilypondstart. +%% +\gdef\lilypondend{ + %% Handle the `lastpagefill' parameter from the \layout block. + %% Ignore it if \lilypondbook is defined. + \lilypondifundefined{lilypondbook} + {\lilypondifundefined{lilypondpaperlastpagefill} + {\vskip 0pt plus\lilypondpaperinterscorelinefill00 fill} + {}} + {} + + \begingroup + \lilypondifundefined{lilyponddocument} + {\def\x{ + \endgroup}} + {\def\x{ + \endgroup + \csname end\endcsname{document}}} + \x} + +%% Load the PostScript drawing routines. This is done using \special. +%% To avoid multiple inclusions, redefine \lilypondspecial to a no-op +%% afterwards. +%% +\gdef\lilypondspecial{ + \special{header=music-drawing-routines.ps} + \gdef\lilypondspecial{}} +%% The most used macro in LilyPond output. Put #3 into a zero-width box +%% which is moved to the right by #1 (scaled by \outputscale) and moved +%% up by #2 (also scaled by \outputscale). +%% +\gdef\lyitem#1#2#3{ + \raise #2\outputscale \hbox to 0pt { + \kern #1\outputscale + #3 + \hss}} + +%% All LilyPond music data is enclosed in this macro (as third argument). +%% The data (which consists of boxes with zero width) gets an artificial +%% width of #1 and a height of #2. The resulting box is then centered +%% vertically along the x-height of the current font. +%% +%% Parameters #1 and #2 are scaled by \outputscale. +%% +\gdef\lybox#1#2#3{ + \lytempdim #2\outputscale + \lytempdim -0.5\lytempdim + \advance\lytempdim 1ex + \leavevmode + \raise \lytempdim \hbox to #1\outputscale { + %% Convert depth of #3 into height only. + \vbox to #2\outputscale {\hbox{#3}\vss} + \hss}} + +%% Produce a black bar (width #2, depth #3, height #4) with a vertical +%% offset #1. Everything is scaled by \outputscale. +%% +\gdef\lyvrule#1#2#3#4{ + \kern#1\outputscale + \vrule width #2\outputscale depth #3\outputscale height #4\outputscale} -\def\rulesym#1#2{\dimen0=#1% - \vrule height .5\dimen0 depth .5\dimen0 width #2} -\ifundefined{documentclass} - \def\settext#1{\normaltextfont #1} - \def\setitalic#1{\italicfont #1} - \def\setbold#1{\boldfont #1} - \def\setlarge#1{\largefont #1} -\fi - -\def\setdynamic#1{\dynfont #1} -\def\setfinger#1{\fingerfont #1} -\def\setnumber#1{\fetanummer #1} - -% the interline symbol. Redefine to remove it. -\def\defaultlineseparator{\vbox{\mussepline\vskip -5pt\mussepline}} -\def\lineseparator{\defaultlineseparator} -\def\beauty{% - \par\vskip 10pt plus 30pt minus 10pt\par - \hskip -5pt\lineseparator - \par\vskip 10pt plus 30pt minus 10pt\par -} +%% FIXME: 'interscoreline' and 'lilypondPAPERinterscoreline +%% +\lilypondifundefined{lilypondpaperinterscorelinefill} + {\gdef\lilypondpaperinterscorelinefill{0}} + {\gdef\lilypondpaperinterscorelinefill{1}} +%% Allow overriding of interscoreline, e.g., for LilyPond's --preview +%% +\lilypondifundefined{interscoreline} + {\lilypondifundefined{lilypondclassic} + {\gdef\interscoreline{}} + {\gdef\interscoreline{ + \vskip\lilypondpaperinterscoreline\lilypondpaperunit + plus \lilypondpaperinterscorelinefill fill}}} + {} + +%% Include PostScript definitions (which are differently defined for +%% TeX and pdfTeX). This is loaded once only because the inputted files +%% define \lilypondpostscript. +%% +%% (Don't remove the spaces after the arguments to \input!) +%% +% +%% In teTeX-3.0, latex is actually pdfetex, and we need +%% ifpdf.sty to determinine if we are really *tex or pdf*tex. +% +%% \input ifpdf.sty +% +%% However, ifpfd.sty is too smart for LilyPond, so we copy the +%% logic here. Using \input ifpdf.sty is a no-op when using latex, +%% and the \ifpdf switch is needed before \documentclass, using +%% \usepackage{ifpdf} is not an option. +% +\input lily-ps-defs + +% barfs with texi +% Runaway argument? +%{ +%! Forbidden control sequence found while scanning use of \lilypondfirst. +% +% \par +% +% \newif +%l.330 {\newif +% \ifpdf +%? +% +%% +%\lilypondifundefined{lilypondpostscript} +% {\newif\ifpdf +% \ifx\pdfoutput\undefined +% \else +% \ifx\pdfoutput\relax +% \else +% \ifcase\pdfoutput +% \else +% \pdftrue +% \fi +% \fi +% \fi +% \ifpdf +% {\input lily-pdf-defs } +% \else +% {\input lily-ps-defs } +% \fi} +% {} +% +%% Restore newline functionality (disabled to avoid \par). +%% +\endlinechar \lilyponddefsELC +\endinput -\def\interscoreline{\vskip 16pt} - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% big fat marks, if errors are detected. -\def\columnerrormark{\placebox{-5pt}{0pt}{\bf C!}} -\def\scorelineerrormark{\placebox{0pt}{-10pt}{\bf L!}} -\def\errormark{{\bf E!}} -\def\unknown{{\bf u}} - -\def\postheader{} -\ifundefined{documentclass} - \footline={\ifnum\pageno=1 - {\smalltextfont\mudelacopyright\hfil \LilyIdString - }\else{\hfil\the\pageno\hfil}\fi -}\else - %% FIXME - \def\ps@plain{ - \renewcommand{\@oddhead}{}% - \renewcommand{\@evenfoot}{}% - \renewcommand{\@evenhead}{}% - \renewcommand{\@oddfoot}{\ifnum\thepage=1 - {\hfil \LilyIdString - }\else{foo\hfil\the\pageno\hfil}\fi}} - \def\ps@empty{ - \renewcommand{\@oddhead}{}% - \renewcommand{\@evenfoot}{}% - \renewcommand{\@evenhead}{}% - \renewcommand{\@oddfoot}{\ifnum\thepage=1 - {\hfil \LilyIdString - }\else{foo\hfil\the\pageno\hfil}\fi}} -\fi - - -% debugging stuff: -% \vbox to 0pt{\vskip .5cm \hruler{48}{3pt}\vss} +%% end lilyponddefs.tex