]> git.donarmstrong.com Git - lilypond.git/commitdiff
2002-09-15 Werner Lemberg <wl@gnu.org>
authorHan-Wen Nienhuys <hanwen@xs4all.nl>
Sun, 15 Sep 2002 11:22:38 +0000 (11:22 +0000)
committerHan-Wen Nienhuys <hanwen@xs4all.nl>
Sun, 15 Sep 2002 11:22:38 +0000 (11:22 +0000)
Improving LilyPond's output to make them ordinary TeX boxes with
predictable dimensions.  System boxes are now vertically centered on
the baseline; this offset can be further controlled with
\lilypondscoreshift.

* lily/system.cc (System::post_processing): Pass length of current
system to `start-system' (including any horizontal indentation).

* scm/tex.scm, scm/pdftex.scm: Make output of various functions
prettier.
(lily-def): Append `%'.
(start-system): Add parameter `wd'.  Output more TeX code to specify
box dimensions.
(stop-system, stop-last-system): Complement changes in
`start-system'.
* scm/sketch.scm, scm/ps.scm, scm/pdf.scm, scm/ascii-script.scm:
Updated.

* scripts/ly2dvi.py (global_latex_definition): Set \parindent to 0.
* buildscripts/mf-to-table.py (write_tex_defs): Append `%'.
Write final `\endinput'.

* tex/lily-ps-defs.tex, tex/lily-pdf-defs.tex,
tex/lilypond-plaintex.tex, tex/lilypond-latex.tex,
tex/lilyponddefs.tex, tex/titledefs.tex: Reformat code.  Assure that
files and macro definitions don't produce spurious spaces and
paragraphs (using \endlinechar).
* tex/lilyponddefs.tex: New dimension `\scoreshift'.

* Documentation/user/internals.itely: Improved formatting, fixing
typos
Added a section `Output details' to describe how the TeX code
looks like.

16 files changed:
Documentation/user/internals.itely
buildscripts/mf-to-table.py
lily/system.cc
scm/ascii-script.scm
scm/pdf.scm
scm/pdftex.scm
scm/ps.scm
scm/sketch.scm
scm/tex.scm
scripts/ly2dvi.py
tex/lily-pdf-defs.tex
tex/lily-ps-defs.tex
tex/lilypond-latex.tex
tex/lilypond-plaintex.tex
tex/lilyponddefs.tex
tex/titledefs.tex

index b15d2fa5bf4267776dd76aa3511c061ac5d6b3dc..c60766df946b4aad711b50884af2ba23f8057934 100644 (file)
@@ -17,39 +17,41 @@ phases.  We list them here:
 @c todo: moved from refman. 
 
 The purpose of LilyPond is explained informally by the term `music
-typesetter'.  This is not a fully correct name: not only does the
+typesetter'.  This is not a fully correct name: Not only does the
 program print musical symbols, it also makes aesthetic decisions.
 Symbols and their placements are @emph{generated} from a high-level
 musical description.  In other words, LilyPond would be best described
-by `music compiler' or `music to notation compiler'.
+to be a `music compiler' or `music to notation compiler'.
 
 LilyPond is linked to GUILE, GNU's Scheme library for extension
-programming. The Scheme library provides the glue that holds together
+programming.  The Scheme library provides the glue that holds together
 the low-level routines and separate modules which are written in C++.
 
 When lilypond is run to typeset sheet music, the following happens:
+
 @itemize @bullet
-@item GUILE Initialization: various scheme files are read
-@item parsing: first standard @code{ly} initialization  files are read, and
+@item GUILE initialization: Various scheme files are read.
+
+@item Parsing: First standard @code{ly} initialization files are read,
 then the user @file{ly} file is read.
-@item interpretation: the music in the file is processed ``in playing
-order'', i.e. the order that  you  use to read sheet music, or the
-order in which notes are played. The result of this step is a typesetting
-specification.
 
-@item typesetting:
-The typesetting specification is solved: positions and formatting is
-calculated.
+@item Interpretation: The music in the file is processed `in playing
+order', i.e., the order that you use to read sheet music, or the
+order in which notes are played.  The result of this step is a
+typesetting specification.
 
-@item the visible results ("virtual ink") are written to the output file.
+@item Typesetting: The typesetting specification is solved: positions
+and formatting is calculated.
+
+@item The visible results ("virtual ink") are written to the output file.
 @end itemize
 
 During these stages different types of data play the the main role:
-during parsing, @strong{Music} objects are created.  During the
+During parsing, @strong{Music} objects are created.  During the
 interpretation, @strong{contexts} are constructed, and with these
-contexts a network of @strong{graphical objects} (``grobs'') is
-created. These grobs contain unknown variables, and the network forms a
-set of equations. After solving the equations and filling in these
+contexts a network of @strong{graphical objects} (`grobs') is
+created.  These grobs contain unknown variables, and the network forms a
+set of equations.  After solving the equations and filling in these
 variables, the printed output is written to an output file.
 
 These threemanship of tasks (parsing, translating, typesetting) and
@@ -57,61 +59,56 @@ data-structures (music, context, graphical objects) permeates the entire
 design of the program.
 
 
-
 @table @b
 
-@item Parsing:
+@item Parsing
 
-The LY file is read, and converted to a list of @code{Scores}, which
-each contain @code{Music} and paper/midi-definitions. Here @code{Music},
-@code{Pitch} and @code{Duration}  objects are created.
+The @code{ly} file is read and converted to a list of @code{Scores}, which
+each contain @code{Music} and paper/midi-definitions.  Here @code{Music},
+@code{Pitch}, and @code{Duration} objects are created.
 
 @item Interpreting music
 @cindex interpreting music
 
-All music events are "read" in the same order as they would be played
-(or read from paper). At every step of the interpretation, musical
-events are delivered to
-interpretation contexts,
+All music events are `read' in the same order as they would be played
+(or read from paper).  At every step of the interpretation, musical
+events are delivered to interpretation contexts,
 @cindex engraver
-which use them to build @code{Grob}s (or MIDI objects, for MIDI output).
+which use them to build @code{Grob}s (or MIDI objects for MIDI output).
 
 In this stage @code{Music_iterators} do a traversal of the @code{Music}
-structure. The music events thus encountered are reported to
+structure.  The music events thus encountered are reported to
 @code{Translator}s, a set of objects that collectively form interpretation
 contexts.
 
-
 @item Prebreaking
-
 @cindex prebreaking
 
 At places where line breaks may occur, clefs and bars are prepared for
 a possible line break. 
 
 @item Preprocessing
-
 @cindex preprocessing
 
 In this stage, all information that is needed to determine line breaking
 is computed. 
 
-@item Break calculation:
+@item Break calculation
 
 The lines and horizontal positions of the columns are determined.
 
 @item Breaking
 
 Relations between all grobs are modified to reflect line breaks: When a
-spanner, e.g. a slur, crosses a line-break, then the spanner is "broken
-into pieces", for every line that the spanner is in, a copy of the grob
-is made. A substitution process redirects all grob-reference so that
+spanner, e.g. a slur, crosses a line break, then the spanner is `broken
+into pieces'; for every line that the spanner is in, a copy of the grob
+is made.  A substitution process redirects all grob references so that
 each spanner grob will only reference other grobs in the same line.
 
-@item Outputting:
+@item Outputting
 
 All vertical dimensions and spanning objects are computed, and all grobs
-are output, line by line. The output is encoded in the form of
+are output, line by line.  The output is encoded in the form of
 @code{Molecule}s
 
 @end table
@@ -120,13 +117,13 @@ The data types that are mentioned here are all discussed in this
 section.
 
 
-
 @c FIXME: Note entry vs Music entry at top level menu is confusing.
 @c . {Music entry}
 @menu
 * Interpretation context::      
 * Syntactic details::           
 * Lexical details::             
+* Output details::               
 @end menu
 
 
@@ -145,35 +142,38 @@ section.
 
 Interpretation contexts are objects that only exist during a run of
 LilyPond.  During the interpretation phase of LilyPond (when it prints
-"interpreting music"), the music expression in a @code{\score} block is
-interpreted in time order. This is the same order that humans hear and
-play the music.
+@code{interpreting music} to standard output), the music expression in
+a @code{\score} block is interpreted in time order.  This is the same
+order that humans hear and play the music.
 
 During this interpretation, the interpretation context holds the
-state for the current point within the music. It contains information
+state for the current point within the music.  It contains information
 like
 
 @itemize @bullet
-  @item What notes are playing at this point?
-  @item What symbols will be printed at this point?
-  @item What is the current key signature, time signature, point within
-       the measure, etc.?
+@item What notes are playing at this point?
+
+@item What symbols will be printed at this point?
+
+@item What is the current key signature, time signature, point within
+the measure, etc.?
 @end itemize
 
 Contexts are grouped hierarchically: A @internalsref{Voice} context is
 contained in a @internalsref{Staff} context (because a staff can contain
 multiple voices at any point), a @internalsref{Staff} context is contained in
-@internalsref{Score}, @internalsref{StaffGroup}, or @internalsref{ChoirStaff} context.
+@internalsref{Score}, @internalsref{StaffGroup}, or
+@internalsref{ChoirStaff} context.
 
 Contexts associated with sheet music output are called @emph{notation
 contexts}, those for sound output are called @emph{performance
-contexts}. The default definitions of the standard notation and
+contexts}.  The default definitions of the standard notation and
 performance contexts can be found in @file{ly/engraver-init.ly} and
 @file{ly/performer-init.ly}, respectively.
 
+
 @node Creating contexts
 @subsection Creating contexts
-
 @cindex @code{\context}
 @cindex context selection
 
@@ -181,11 +181,12 @@ Contexts for a music expression can be selected manually, using the
 following music expression.
 
 @example
-  \context @var{contexttype} [= @var{contextname}] @var{musicexpr}
+\context @var{contexttype} [= @var{contextname}] @var{musicexpr}
 @end example
 
+@noindent
 This instructs lilypond to interpret @var{musicexpr} within the context
- of type @var{contexttype} and with name @var{contextname}.  If this
+of type @var{contexttype} and with name @var{contextname}.  If this
 context does not exist, it will be created.  
 
 @lilypond[verbatim,singleline]
@@ -194,9 +195,9 @@ context does not exist, it will be created.
     c4 <d4 \context Staff = "another" e4> f
   }
 }
-
 @end lilypond
 
+@noindent
 In this example, the @code{c} and @code{d} are printed on the
 default staff.  For the @code{e}, a context Staff called
 @code{another} is specified; since that does not exist, a new
@@ -206,15 +207,13 @@ context is finished, the context is ended as well.  So after the
 third quarter, @code{another} is removed.
 
 
-
 @node Default contexts
 @subsection Default contexts
 
 Most music expressions don't need an explicit @code{\context}
-declaration: they inherit the 
-notation context from their parent. Each note is a music expression, and
-as you can see in the following example, only the sequential music
-enclosing the three notes has an explicit context. 
+declaration: they inherit the notation context from their parent.  Each
+note is a music expression, and as you can see in the following example,
+only the sequential music enclosing the three notes has an explicit context. 
 
 @lilypond[verbatim,singleline]
 \score { \notes \context Voice = goUp { c'4 d' e' } } 
@@ -223,30 +222,32 @@ enclosing the three notes has an explicit context.
 There are some quirks that you must keep in mind when dealing with
 defaults:
 
-First, every top level music is interpreted by the Score context, in other
+First, every top level music is interpreted by the Score context; in other
 words, you may think of @code{\score} working like
+
 @example
-        \score @{
-                \context Score @var{music}
-        @}
+\score @{
+  \context Score @var{music}
+@}
 @end example
 
 Second, contexts are created automatically to be able to interpret the
-music expressions. Consider the following example.
+music expressions.  Consider the following example.
 
 @lilypond[verbatim, singleline]
-\score { \context Score \notes { c'4 (  d' )e' } }
+\score { \context Score \notes { c'4 ( d' )e' } }
 @end lilypond
 
+@noindent
 The sequential music is interpreted by the Score context initially
 (notice that the @code{\context} specification is redundant), but when a
-note is encountered, contexts are setup to accept that note. In this
-case, a Thread, Voice and Staff are created. The rest of the sequential
-music is also interpreted with the same Thread, Voice and Staff context,
-putting the notes on the same staff, in the same voice.
+note is encountered, contexts are setup to accept that note.  In this
+case, a Thread, Voice, and Staff context are created.  The rest of the
+sequential music is also interpreted with the same Thread, Voice, and
+Staff context, putting the notes on the same staff, in the same voice.
 
 This is a convenient mechanism, but do not expect opening chords to work
-without @code{\context}. For every note, a separate staff is
+without @code{\context}.  For every note, a separate staff is
 instantiated.
 
 @cindex explicit context
@@ -260,73 +261,78 @@ instantiated.
 Of course, if the chord is preceded by a normal note in sequential
 music, the chord will be interpreted by the Thread of the preceding
 note:
+
 @lilypond[verbatim,singleline]
-\score { \notes { c'4 <c'4 es'> }  }
+\score { \notes { c'4 <c'4 es'> } }
 @end lilypond
 
 
-
 @node Context properties
 @subsection Context properties
 
-Notation contexts have properties. These properties are from
-the @file{.ly} file using the following  expression:
+Notation contexts have properties.  These properties are from
+the @file{.ly} file using the following expression:
 @cindex @code{\property}
+
 @example
-  \property @var{contextname}.@var{propname} =  @var{value}
+\property @var{contextname}.@var{propname} = @var{value}
 @end example
 
+@noindent
 Sets the @var{propname} property of the context @var{contextname} to the
 specified Scheme expression @var{value}.  All @var{propname} and
 @var{contextname} are strings, which are typically unquoted.
 
 Properties that are set in one context are inherited by all of the
 contained contexts.  This means that a property valid for the
-@internalsref{Voice} context can be set in the @internalsref{Score} context (for
-example) and thus take effect in all @internalsref{Voice} contexts.
+@internalsref{Voice} context can be set in the @internalsref{Score} context
+(for example) and thus take effect in all @internalsref{Voice} contexts.
 
 @cindex @code{Current}
 If you don't wish to specify the name of the context in the
-@code{\property}-expression
-itself, you can refer to the abstract context name,
-@code{Current}. The @code{Current} context is the latest
-used context. This will typically mean the @internalsref{Thread}
+@code{\property}-expression itself, you can refer to the abstract context
+name, @code{Current}.  The @code{Current} context is the latest
+used context.  This will typically mean the @internalsref{Thread}
 context, but you can force another context with the
-@code{\property}-command. Hence the expressions
+@code{\property}-command.  Hence the expressions
 
 @example
-  \property @var{contextname}.@var{propname} = @var{value}
+\property @var{contextname}.@var{propname} = @var{value}
 @end example
 
+@noindent
 and
 
 @example
-  \context @var{contextname}
-  \property Current.@var{propname} = @var{value}
+\context @var{contextname}
+\property Current.@var{propname} = @var{value}
 @end example
 
+@noindent
 do the same thing.
-The main use for this is in macros - allowing the specification of a
+The main use for this is in macros -- allowing the specification of a
 property-setting without restriction to a specific context.
 
 Properties can be unset using the following expression:
+
 @example
-  \property @var{contextname}.@var{propname} \unset
+\property @var{contextname}.@var{propname} \unset
 @end example
 
 @cindex properties, unsetting
 @cindex @code{\unset} 
 
-This removes the definition of @var{propname} in @var{contextname}. If
+@noindent
+This removes the definition of @var{propname} in @var{contextname}.  If
 @var{propname} was not defined in @var{contextname} (but was inherited
 from a higher context), then this has no effect.
 
-
 @refbugs
 
 The syntax of @code{\unset} is asymmetric: @code{\property \unset} is not
 the inverse of @code{\property \set}.
 
+
 @node Engravers and performers
 @subsection Engravers and performers
 
@@ -336,75 +342,87 @@ Basic building blocks of translation are called engravers; they are
 special C++ classes.
 
 
-
 @node Changing context definitions
 @subsection Changing context definitions
-
 @cindex context definition
 @cindex translator definition
 
 The most common way to define a context is by extending an existing
-context.  You can change an existing context from the paper block, by
+context.  You can change an existing context from the paper block by
 first initializing a translator with an existing context identifier:
+
 @example
 \paper @{
   \translator @{
     @var{context-identifier}
-  @} @}
+  @}
+@}
 @end example
+
+@noindent
 Then you can add and remove engravers using the following syntax:
+
 @example
- \remove @var{engravername}
- \consists @var{engravername}
+\remove @var{engravername}
+\consists @var{engravername}
 @end example
 
-
+@noindent
 Here @var{engravername} is a string, the name of an engraver in the
 system.
 
-
 @lilypond[verbatim,singleline]
-\score {  \notes {
-        c'4 c'4 }
+\score {
+  \notes {
+    c'4 c'4
+  }
   \paper {
-    \translator  { \StaffContext
-        \remove Clef_engraver
-       } } }
+    \translator {
+      \StaffContext
+      \remove Clef_engraver
+    }
+  }
+}
 @end lilypond
 
 @cindex engraver
 
-You can also set properties in a translator definition. The syntax is as
+You can also set properties in a translator definition.  The syntax is as
 follows:
+
 @example
- @var{propname} = @var{value}
- @var{propname} \set  @var{grob-propname} = @var{pvalue}
- @var{propname} \override @var{grob-propname} =  @var{pvalue}
- @var{propname} \revert @var{grob-propname} 
+@var{propname} = @var{value}
+@var{propname} \set @var{grob-propname} = @var{pvalue}
+@var{propname} \override @var{grob-propname} = @var{pvalue}
+@var{propname} \revert @var{grob-propname} 
 @end example
+
+@noindent
 @var{propname} is a string, @var{grob-propname} a symbol, @var{value}
-and @code{pvalue} are Scheme expressions. These type of property
+and @code{pvalue} are Scheme expressions.  These types of property
 assignments happen before interpretation starts, so a @code{\property}
 command will override any predefined settings.
 
-
- To simplify editing translators, all standard contexts have standard
+To simplify editing translators, all standard contexts have standard
 identifiers called @var{name}@code{Context}, e.g. @code{StaffContext},
-@code{VoiceContext}, see @file{ly/engraver-init.ly}.
+@code{VoiceContext}; see @file{ly/engraver-init.ly}.
+
 
 @node Defining new contexts
 @subsection Defining new contexts
 
 If you want to build a context from scratch, you must also supply the
 following extra information:
+
 @itemize @bullet
-  @item  A name, specified by @code{\name @var{contextname}}.
+@item A name, specified by @code{\name @var{contextname}}.
 
-  @item A cooperation module. This is specified by   @code{\type
+@item A cooperation module.  This is specified by @code{\type
 @var{typename}}.
 @end itemize
 
 This is an example:
+
 @example
 \translator @code{
   \type "Engraver_group_engraver"
@@ -416,52 +434,52 @@ This is an example:
 }@
 @end example
 
+@noindent
 The argument of @code{\type} is the name for a special engraver that
 handles cooperation between simple engravers such as
-@code{Note_head_engraver} and @code{Staff_symbol_engraver}. Alternatives
+@code{Note_head_engraver} and @code{Staff_symbol_engraver}.  Alternatives
 for this engraver are the following:
+
 @table @code
 @cindex @code{Engraver_group_engraver}
-  @item @code{Engraver_group_engraver}  
-    The standard cooperation engraver.
 
-@cindex @code{Score_engraver}
-
-  @item @code{Score_engraver}  
-    This is cooperation module that should be in the top level context,
-and only the top level context.
+@item @code{Engraver_group_engraver}  
+The standard cooperation engraver.
 
+@cindex @code{Score_engraver}
+@item @code{Score_engraver}  
+This is a cooperation module that should be in the top level context.
 @end table 
 
-Other modifiers   are
+Other modifiers are
 
 @itemize @bullet
-  @item @code{\alias} @var{alternate-name}
-    This specifies a different name. In the above example,
+@item @code{\alias} @var{alternate-name}:
+This specifies a different name.  In the above example,
 @code{\property Staff.X = Y} will also work on @code{SimpleStaff}s
 
-  @item  @code{\consistsend} @var{engravername} 
-    Analogous to @code{\consists}, but makes sure that
-    @var{engravername} is always added to the end of the list of
-    engravers.
+@item @code{\consistsend} @var{engravername}:
+Analogous to @code{\consists}, but makes sure that
+@var{engravername} is always added to the end of the list of
+engravers.
 
-    Some engraver types need to be at the end of the list; this
-    insures they stay there even if a user adds or removes engravers.
+Some engraver types need to be at the end of the list; this
+insures they stay there even if a user adds or removes engravers.
 End-users generally don't need this command.
     
-  @item  @code{\accepts} @var{contextname}
-    Add @var{contextname} to the list of contexts this context can
-    contain in the context hierarchy. The first listed context is the
-    context to create by default.
+@item @code{\accepts} @var{contextname}:
+Add @var{contextname} to the list of contexts this context can
+contain in the context hierarchy.  The first listed context is the
+context to create by default.
 
-  @item @code{\denies}. The opposite of @code{\accepts}. Added for
+@item @code{\denies}:
+The opposite of @code{\accepts}.  Added for
 completeness, but is never used in practice.
-  
-  @item  @code{\name} @var{contextname} 
-    This sets the type name of the context, e.g. @internalsref{Staff},
-    @internalsref{Voice}.  If the name is not specified, the translator won't do
-    anything. 
+
+@item @code{\name} @var{contextname}:
+This sets the type name of the context, e.g. @internalsref{Staff},
+@internalsref{Voice}.  If the name is not specified, the translator won't do
+anything. 
 @end itemize
 
 In the @code{\paper} block, it is also possible to define translator
@@ -469,7 +487,6 @@ identifiers.  Like other block identifiers, the identifier can only
 be used as the very first item of a translator.  In order to define
 such an identifier outside of @code{\score}, you must do
 
-@quotation
 @example 
 \paper @{
   foo = \translator @{ @dots{} @}
@@ -484,9 +501,6 @@ such an identifier outside of @code{\score}, you must do
 @} 
 @end example 
 
-@end quotation
-
-
 @cindex paper types, engravers, and pre-defined translators
 
       
@@ -509,18 +523,18 @@ This section describes details that were too boring to be put elsewhere.
 @c .  {Identifiers}
 @node Identifiers
 @subsection Identifiers
-@cindex  Identifiers
+@cindex Identifiers
 
 @ignore
- What has this section got to do with identifiers?
- It seems more appropriate in the introduction to Chapter 4,
- "Internals".
+What has this section got to do with identifiers?
+It seems more appropriate in the introduction to Chapter 4,
+"Internals".
 
-   /MB
+  /MB
 @end ignore
 
-All of the information in a LilyPond input file, is internally
-represented as a Scheme value. In addition to normal Scheme data types
+All of the information in a LilyPond input file is internally
+represented as a Scheme value.  In addition to normal Scheme data types
 (such as pair, number, boolean, etc.), LilyPond has a number of
 specialized data types,
 
@@ -537,25 +551,27 @@ specialized data types,
 @item Moment (rational number)
 @end itemize
 
-LilyPond also includes some transient object types. Objects of these
+LilyPond also includes some transient object types.  Objects of these
 types are built during a LilyPond run, and do not `exist' per se within
-your input file. These objects are created as a result of your input
+your input file.  These objects are created as a result of your input
 file, so you can include commands in the input to manipulate them,
-during a lilypond run.
+during a LilyPond run.
 
 @itemize @bullet
-@item Grob: short for Graphical object. 
-@item Molecule: device-independent page output object,
-including dimensions.  Produced by some Grob functions
-@item Translator: object that produces audio objects or Grobs. This is
-not yet user accessible.
-@item Font_metric: object representing a font.
+@item Grob: short for `Graphical object'.
+
+@item Molecule: Device-independent page output object,
+including dimensions.  Produced by some Grob functions.
+
+@item Translator: An object that produces audio objects or Grobs.  This is
+not yet user-accessible.
+
+@item Font_metric: An object representing a font.
 @end itemize
 
 
 @node Music expressions
 @subsection Music expressions
-
 @cindex music expressions
 
 Music in LilyPond is entered as a music expression.  Notes, rests, lyric
@@ -577,72 +593,83 @@ quarter note @code{d}:
 @cindex Simultaneous music
 @cindex @code{\simultaneous}
 
-The two basic compound  music expressions are simultaneous  and
+The two basic compound music expressions are simultaneous and
 sequential music.
 
 @example
-  \sequential @code{@{} @var{musicexprlist} @code{@}}
-  \simultaneous @code{@{} @var{musicexprlist} @code{@}}
+\sequential @code{@{} @var{musicexprlist} @code{@}}
+\simultaneous @code{@{} @var{musicexprlist} @code{@}}
 @end example
+
 For both, there is a shorthand:
+
 @example
-  @code{@{} @var{musicexprlist} @code{@}}
+@code{@{} @var{musicexprlist} @code{@}}
 @end example
+
+@noindent
 for sequential and
+
 @example
-  @code{<} @var{musicexprlist} @code{>}
+@code{<} @var{musicexprlist} @code{>}
 @end example
+
+@noindent
 for simultaneous music.
 In principle, the way in which you nest sequential and simultaneous to
 produce music is not relevant.  In the following example, three chords
 are expressed in two different ways:
 
 @lilypond[fragment,verbatim,center]
-  \notes \context Voice {
-    <a c'> <b  d' > <c' e'>
-    < { a b  c' } { c' d' e' } >
-  }
+\notes \context Voice {
+  <a c'> <b d'> <c' e'>
+  < { a b c' } { c' d' e' } >
+}
 @end lilypond
 
-
 Other compound music expressions include
+
 @example
- \repeat @var{expr}
- \transpose @var{pitch} @var{expr}
- \apply @var{func} @var{expr}
- \context @var{type} = @var{id} @var{expr}
- \times @var{fraction} @var{expr}
+\repeat @var{expr}
+\transpose @var{pitch} @var{expr}
+\apply @var{func} @var{expr}
+\context @var{type} = @var{id} @var{expr}
+\times @var{fraction} @var{expr}
 @end example
 
 
 @c . {Manipulating music expressions}
 @node Manipulating music expressions
-@subsection  Manipulating music expressions
+@subsection Manipulating music expressions
 
 The @code{\apply} mechanism gives you access to the internal
-representation of music. You can write Scheme-functions that operate
-directly on it. The syntax is 
+representation of music.  You can write Scheme-functions that operate
+directly on it.  The syntax is 
+
 @example
-        \apply #@var{func} @var{music}
+\apply #@var{func} @var{music}
 @end example
+
+@noindent
 This means that @var{func} is applied to @var{music}.  The function
 @var{func} should return a music expression.
 
-This example replaces the text string of a script. It also shows a dump
+This example replaces the text string of a script.  It also shows a dump
 of the music it processes, which is useful if you want to know more
 about how music is stored.
 
 @lilypond[verbatim,singleline]
 #(define (testfunc x)
-        (if (equal? (ly-get-mus-property x 'text) "foo")
-                (ly-set-mus-property! x 'text "bar"))
-        ;; recurse
-        (ly-set-mus-property! x 'elements
-          (map testfunc (ly-get-mus-property x 'elements)))
-        (display x)
-        x        
-)
-\score { \notes
+  (if (equal? (ly-get-mus-property x 'text) "foo")
+      (ly-set-mus-property! x 'text "bar"))
+  ;; recurse
+  (ly-set-mus-property! x 'elements
+    (map testfunc (ly-get-mus-property x 'elements)))
+  (display x)
+  x)
+
+\score {
+  \notes
   \apply #testfunc { c'4_"foo" }
 } 
 @end lilypond
@@ -650,8 +677,7 @@ about how music is stored.
 For more information on what is possible, see the automatically
 generated documentation.
 
-
-Directly accessing internal representations is dangerous: the
+Directly accessing internal representations is dangerous: The
 implementation is subject to changes, so you should avoid this feature
 if possible.
 
@@ -670,7 +696,8 @@ A final example is a function that reverses a piece of music in time:
 
 music = \notes { c'4 d'4( e'4 f'4 }
 
-\score { \context Voice {
+\score {
+  \context Voice {
     \music
     \apply #reverse-music \music
   }
@@ -680,6 +707,7 @@ music = \notes { c'4 d'4( e'4 f'4 }
 More examples are given in the distributed example files in
 @code{input/test/}.
 
+
 @c .   {Span requests}
 @menu
 * Span requests::               
@@ -690,29 +718,28 @@ More examples are given in the distributed example files in
 @cindex Span requests
 
 Notational constructs that start and end on different notes can be
-entered using span requests. The syntax is as follows:
-
+entered using span requests.  The syntax is as follows:
 
 @example
-  \spanrequest @var{startstop} @var{type}
+\spanrequest @var{startstop} @var{type}
 @end example
 
-
 @cindex @code{\start}
 @cindex @code{\stop}
 
-This defines a spanning request. The @var{startstop} parameter is either
+@noindent
+This defines a spanning request.  The @var{startstop} parameter is either
 -1 (@code{\start}) or 1 (@code{\stop}) and @var{type} is a string that
 describes what should be started.  Much of the syntactic sugar is a
-shorthand for @code{\spanrequest}, for example,
+shorthand for @code{\spanrequest}, for example
 
 @lilypond[fragment,verbatim,center]
-  c'4-\spanrequest \start "slur"
-  c'4-\spanrequest \stop "slur"
+c'4-\spanrequest \start "slur"
+c'4-\spanrequest \stop "slur"
 @end lilypond
 
 Among the supported types are @code{crescendo}, @code{decrescendo},
-@code{beam}, @code{slur}. This is an internal command.  Users are
+@code{beam}, @code{slur}.  This is an internal command.  Users are
 encouraged to use the shorthands which are defined in the initialization
 file @file{spanners.ly}.
 
@@ -723,8 +750,8 @@ file @file{spanners.ly}.
 @cindex Assignments
 
 Identifiers allow objects to be assigned to names during the parse
-stage.  To assign an identifier, you use @var{name}@code{=}@var{value}
-and to refer to an identifier, you precede its name with a backslash:
+stage.  To assign an identifier, use @var{name}@code{=}@var{value}.
+To refer to an identifier, precede its name with a backslash:
 `@code{\}@var{name}'.  @var{value} is any valid Scheme value or any of
 the input-types listed above.  Identifier assignments can appear at top
 level in the LilyPond file, but also in @code{\paper} blocks.
@@ -745,15 +772,19 @@ foo = \foo * 2.0
 When an identifier is referenced, the information it points to is
 copied.  For this reason, an identifier reference must always be the
 first item in a block.
+
 @example
-\paper  @{
+\paper @{
   foo = 1.0
   \paperIdent % wrong and invalid
 @}
+@end example
 
+@example
 \paper @{
   \paperIdent % correct
-  foo = 1.0 @}
+  foo = 1.0
+@}
 @end example
 
 
@@ -768,49 +799,51 @@ first item in a block.
 @cindex @code{\lyrics}
 
 To simplify entering notes, lyrics, and chords, LilyPond has three
-special input modes in addition to the default mode: note, lyrics and
+special input modes in addition to the default mode: note, lyrics, and
 chords mode.  These input modes change the way that normal, unquoted
-words are interpreted: for example, the word @code{cis} may be
+words are interpreted: For example, the word @code{cis} may be
 interpreted as a C-sharp, as a lyric syllable `cis' or as a C-sharp
 major triad respectively.
 
 A mode switch is entered as a compound music expression
+
 @example
 @code{\notes} @var{musicexpr}
 @code{\chords} @var{musicexpr}
-@code{\lyrics} @var{musicexpr}.
+@code{\lyrics} @var{musicexpr}
 @end example
 
+@noindent
 In each of these cases, these expressions do not add anything to the
 meaning of their arguments.  They just instruct the parser in what mode
 to parse their arguments.
 
 Different input modes may be nested.
 
+
 @c .  {Ambiguities}
 @node Ambiguities
 @subsection Ambiguities
 @cindex ambiguities
 @cindex grammar
 
-
-The grammar contains a number of ambiguities. We hope to resolve them at
+The grammar contains a number of ambiguities.  We hope to resolve them at
 some time.
 
 @itemize @bullet
-  @item  The assignment
+@item The assignment
 
 @example 
 foo = bar 
 @end example 
-         is interpreted as the string identifier assignment. However,
+
+@noindent
+is interpreted as the string identifier assignment.  However,
 it can also be interpreted as making a string identifier @code{\foo}
 containing @code{"bar"}, or a music identifier @code{\foo} containing
 the syllable `bar'.  The former interpretation is chosen.
 
-  @item  If you do a nested repeat like
-
-       @quotation
+@item If you do a nested repeat like
 
 @example 
 \repeat @dots{}
@@ -818,19 +851,18 @@ the syllable `bar'.  The former interpretation is chosen.
 \alternative 
 @end example 
 
-       @end quotation
-
-       then it is ambiguous to which @code{\repeat} the
-       @code{\alternative} belongs.  This is the classic if-then-else
-       dilemma.  It may be solved by using braces.
-
+@noindent
+then it is ambiguous to which @code{\repeat} the
+@code{\alternative} belongs.  This is the classic if-then-else
+dilemma.  It may be solved by using braces.
 @end itemize
 
+
 @c .  {Lexical details}
 @node Lexical details
 @section Lexical details
 
-Even more boring details, now on lexical side of the input parser.
+Even more boring details, now on the lexical side of the input parser.
 
 @menu
 * Direct Scheme::               
@@ -841,46 +873,45 @@ Even more boring details, now on lexical side of the input parser.
 
 @node Direct Scheme
 @subsection Direct Scheme
-
 @cindex Scheme
 @cindex GUILE
 @cindex Scheme, in-line code
-
-
-
-@cindex GUILE
-@cindex Scheme
 @cindex accessing Scheme
 @cindex evaluating Scheme
 @cindex LISP
 
-LilyPond internally uses GUILE, a Scheme-interpreter. Scheme is a
-language from the LISP family. You can learn more about Scheme at
-@uref{http://www.scheme.org}. It is used to represent data throughout
-the whole program. The hash-sign (@code{#}) accesses GUILE directly: the
+LilyPond internally uses GUILE, a Scheme-interpreter.  Scheme is a
+language from the LISP family.  You can learn more about Scheme at
+@uref{http://www.scheme.org}.  It is used to represent data throughout
+the whole program.  The hash-sign (@code{#}) accesses GUILE directly: The
 code following the hash-sign is evaluated as Scheme.  The boolean value
 @var{true} is @code{#t} in Scheme, so for LilyPond @var{true} looks like
 @code{##t}.
 
 LilyPond contains a Scheme interpreter (the GUILE library) for
-internal use. In some places, Scheme expressions also form valid syntax:
-wherever it is allowed,
+internal use.  In some places, Scheme expressions also form valid syntax:
+Wherever it is allowed,
+
 @example
-  #@var{scheme}
+#@var{scheme}
 @end example
+
+@noindent
 evaluates the specified Scheme code.  Example:
+
 @example
-  \property Staff.TestObject \override #'foobar =  #(+ 1 2)
+\property Staff.TestObject \override #'foobar = #(+ 1 2)
 @end example
-@code{\override} expects two Scheme expressions, so there are two Scheme
-expressions. The first one is a symbol (@code{foobar}), the second one
+
+@code{\override} expects two Scheme expressions.
+The first one is a symbol (@code{foobar}), the second one
 an integer (namely, 3).
 
-In-line scheme may be used at the top level. In this case the result is
+In-line Scheme may be used at the top level.  In this case the result is
 discarded.
 
 Scheme is a full-blown programming language, and a full discussion is
-outside the scope of this document. Interested readers are referred to
+outside the scope of this document.  Interested readers are referred to
 the website @uref{http://www.schemers.org/} for more information on
 Scheme.
 
@@ -904,7 +935,7 @@ by a @emph{required} decimal point and an optional exponent such as
 A real constant can be followed by one of the dimension keywords:
 @code{\mm} @code{\pt}, @code{\in}, or @code{\cm}, for millimeters,
 points, inches and centimeters, respectively.  This converts the number
-a number that is the internal representation of that dimension.
+that is the internal representation of that dimension.
 
 
 @node Strings
@@ -918,3 +949,87 @@ sequences have special interpretations as in the C language.  A string
 that contains no spaces can be written without the quotes.  Strings can
 be concatenated with the @code{+} operator.
 
+
+@c .  {Output details}
+@node Output details
+@section Output details
+
+LilyPond's default output format is @TeX{}.  Using the option @option{-f}
+(or @option{--format}) other output formats can be selected also, but
+currently none of them reliably work.
+
+At the beginning of the output file, various global parameters are defined.
+It also contains a large @code{\special} call to define PostScript routines
+to draw items not representable with @TeX{}, mainly slurs and ties.  A DVI
+driver must be able to understand such embedded PostScript, or the output
+will be rendered incompletely.
+
+Then the file @file{lilyponddefs.tex} is loaded to define the macros used
+in the code which follows.  @file{lilyponddefs.tex} includes various other
+files, partially depending on the global parameters.
+
+Now the music is output system by system (a `system' consists of all
+staves belonging together).  From @TeX{}'s point of view, a system is an
+@code{\hbox} which contains a lowered @code{\vbox} so that it is centered
+vertically on the baseline of the text.  Between systems,
+@code{\interscoreline} is inserted vertically to have stretchable space.
+The horizontal dimension of the @code{\hbox} is given by the
+@code{linewidth} parameter from LilyPond's @code{\paper} block (using the
+natural line width if its value is@w{ }@minus{}1).
+
+After the last system LilyPond emits a stronger variant of
+@code{\interscoreline} only if the macro @code{\lilypondpaperlastpagefill}
+is not defined (flushing the systems to the top of the page).  You can
+avoid that manually by saying
+
+@example
+\def\lilypondpaperlastpagefill@{1@}
+@end example
+
+@noindent
+or by setting the variable @code{lastpagefill} in LilyPond's @code{\paper}
+block.
+
+It is possible to fine-tune the vertical offset further by defining the
+macro @code{\lilypondscoreshift}.  Example:
+
+@example
+\def\lilypondscoreshift@{0.25\baselineskip@}
+@end example
+
+@noindent
+@code{\baselineskip} is the distance from one text line to the next.
+
+The code produced by LilyPond can be used by both @TeX{} and La@TeX{}.
+
+Here an example how to embed a small LilyPond file @code{foo.ly} into
+running La@TeX{} text without using the @code{lilypond-book} script
+(@pxref{Integrating text and music with lilypond-book}).
+
+@example
+\documentclass@{article@}
+
+\def\lilypondpaperlastpagefill@{@}
+\lineskip 5pt
+\def\lilypondscoreshift@{0.25\baselineskip@}
+
+\begin@{document@}
+This is running text which includes an example music file
+\input@{foo.tex@}
+right here.
+\end@{document@}
+@end example
+
+The file @file{foo.tex} has been simply produced with
+
+@example
+lilypond foo.ly
+@end example
+
+It is important to set the @code{indent} parameter to zero in the
+@code{\paper} block of @file{foo.ly}.
+
+The call to @code{\lineskip} assures that there is enough vertical space
+between the LilyPond box and the surrounding text lines.
+
+@c EOF
index 5e9ed27a98922e87c24e06e1c094e19de2757714..d8aa7275d931866e163999ab3f4f9b967172225f 100644 (file)
@@ -120,7 +120,8 @@ Comment Automatically generated by mf-to-table.py
 def write_tex_defs (file, global_info, charmetrics):
        nm = global_info['FontFamily']
        for m in charmetrics:
-               file.write (r'''\def\%s%s{\char%d}%s''' % (nm, m['tex'], m['code'],'\n'))
+               file.write (r'''\def\%s%s{\char%d}%%%s''' % (nm, m['tex'], m['code'],'\n'))
+       file.write ('\\endinput\n')
 
 def write_ps_encoding (file, global_info, charmetrics):
        encs = ['.notdef'] * 256
index 2536331c4cbc64a127cb62a4765085f115818788..3af89c89cdd04c3f153360ef58c3c1089b16cf99 100644 (file)
@@ -442,7 +442,10 @@ System::post_processing (bool last_line)
   /*
     line preamble.
    */
+  Interval j (extent (this, X_AXIS));
+  Real length = j[RIGHT];
   output_scheme (scm_list_n (ly_symbol2scm ("start-system"),
+                         gh_double2scm (length),
                          gh_double2scm (height),
                          SCM_UNDEFINED));
   
index 5f5c09752a2988a34e18683d2988430fe4e0c4a5..d25c81946871621175b03bd5cf063347878cc0bf 100644 (file)
        "")                             ; issue no command
     (func "select-font" (car name-mag-pair))))
 
-(define (start-system height)
-  (func "start-system" height))
+(define (start-system width height)
+  (func "start-system" width height))
 
 (define (stop-system)
   (func "stop-system"))
index 62ee967d7a9eef91516097d776ad1219cdc42bbe..6935950bc32e543eb88f3432b16c470d057d57a7 100644 (file)
                     (* (- y1 y2) (- y1 y2)))) 2))))
 
 
-(define (start-system height) "")
+(define (start-system width height) "")
 
 (define (stem breadth width depth height) 
   (filledbox breadth width depth height))
index a3bd441da5878a6ed5eb835e20c117609dcda358..d6fb88196917035e2b9ed7b2faf64f16122d5319 100644 (file)
@@ -20,7 +20,7 @@
 
 (define this-module (current-module))
 (define (unknown) 
-  "%\n\\unknown%\n")
+  "%\n\\unknown\n")
 
 
 (define (select-font name-mag-pair)
   (begin
                                        ; uncomment for some stats about lily memory      
                                        ;               (display (gc-stats))
-    (string-append "\n\\EndLilyPondOutput"
+    (string-append "%\n\\EndLilyPondOutput\n"
                                        ; Put GC stats here.
                   )))
 
                    ((equal? (ly-unit) "pt") (/ 72.0  72.27))
                    (else (error "unknown unit" (ly-unit)))
                    ))
-   "}\n"
-   "\\input lilyponddefs \\outputscale=\\lilypondpaperoutputscale \\lilypondpaperunit"
-   "\\turnOnPostScript"
+   "}%\n"
+   "\\input lilyponddefs\n"
+   "\\outputscale=\\lilypondpaperoutputscale \\lilypondpaperunit\n"
+   "\\turnOnPostScript\n"
    "\\pdfcompresslevel=0"))
 
 ;; Note: this string must match the string in ly2dvi.py!!!
        (tex-val (output-tex-string val)))
     (if (equal? (sans-surrounding-whitespace tex-val) "")
        (string-append "\\let\\" tex-key "\\undefined\n")
-       (string-append "\\def\\" tex-key "{" tex-val "}\n"))))
+       (string-append "\\def\\" tex-key "{" tex-val "}%\n"))))
 
 (define (number->dim x)
   (string-append
 (define (bezier-sandwich l thick)
   (embedded-pdf (list 'bezier-sandwich  `(quote ,l) thick)))
 
-(define (start-system ht)
-  (string-append"\\vbox to " (number->dim ht) "{\\hbox{%\n"))
+(define (start-system wd ht)
+  (string-append "\\leavevmode\n"
+                "\\scoreshift = " (number->dim (* ht 0.5)) "\n"
+                "\\ifundefined{lilypondscoreshift}%\n"
+                "\\else\n"
+                "  \\advance\\scoreshift by -\\lilypondscoreshift\n"
+                "\\fi\n"
+                "\\hbox to " (number->dim wd) "{%\n"
+                "\\lower\\scoreshift\n"
+                "\\vbox to " (number->dim ht) "{\\hbox{%\n"))
 
 (define (stop-system) 
-  "}\\vss}\\interscoreline\n")
+  "}\\vss}\\hss}\\interscoreline\n")
 (define (stop-last-system)
-  "}\\vss}")
+  "}\\vss}\\hss}")
 (define (filledbox breapth width depth height) 
   (string-append 
    "\\kern" (number->dim (- breapth))
index ab2520e3b1f35a3c80b28ebc7f6df4a161e79e05..0548fac4a84dbc2f31f7c977f7c658142d39f809 100644 (file)
 
                                        ; TODO: use HEIGHT argument
 
-  (define (start-system height)
-  (string-append
-   "\n"
-   (ly-number->string height)
-   " start-system {
-set-ps-scale-to-lily-scale
-
-"))
+(define (start-system width height)
+  (string-append "\n" (ly-number->string height)
+                " start-system\n"
+                "{\n"
+                "set-ps-scale-to-lily-scale"))
 
 (define (stem breapth width depth height) 
   (string-append (numbers->string (list breapth width depth height))
index e5b2cd7a54caedfc0af8b99694289b521dee8b1f..370081a0de67cde1930ba0c155ddfc202cd25782 100644 (file)
@@ -247,9 +247,9 @@ layer('Layer 1',1,1,0,0,(0,0,0))
    sketch-beziers (list x y (primitive-eval l) thick)))
 
 ; TODO: use HEIGHT argument
-(define (start-system height)
+(define (start-system width height)
    "G()\n"
-   )
+)
 
 ;;  r((520.305,0,0,98.0075,51.8863,10.089))
 ;;  width, 0, 0, height, x, y
index d6e6c9d54364b4f91458e6a7db2def9bdf2b16c2..9015e04961377ab6bbd11ed780f3b7fab14b9308 100644 (file)
@@ -51,7 +51,7 @@
 
 
 (define (unknown) 
-  "%\n\\unknown%\n")
+  "%\n\\unknown\n")
 
 (define (select-font name-mag-pair)
   (let*
   (begin
                                        ; uncomment for some stats about lily memory      
                                        ;               (display (gc-stats))
-    (string-append "\n\\EndLilyPondOutput\n"
+    (string-append "%\n\\EndLilyPondOutput\n"
                                        ; Put GC stats here.
                   )))
 
                     ((equal? (ly-unit) "pt") (/ 72.0  72.27))
                     (else (error "unknown unit" (ly-unit)))
                     ))
-    " mul }"
+    " mul }%\n"
    "\\special{\\string! "
    
    ;; URG: ly-gulp-file: now we can't use scm output without Lily
        (ly-gulp-file "music-drawing-routines.ps"))
 ;   (if (defined? 'ps-testing) "/testing true def%\n" "")
    "}"
-   "\\input lilyponddefs \\outputscale=\\lilypondpaperoutputscale \\lilypondpaperunit"
-   "\\turnOnPostScript"))
+   "\\input lilyponddefs\n"
+   "\\outputscale=\\lilypondpaperoutputscale \\lilypondpaperunit\n"
+   "\\turnOnPostScript\n"))
 
 ;; Note: this string must match the string in ly2dvi.py!!!
 (define (header creator generate) 
        (tex-val (output-tex-string val)))
     (if (equal? (sans-surrounding-whitespace tex-val) "")
        (string-append "\\let\\" tex-key "\\undefined\n")
-       (string-append "\\def\\" tex-key "{" tex-val "}\n"))))
+       (string-append "\\def\\" tex-key "{" tex-val "}%\n"))))
 
 (define (number->dim x)
   (string-append
 (define (bezier-sandwich l thick)
   (embedded-ps (list 'bezier-sandwich  `(quote ,l) thick)))
 
-(define (start-system ht)
-  (string-append "\\vbox to " (number->dim ht) "{\\hbox{"
-                "%\n"))
+(define (start-system wd ht)
+  (string-append "\\leavevmode\n"
+                "\\scoreshift = " (number->dim (* ht 0.5)) "\n"
+                "\\ifundefined{lilypondscoreshift}%\n"
+                "\\else\n"
+                "  \\advance\\scoreshift by -\\lilypondscoreshift\n"
+                "\\fi\n"
+                "\\hbox to " (number->dim wd) "{%\n"
+                "\\lower\\scoreshift\n"
+                "\\vbox to " (number->dim ht) "{\\hbox{%\n"))
 
 (define (stop-system) 
-  "}\\vss}\\interscoreline\n")
+  "}\\vss}\\hss}\\interscoreline\n")
 (define (stop-last-system)
-  "}\\vss}")
+  "}\\vss}\\hss}")
 
 (define (filledbox breapth width depth height)
   (if (and #f (defined? 'ps-testing))
index 1dfae0331396132ae7dca6d51b624bc4a29bcc59..5f5e0771b41d61d0b08dfca1e1a53e87d810f2a4 100644 (file)
@@ -690,6 +690,7 @@ lily output file in TFILES after that, and return the Latex file constructed.  '
 
        
        s = global_latex_preamble (extra) + '\\begin{document}\n'
+       s = s + '\\parindent 0pt\n'
        s = s + '\\thispagestyle{firstpage}\n'
 
        first = 1
index 69cacb71a6cd259b53cc1855720e9e704b4db198..f85aa5b1e8b5b5bbdf6348c375e5ec444d83db2a 100644 (file)
@@ -1,17 +1,27 @@
-% Defines an embeddedpdf command so that we can do the right thing.
+% lily-pdf-defs.tex
+%
+% Define an \embeddedpdf command so that we can do the right thing.
+%
+\edef\lilypdfdefsELC{\the\endlinechar}%
+\endlinechar -1\relax
 
 \def\lilySpace{ }
-\def\turnOnPostScript{%
-        % This sets CTM so that you get to the currentpoint
-        % by executing a 0 0 moveto
-        \def\embeddedpdf##1{%
-                \pdfliteral{q \lilypondpaperoutputscale\lilySpace 0 0 %
-                        \lilypondpaperoutputscale\lilySpace 0 0 cm %
-                       \lilyoutputscalefactor\lilySpace 0 0 %
-                       \lilyoutputscalefactor\lilySpace 0 0 cm %
-                        ##1 Q}%
-        }
+
+\def\turnOnPostScript{
+  % This sets CTM so that you get to the currentpoint
+  % by executing a 0 0 moveto
+  \def\embeddedpdf##1{
+    \pdfliteral{
+      q \lilypondpaperoutputscale\lilySpace 0 0 %
+        \lilypondpaperoutputscale\lilySpace 0 0 cm %
+        \lilyoutputscalefactor\lilySpace 0 0 %
+        \lilyoutputscalefactor\lilySpace 0 0 cm %
+      ##1 Q
+    }
+  }
 }
 
 \def\turnOnExperimentalFeatures{}
 
+\endlinechar \lilypdfdefsELC
+\endinput
index 80bf79c97d7bd27eb2226b2c8abbdb917c992601..4efc3c418cb7c622207c37707adba1d3d897bb3c 100644 (file)
@@ -1,27 +1,38 @@
+% lily-ps-defs.tex
 %
-% WARNING: don't leave blank lines in the PS-code; they are
-% transformed into \par 
-%
+\edef\lilypsdefsELC{\the\endlinechar}%
+\endlinechar -1\relax
 
-%
-% header info (macros/defs, etc) should go into a \special{! ... }, 
+% Header info (macros/defs, etc) should go into a \special{! ... };
 % note the ! sign.  See dvips.info for details.
 %
-% escape the colon with \string to avoid problems with french babel
-%
-\def\PSsetTeXdimen#1{\expandafter\special{! /#1 (\csname #1\endcsname) set_tex_dimen}}
+% Escape the colon with \string to avoid problems with French while using
+% the Babel package.
+
+\def\PSsetTeXdimen#1{
+  \expandafter\special{
+    ! /#1 (\csname #1\endcsname) set_tex_dimen
+  }
+}
+
 \def\lilySpace{ }
-\def\turnOnPostScript{%
-        % This sets CTM so that you get to the currentpoint
-        % by executing a 0 0 moveto
-        \def\embeddedps##1{%
-                \special{ps\string: @beginspecial @setspecial
-                        \lilypondpaperoutputscale\lilySpace\scaletounit
-                        \lilypondpaperoutputscale\lilySpace\scaletounit
-                        % FUCKING REDHAT XDVI -- ARG!
-                        skeel ##1 @endspecial}%
-        }
-        \PSsetTeXdimen{lilypondpaperblotdiameter}
+
+\def\turnOnPostScript{
+  % This sets CTM so that you get to the currentpoint
+  % by executing a 0 0 moveto
+  \def\embeddedps##1{
+    \special{
+      ps\string: @beginspecial @setspecial %
+                 \lilypondpaperoutputscale\lilySpace\scaletounit %
+                 \lilypondpaperoutputscale\lilySpace\scaletounit %
+                 % FUCKING REDHAT XDVI -- ARG!
+                 skeel ##1 @endspecial
+    }
+  }
+  \PSsetTeXdimen{lilypondpaperblotdiameter}
 }
+
 \def\turnOnExperimentalFeatures{}
 
+\endlinechar \lilypsdefsELC
+\endinput
index 1c7a3f5a3c16ccfd9fb86f75507750a7a1df5282..e139af70cb1308aae8412c039bc6e43f4b92c307 100644 (file)
@@ -1,26 +1,46 @@
+% lilypond-latex.tex
+%
+\edef\lilypondlatexELC{\the\endlinechar}%
+\endlinechar -1\relax
+
 \message{LaTeX definitions}
+
 \def\texsuffix{LaTeX}
+
 \def\lilyfooterLaTeX{
-\let\nopagenumbers\relax
-        %% FIXME
-        \def\ps@plain{
-                \renewcommand{\@oddhead}{}%
-                \renewcommand{\@evenfoot}{}%
-                \renewcommand{\@evenhead}{}%
-                \renewcommand{\@oddfoot}{%
-                        \ifnum\thepage=1{\hfil \lilypondtagline}%
-                        \else{%
-                                foo\hfil\the\pageno\hfil}%
-                        \fi}}
-        \def\ps@empty{
-                \renewcommand{\@oddhead}{}%
-                \renewcommand{\@evenfoot}{}%
-                \renewcommand{\@evenhead}{}%
-                \renewcommand{\@oddfoot}{%
-                        \ifnum\thepage=1{\hfil \lilypondtagline}%
-                        \else{foo\hfil\the\pageno\hfil}%
-                        \fi}}%
-\nopagenumbers
+  \let\nopagenumbers\relax
+
+  %% FIXME
+  \def\ps@plain{
+    \renewcommand{\@oddhead}{}
+    \renewcommand{\@evenfoot}{}
+    \renewcommand{\@evenhead}{}
+    \renewcommand{\@oddfoot}{
+      \ifnum\thepage = 1\relax
+        {\hfil \lilypondtagline}
+      \else
+        {foo\hfil \the\pageno \hfil}
+      \fi
+    }
+  }
+
+  \def\ps@empty{
+    \renewcommand{\@oddhead}{}
+    \renewcommand{\@evenfoot}{}
+    \renewcommand{\@evenhead}{}
+    \renewcommand{\@oddfoot}{
+      \ifnum\thepage = 1\relax
+        {\hfil \lilypondtagline}
+      \else
+        {foo\hfil \the\pageno \hfil}
+      \fi
+    }
+  }
+
+  \nopagenumbers
 }
 
 \def\nolilyfooterLaTeX{}
+
+\endlinechar \lilypondlatexELC
+\endinput
index 7dddb283b791c9b04ffc3e362bd0d8914baf9718..7d7e3b802757105161e359e672bf10d2fd839977 100644 (file)
@@ -1,9 +1,25 @@
+% lilypond-plaintex.tex
+%
+\edef\lilypondplaintexELC{\the\endlinechar}%
+\endlinechar -1\relax
+
 \message{LilyPond Plain TeX settings}
-        \def\texsuffix{PlainTeX}
+
+\def\texsuffix{PlainTeX}
 
 \def\lilyfooterPlainTeX{
-          \footline={\ifnum\pageno=1\smalltextfont\lilypondcopyright\hfil \lilypondtagline
-                \else\hfil\the\pageno\hfil\fi}%
+  \footline = {
+    \ifnum\pageno = 1\relax
+      \smalltextfont\lilypondcopyright\hfil \lilypondtagline
+    \else
+      \hfil \the\pageno \hfil
+    \fi
+  }
 }
+
 \advance\hoffset by -.6in
+
 \def\nolilyfooterPlainTeX{\nopagenumbers}
+
+\endlinechar \lilypondplaintexELC
+\endinput
index ccf820e122aaa5298763b43639d59965d0a68296..5bb32bf5ffa6e193c9e246e984d10efa6d3d6b96 100644 (file)
@@ -1,43 +1,61 @@
-%%
-%% include file for LilyPond
-%%
-%% this file defines various macros to accomodate lilypond output
-%%
-%% let's not make par before endinput
+% lilyponddefs.tex
+%
+% Include file for LilyPond.
+%
+% This file defines various macros to accomodate lilypond output.
+%
+\edef\lilyponddefsELC{\the\endlinechar}%
+\endlinechar -1\relax
 
 % TeXbook ex 7.7
-\def\ifundefined#1{\expandafter\ifx\csname#1\endcsname\relax}
+\def\ifundefined#1{
+  \expandafter\ifx\csname#1\endcsname\relax
+}
 
+% If we must make titles, do so, before we're skipped.
+
+\ifx\mustmakelilypondtitle\undefined
+\else
+  \makelilypondtitle
+\fi
+
+\ifx\mustmakelilypondpiecetitle\undefined
+\else
+  \makelilypondpiecetitle
+\fi
 
-% If we must make titles, do so, before we're Skipped.
-\ifx\mustmakelilypondtitle\undefined\else\makelilypondtitle\fi
-\ifx\mustmakelilypondpiecetitle\undefined\else\makelilypondpiecetitle\fi
-%
 % skip if included already
+
 \def\SkipLilydefs{\endinput}
 \ifundefined{EndLilyPondOutput}
-        \def\EndLilyPondOutput{\csname bye\endcsname}
-        \def\SkipLilydefs{}
+  \def\EndLilyPondOutput{\csname bye\endcsname}
+  \def\SkipLilydefs{}
 \fi
 \SkipLilydefs
 
-% need to do some stuff to turn pagenumbering off
+% need to do some stuff to turn page numbering off
+
 \ifundefined{documentclass}
-        \input lilypond-plaintex
+  \input lilypond-plaintex
 \else
-        \input lilypond-latex
+  \input lilypond-latex
 \fi
 
 % The feta characters
 \input feta20.tex
 
-\font\fetasixteen=feta16
+\font\fetasixteen = feta16
 \def\fetafont{\fetasixteen}
 \def\fetachar#1{\hbox{\fetasixteen#1}}
 
+\def\botalign#1{
+  \vbox to 0pt{\vss #1}
+}
+\def\leftalign#1{
+  \hbox to 0pt{#1\hss}
+}
 
-\def\botalign#1{\vbox to 0pt{\vss #1}}
-\def\leftalign#1{\hbox to 0pt{#1\hss}}
+\newdimen\scoreshift
 
 % Attempt to keep lilypiecetitle together with the piece:
 
 % TODO: figure this out.
 %
 
-\def\myfilbreak{} %\par\vfil\penalty200\vfilneg}
+\def\myfilbreak{}%\par\vfil\penalty200\vfilneg}
 
 
 \ifundefined{lilypondpaperinterscorelinefill}
-        \def\lilypondpaperinterscorelinefill{0}
+  \def\lilypondpaperinterscorelinefill{0}
 \else
-        \def\lilypondpaperinterscorelinefill{1}
+  \def\lilypondpaperinterscorelinefill{1}
 \fi
 
-\def\interscoreline{\vskip \lilypondpaperinterscoreline \lilypondpaperunit plus \lilypondpaperinterscorelinefill fill}
+\def\interscoreline{
+  \vskip \lilypondpaperinterscoreline \lilypondpaperunit
+    plus \lilypondpaperinterscorelinefill fill
+}
 
-\def\placebox#1#2#3{%
-        \botalign{\hbox{\raise #1\leftalign{\kern #2{}#3}}}}%
+\def\placebox#1#2#3{
+  \botalign{
+    \hbox{\raise #1\leftalign{\kern #2{}#3}}
+  }
+}
 
 % Are we using PDFTeX?  If so, use pdf definitions.
-% MiKTeX checks \pdfoutput the wrong way, makes our
+% MiKTeX checks \pdfoutput the wrong way; this makes our
 % check more complicated.
 \ifx\pdfoutput\undefined  
   \input lily-ps-defs
   \ifx\pdfoutput\relax
     \input lily-ps-defs
   \else
-    \pdfoutput=1
+    \pdfoutput = 1
     \input lily-pdf-defs
   \fi
 \fi
 
-\def\EndLilyPondOutput{%
-\ifundefined{lilypondpaperlastpagefill}%
-  \vskip 0pt plus \lilypondpaperinterscorelinefill00 fill
-\fi
-\csname bye\endcsname}
+\def\EndLilyPondOutput{
+  \ifundefined{lilypondpaperlastpagefill}
+    \vskip 0pt plus \lilypondpaperinterscorelinefill00 fill
+  \fi
+  \csname bye\endcsname
+}
 
-% need to do some stuff to turn pagenumbering off
-% they seriously mess up  your fragments.
+% Need to do some stuff to turn page numbering off;
+% they seriously mess up your fragments.
 
 \ifx\csname nolilyfooter\endcsname\relax
-        \message{[footer defined]}%
-        \csname lilyfooter\texsuffix\endcsname%
+  \message{[footer defined]}
+  \csname lilyfooter\texsuffix\endcsname
 \else
-        \message{[footer empty]}
-        \csname%
-        nolilyfooter\texsuffix\endcsname
+  \message{[footer empty]}
+  \csname nolilyfooter\texsuffix\endcsname
 \fi
 
 \ifx\outputscale\undefined
-        \csname global\endcsname\csname newdimen\endcsname\outputscale
+  \csname global\endcsname\csname newdimen\endcsname\outputscale
 \fi
+
+\endlinechar \lilyponddefsELC
 \endinput
index 653afeb09cd1d3922d2c230a74d734e22ee33c96..9894742ba4cba42386f790fb0f038e988fb1d5a2 100644 (file)
-%%
-%% LilyPond titling for LaTeX
-%%
-%% Note
-%%
-%%    Defining a value, but leaving it empty:
-%%        \def\lilypondfoo{}
-%%    makes LaTeX break on the \\ in:
-%%        \ifx\lilypondfoo\undefined\else{\lilypondfoo\\}\fi
-%%
+% titledefs.tex
+%
+% LilyPond titling for LaTeX
+%
+% Note:
+%
+%    Defining a value, but leaving it empty:
+%        \def\lilypondfoo{}
+%    makes LaTeX break on the \\ in:
+%        \ifx\lilypondfoo\undefined\else{\lilypondfoo\\}\fi
+%
+\edef\titledefsELC{\the\endlinechar}%
+\endlinechar -1\relax
+
 % The feta characters for use in titles
 \input feta20.tex
-%
+
 \font\fetasixteen=feta16
 \def\fetafont{\fetasixteen}
 \def\fetachar#1{\hbox{\fetasixteen#1}}
-%
-\def\makelilypondtitle
-{
+
+\def\makelilypondtitle{
   \begin{center}
-        \ifx\lilyponddedication\undefined\else{\normalfont\lilyponddedication\\}\fi
-        \bfseries
-        \ifx\lilypondtitle\undefined\else{\huge\lilypondtitle\\}\fi
-        \ifx\lilypondsubtitle\undefined\else{\Large\lilypondsubtitle\\}\fi
-        \ifx\lilypondsubsubtitle\undefined\else{\large\lilypondsubsubtitle\\}\fi
+    \ifx\lilyponddedication\undefined
+    \else
+      {\normalfont\lilyponddedication\\}
+    \fi
+
+    \bfseries
+
+    \ifx\lilypondtitle\undefined
+    \else
+      {\huge\lilypondtitle\\}
+    \fi
+
+    \ifx\lilypondsubtitle\undefined
+    \else
+      {\Large\lilypondsubtitle\\}
+    \fi
+
+    \ifx\lilypondsubsubtitle\undefined
+    \else
+      {\large\lilypondsubsubtitle\\}
+    \fi
   \end{center}
+
   \bigskip
-  % urg
-  \edef\saveparskip{\parskip}\parskip-5mm
+
   \begin{minipage}[t]{0.45\textwidth}
-        \ifx\lilypondpoet\undefined\else{\lilypondpoet\\}\fi
-        \ifx\lilypondtexttranslator\undefined\else{\lilypondtexttranslator\\}\fi
-        \ifx\lilypondmeter\undefined\else{\lilypondmeter\\}\fi
-  \end{minipage}\hspace*{\fill}
+    \ifx\lilypondpoet\undefined
+    \else
+      {\lilypondpoet\\}
+    \fi
+
+    \ifx\lilypondtexttranslator\undefined
+    \else
+      {\lilypondtexttranslator\\}
+    \fi
+
+    \ifx\lilypondmeter\undefined
+    \else
+      {\lilypondmeter\\}
+    \fi
+  \end{minipage}
+
+  \hspace*{\fill}
+
   \begin{minipage}[t]{0.45\textwidth}
-      \begin{flushright}
-          \ifx\lilypondcomposer\undefined\else{\large\normalfont\scshape\lilypondcomposer\\}\fi
-          \ifx\lilypondopus\undefined\else{\lilypondopus\\}\fi
-          \ifx\lilypondarranger\undefined\else{\lilypondarranger\\}\fi
-        \end{flushright}%
-  \end{minipage}\par
-  \parskip\saveparskip
-  \ifx\lilypondinstrument\undefined\else{\center{\large\lilypondinstrument}\par}\fi
-  \ifx\lilypondpiece\undefined\else{\flushleft{\large\normalfont\scshape\lilypondpiece}\par}\fi
-%  \leavevmode
-  \global\let\lilypondopus\relax%
-  \global\let\lilypondpiece\relax%
-  \global\let\mustmakelilypondtitle\undefined%
+    \begin{flushright}
+      \ifx\lilypondcomposer\undefined
+      \else
+        {\large\normalfont\scshape\lilypondcomposer\\}
+      \fi
+
+      \ifx\lilypondopus\undefined
+      \else
+        {\lilypondopus\\}
+      \fi
+
+      \ifx\lilypondarranger\undefined
+      \else
+        {\lilypondarranger\\}
+      \fi
+    \end{flushright}
+  \end{minipage}
+
+  \par
+
+  \ifx\lilypondinstrument\undefined
+  \else
+    {\center{\large\lilypondinstrument}
+     \par}
+  \fi
+
+  \ifx\lilypondpiece\undefined
+  \else
+    {\flushleft{\large\normalfont\scshape\lilypondpiece}
+     \par}
+  \fi
+
+% \leavevmode
+
+  \global\let\lilypondopus\relax
+  \global\let\lilypondpiece\relax
+  \global\let\mustmakelilypondtitle\undefined
 }
-%
-\def\makelilypondpiecetitle
-{
+
+\def\makelilypondpiecetitle{
   \bigskip\myfilbreak
-  \ifx\lilypondopus\undefined\else{\flushright{\lilypondopus}\par}\fi
-  \ifx\lilypondpiece\undefined\else{\flushleft{\large\normalfont\scshape\lilypondpiece}\par}\fi
-  \nopagebreak%
-  \global\let\lilypondopus\relax%
-  \global\let\lilypondpiece\relax%
-  \global\let\mustmakelilypondpiecetitle\undefined%
+
+  \ifx\lilypondopus\undefined
+  \else
+    {\flushright{\lilypondopus}
+     \par}
+  \fi
+
+  \ifx\lilypondpiece\undefined
+  \else
+    {\flushleft{\large\normalfont\scshape\lilypondpiece}
+     \par}
+  \fi
+
+  \nopagebreak
+
+  \global\let\lilypondopus\relax
+  \global\let\lilypondpiece\relax
+  \global\let\mustmakelilypondpiecetitle\undefined
 }
+
 % header -- head ?
-% these names can't be changed: they're uses in mutopia headers
-\def\theheader
-{
-  \ifx\lilypondhead\undefined\relax\else%
-    \lilypondhead\fi
+% these names can't be changed: they're used in mutopia headers
+
+\def\theheader{
+  \ifx\lilypondhead\undefined
+  \else
+    \lilypondhead
+  \fi
 }
-\def\thefooter
-{
-  \ifx\lilypondfooter\undefined\relax\else%
-    \lilypondfooter\fi
+
+\def\thefooter{
+  \ifx\lilypondfooter\undefined
+  \else
+    \lilypondfooter
+  \fi
 }
-\def\makelilypondtagline
-{
-  \ifx\undefined\lilypondtagline\relax\else\lilypondtagline\fi
+
+\def\makelilypondtagline{
+  \ifx\undefined\lilypondtagline
+  \else
+    \lilypondtagline
+  \fi
 }
-\def\thecopyright
-{
-  \ifx\lilypondcopyright\undefined\thefooter\else%
-    \lilypondcopyright\fi
+
+\def\thecopyright{
+  \ifx\lilypondcopyright\undefined
+    \thefooter
+  \else
+    \lilypondcopyright
+  \fi
 }
-%
+
 % Moved header and footer definitions here from the ly2dvi script.
 % Separate page styles for first, last and ordinary (plain) pages.
+
 \makeatletter
+
 \renewcommand{\ps@plain}{
-  \renewcommand{\@oddfoot}{\parbox{\textwidth}{\mbox{}\thefooter}}%
-  \renewcommand{\@evenfoot}{\@oddfoot}%
-  \renewcommand{\@evenhead}{\hbox to\textwidth{\textbf{\thepage}\hfill{\small\theheader}}}
-  \renewcommand{\@oddhead}{\hbox to
-  \textwidth{{\small\theheader}\hfill\textbf{\thepage}}}}
+  \renewcommand{\@oddfoot}{
+    \parbox{\textwidth}{\mbox{}\thefooter}}
+  \renewcommand{\@evenfoot}{
+    \@oddfoot}
+  \renewcommand{\@evenhead}{
+    \hbox to \textwidth{\textbf{\thepage}\hfill{\small\theheader}}}
+  \renewcommand{\@oddhead}{
+    \hbox to \textwidth{{\small\theheader}\hfill\textbf{\thepage}}}
+}
+
 \newcommand{\ps@firstpage}{
-  \renewcommand{\@oddfoot}{\parbox{\textwidth}{\mbox{}\thecopyright}}%
-  \renewcommand{\@evenfoot}{\@oddfoot}}
+  \renewcommand{\@oddfoot}{
+    \parbox{\textwidth}{\mbox{}\thecopyright}}
+  \renewcommand{\@evenfoot}{
+    \@oddfoot}
+}
+
 \newcommand{\ps@lastpage}{
-  \renewcommand{\@oddfoot}{\parbox{\textwidth}{\mbox{}\makelilypondtagline}}%
-  \renewcommand{\@evenfoot}{\@oddfoot}}
+  \renewcommand{\@oddfoot}{
+    \parbox{\textwidth}{\mbox{}\makelilypondtagline}}
+  \renewcommand{\@evenfoot}{
+    \@oddfoot}
+}
+
 \makeatother
-\endinput
 
+\endlinechar \titledefsELC
+\endinput