]> git.donarmstrong.com Git - lilypond.git/commitdiff
lilypond-1.5.4
authorfred <fred>
Wed, 27 Mar 2002 01:20:44 +0000 (01:20 +0000)
committerfred <fred>
Wed, 27 Mar 2002 01:20:44 +0000 (01:20 +0000)
27 files changed:
input/bugs/braces.ly
input/bugs/dots.ly
input/bugs/grace-dynamic.ly
input/bugs/grace-finger.ly
input/bugs/grace-gets-slur.ly
input/regression/grace-nest.ly [new file with mode: 0644]
input/regression/grace-start.ly
input/regression/grace-sync.ly
lily/auto-beam-engraver.cc
lily/beam-engraver.cc
lily/grace-iterator.cc
lily/grace-music.cc
lily/include/moment.hh
lily/include/sequential-music-iterator.hh
lily/midi-item.cc
lily/moment.cc
lily/music-sequence.cc
lily/paper-stream.cc
lily/parser.yy
lily/script-engraver.cc
lily/separation-item.cc
lily/sequential-music-iterator.cc
lily/spacing-spanner.cc
ly/engraver-init.ly
ly/grace-init.ly
scripts/etf2ly.py
scripts/ly2dvi.py

index 10d474ef81cbf768d6154524f71a718fa9129c59..04179b0ec397c085155f6fa63a605704416f9793 100644 (file)
@@ -1,3 +1,6 @@
+% this bug apparently caused by dvips + mf rounding.
+
+
 \header {
 texidoc="Run this through ly2dvi to show differerent brace sizes"
 }
index f48fe19b75061082625b09eaecad9236a37c0aa6..ff1d7f20ff06ea77f88784958bdc171dfbb7ac5f 100644 (file)
@@ -1,6 +1,6 @@
 
 \header {
- texidoc = "Dots should remain close to the heads they belong to, but should not overlap.";
+ texidoc = "Dots should remain close to the heads they belong to, but should not overlap."
 }
 
 
index b79d9753fd7f3d4104536f9207e3ee272cecf20d..89b002c4cf726080eca2582bc6917daca00a834d 100644 (file)
@@ -1,3 +1,4 @@
 
-
-\score { \notes {\grace {c'_\f} d e f g}}
+ % ?
+ \score { \notes \context Voice {\grace {c'_\f} d e f g}}
index 38095ef78bc34dfe7663565c36964f637a10db57..077b407038a43a7b950ce0d02642d11ebe6151ac 100644 (file)
@@ -1,6 +1,7 @@
 
 
-
+ % ?
 \score {
 \notes \context Voice = VA \relative c'' {
        \grace {[b8^1 c^2]} d4^3
index 65703e7b81a07dd3413a95e6b867a6f5fa8f568e..8b137891791fe96927ad78e64b0aad7bded08bdc 100644 (file)
@@ -1,12 +1 @@
 
-
-\score {
-       \notes\relative c''{
-               \grace g8 g'2 ( )g
-       }
-       \paper {
-               linewidth=40.\mm;
-               indent=0.;
-       }
-}
-
diff --git a/input/regression/grace-nest.ly b/input/regression/grace-nest.ly
new file mode 100644 (file)
index 0000000..71ca4b4
--- /dev/null
@@ -0,0 +1,12 @@
+\header {
+texidoc = "grace code should not be confused by nested sequential musics, containing grace notes; practically speaking, this means that the end-bar and measure bar coincide in this example." 
+
+}
+\score{
+\notes 
+
+{ c''2 { \grace  b'16  c''2 }  \bar "|." }
+  \paper {
+}
+ }
+
index 1094d3b5fd484db9c15de00d4b0b912ae6784d03..5c0c5dff6701a9fdf653ac8a3b6d1a8a333d012a 100644 (file)
@@ -3,7 +3,9 @@ texidoc = "Pieces may begin with grace notes."
 }
 \score  {\notes \relative c' \context Staff  { 
  \grace { [a'16 f]  } g1
+ \bar "||"  % test if | and || are synced.
  \grace { [a16 bes]  }  c1
+ \bar "||"  % test if | and || are synced. 
   }
   \paper { linewidth = -1. }
 }
index 0ddcdf37f81d8bb172c3f9b791a50559c91c281a..419ccdeb14ca82082fa77d84b54728e5954dda68 100644 (file)
@@ -3,10 +3,10 @@
 }
 
 \score  {\notes < \context Staff  { c2
\ngrace  c8
- c2 c4 }
       \grace  c8
 c2 c4 }
                \context Staff = SB { c2 \clef bass
%\ngrace { [dis8 ( d8] }
\grace { [dis8 ( d8] }
 
   ) c2 c4 }
                \context Staff = SC { c2 c2 c4 }
index 94671aabf05b43b3a9dbc2aa418c16d6e2799704..781f03393fdf7df09676a2d4d9edf658ce6fd66e 100644 (file)
@@ -399,7 +399,7 @@ Auto_beam_engraver::acknowledge_grob (Grob_info info)
       /*
        ignore grace notes.
        */
-      if (bool (beam_start_location_.grace_mom_) != bool (now_mom ().grace_mom_))
+      if (bool (beam_start_location_.grace_part_) != bool (now_mom ().grace_part_))
        return ;
        
       
index 7b506953c8eb1904381b761bbffae8119f0462a5..122a7ecd3c28369f0c11b928870709d74f9827ea 100644 (file)
@@ -242,7 +242,7 @@ Beam_engraver::acknowledge_grob (Grob_info info)
        {
          Moment now = now_mom();
 
-         if(bool (now.grace_mom_ ) != bool (beam_start_mom_.grace_mom_))
+         if(bool (now.grace_part_ ) != bool (beam_start_mom_.grace_part_))
            return ;
          
          Item *stem_l = dynamic_cast<Item*> (info.elem_l_);
index 9248e071f8c218301669fb6cf144ff90baa2f37a..fde8167730ed9ea7e9f4d74ee3b4ab20881d6790 100644 (file)
@@ -22,10 +22,10 @@ Grace_iterator::~Grace_iterator ()
 
 
 void
-Grace_iterator::process (Moment m )
+Grace_iterator::process (Moment m)
 {
   Moment main ;
-  main.main_part_ = m.grace_mom_;
+  main.main_part_ = music_length_.grace_part_ + m.grace_part_;
   Music_wrapper_iterator::process (main);
 }
 
@@ -43,7 +43,7 @@ Grace_iterator::pending_moment () const
   Moment cp =Music_wrapper_iterator::pending_moment();
 
   Moment pending;
-  pending.grace_mom_ = - music_length_.main_part_  + cp.main_part_;
+  pending.grace_part_ =  cp.main_part_- music_length_.grace_part_ ;
 
   return pending;
 }
index 9e88f7b835cb21d35933b7e8c969f618c2643b90..27c88c6f7b66ab283946a1b23ca5ee1dad9f9c34 100644 (file)
@@ -21,7 +21,7 @@ Grace_music::length_mom () const
 {
   Moment l = Music_wrapper::length_mom ();
   Moment gl;
-  gl.grace_mom_ = l.main_part_ + l.grace_mom_ ;
+  gl.grace_part_ = l.main_part_ + l.grace_part_ ;
   return gl;
 }
 
@@ -29,7 +29,7 @@ Grace_music::length_mom () const
 Moment
 Grace_music::start_mom () const
 {
-  return Music::start_mom ();
+  return - length_mom ();
 }
 
 Grace_music::Grace_music ()
index fca85bb458be577be03c091af6bd018db67982fe..a882bb098623e2c2bceb319db137d8344aaac5e8 100644 (file)
@@ -14,7 +14,8 @@
 #include "rational.hh"
 
 /**
-   Rationals with glue for Guilification;
+   Musical timing (Main-timing, grace-timing) with glue for
+   Guilification;
 */
 class Moment
 {
@@ -26,7 +27,8 @@ public:
 
   Moment (Rational m);
 
-
+  Moment operator - () const;
+  
   void operator += (Moment const &m);
   void operator -= (Moment const &m);  
 
@@ -34,7 +36,7 @@ public:
   void operator /= (Moment const &m);  
 
   Rational main_part_;
-  Rational grace_mom_;
+  Rational grace_part_;
 
   void set_infinite (int k);
   
index 6f13f441411e78d526a613da6d28b12db3c1d628..fcedb517f77ddbdca36de33ed0c24d6ea11bc254 100644 (file)
 #include "music-iterator.hh"
 
 
+/*
+
+  This is a lookahead list for grace notes.
+
+   {  ... X \grace Y  Z ... }
+
+   normally, the ending of X is the start of Z. In case of a grace
+   note, we take off a little at the end of X. What is stored: START
+   (start point of X), LENGTH (length of X), GRACE_START (start_music
+   of Y), and the next fixup element.
+
+  This is also done for nested musics, i.e.
+
+  voiceA = \notes { \grace b16 c'2 }
+  voiceB = \notes { c'2 \voiceA }
+
+  the iterator for voiceB will contain a fixup entry with (START=0/1,
+  LENGTH=2/1, GRACE_START=(0G-1/16) ) 
+   
+  Graces at the start of a sequential music iterator are handled
+  by initting here_mom_ with Music::start_music (); no fixups are needed.
+
+*/
 struct Grace_skip 
 {
   Moment start_;
   Rational length_;
-  Rational grace_length_;  
+
+  Rational grace_start_;  
   Grace_skip *next_;
 };
 
index 2e9d260163360664da8f1a388ce59d348e471272..11f6bd559fa57659a28524887e6645e6adb38d68 100644 (file)
@@ -98,7 +98,7 @@ String
 Midi_event::str () const
 {
   Rational rat_dt = (delta_mom_.main_part_ * Rational (384) +
-    delta_mom_.grace_mom_ * Rational (100))*Rational (4);
+    delta_mom_.grace_part_ * Rational (100))*Rational (4);
   int delta_i = int (rat_dt);
 
   String delta_str = Midi_item::i2varint_str (delta_i);
index ca6188f94489417296959dc4b287ebd75cfdaf85..5a3ff5f8fc238924fcd20f4dd7dd976d6b7d4afa 100644 (file)
@@ -98,7 +98,7 @@ Moment::compare (Moment const &a, Moment const &b)
   if (c)
     return c;
 
-  return Rational::compare (a.grace_mom_, b.grace_mom_);
+  return Rational::compare (a.grace_part_, b.grace_part_);
 }
 
 Moment::Moment ()
@@ -109,32 +109,32 @@ Moment::Moment ()
 Moment::Moment (int m)
 {
   main_part_ = Rational(m);
-  grace_mom_  = Rational( 0);
+  grace_part_  = Rational( 0);
 }
 
 Moment::Moment (int m, int n)
 {
   main_part_ = Rational (m,n);
-  grace_mom_  = Rational (0);
+  grace_part_  = Rational (0);
 }
 
 Moment::Moment (Rational m)
 {
   main_part_ = m;
-  grace_mom_  = Rational (0);
+  grace_part_  = Rational (0);
 }
 
 void
 Moment::operator += (Moment const &src)
 {
   main_part_ +=src.main_part_ ;
-  grace_mom_ += src.grace_mom_;
+  grace_part_ += src.grace_part_;
 }
 void
 Moment::operator -= (Moment const &src)
 {
   main_part_ -= src.main_part_ ;
-  grace_mom_ -= src.grace_mom_;
+  grace_part_ -= src.grace_part_;
 }
 
 /*
@@ -144,7 +144,7 @@ void
 Moment::operator *= (Moment const &src)
 {
   main_part_ *= src.main_part_ ;
-  grace_mom_ *= src.main_part_;
+  grace_part_ *= src.main_part_;
 }
 
 /*
@@ -154,7 +154,7 @@ void
 Moment::operator /= (Moment const &src)
 {
   main_part_ /= src.main_part_ ;
-  grace_mom_ /= src.main_part_;
+  grace_part_ /= src.main_part_;
 }
 
 
@@ -174,7 +174,7 @@ Moment::num () const { return main_part_.num (); }
 
 Moment::operator bool ()
 {
-  return main_part_ || grace_mom_;
+  return main_part_ || grace_part_;
 }
 
 void
@@ -187,5 +187,19 @@ Moment::set_infinite (int k)
 String
 Moment::str () const
 {
-  return main_part_.str ();
+  String s =  main_part_.str ();
+  if (grace_part_)
+    {
+      s += "G" + grace_part_.str ();
+    }
+  return s;
+}
+
+Moment
+Moment::operator - ( ) const
+{
+  Moment m;
+  m.grace_part_ = -grace_part_;
+  m.main_part_ = -main_part_;
+  return m;
 }
index 47927f6cb90244c8851144d09f79e1454573b28c..17da5f46746ed0b99ab9193a071192e3f3328656 100644 (file)
@@ -75,15 +75,15 @@ Music_sequence::cumulative_length () const
   for (SCM s = music_list (); gh_pair_p (s);  s = gh_cdr (s))
     {
       Moment l = unsmob_music (gh_car (s))->length_mom ();
-      if (last_len.grace_mom_ && l.main_part_)
+      if (last_len.grace_part_ && l.main_part_)
        {
-         last_len.grace_mom_ = Rational (0);
+         last_len.grace_part_ = Rational (0);
        }
       cumulative += last_len;
       last_len = l;
     }
 
-  last_len.grace_mom_ = Rational (0);
+  last_len.grace_part_ = Rational (0);
   cumulative += last_len;
   
   return  cumulative;
@@ -170,9 +170,9 @@ Music_sequence::first_start () const
 
       if (l.main_part_)
        return mus->start_mom ();
-      else if (l.grace_mom_)
+      else if (l.grace_part_)
        {
-         m.grace_mom_ = - l.grace_mom_; 
+         m.grace_part_ = - l.grace_part_; 
          return m;
        }
     }
index ba3c9ee11555880dc806fe16f87385f5a687d562..d2bbeb3f9ca676d2fc2bf2ab3f40af21c09d162e 100644 (file)
@@ -71,7 +71,8 @@ Paper_stream::Paper_stream (String filename)
 Paper_stream::~Paper_stream ()
 {
   close_file_stream (os_);
-  assert (nest_level == 0);
+  if (nest_level != 0)
+    programming_error ("Brace nesting in paper output doesn't match");
 }
 
 // print string. don't forget indent.
index 4f4747ab5a0d41edfd1ebe050219bb9203e54df6..b9f4793d2c50450cad3c7c9bd15b1d567ff385f2 100644 (file)
@@ -806,7 +806,7 @@ Composite_music:
                chm->set_spot (*$3->origin ());
        }
        | GRACE Music {
-#if 1
+#if 0
        /*
                The other version is for easier debugging  of
                Sequential_music_iterator in combination with grace notes.
index 70844dc5b6f62558d834012dc7c24330e92c4830..17aec42ba026c0a13f44c1a353ca8da22e4aaf05 100644 (file)
@@ -139,8 +139,10 @@ Script_engraver::acknowledge_grob (Grob_info inf)
            }
          if (Side_position_interface::get_axis (e) == X_AXIS
              && !e->parent_l (Y_AXIS))
-           e->set_parent (inf.elem_l_, Y_AXIS);
-         
+           {
+             e->set_parent (inf.elem_l_, Y_AXIS);
+             e->add_dependency (inf.elem_l_); // ??
+           }
          Side_position_interface::add_support (e,inf.elem_l_);
        }
     }  
index b5642dbc268796839a4d742e3acbd7c243349138..522cde9ac162a6a3324610c2aaac920a86350d8b 100644 (file)
@@ -60,6 +60,14 @@ Separation_item::my_width (Grob *me)
        }
     }
 
+  SCM pad = me->get_grob_property ("padding");
+
+  if (gh_number_p (pad))
+  {
+    w[RIGHT] += gh_scm2double (pad)/2;
+    w[LEFT] -= gh_scm2double (pad)/2;    
+  }
+  
   return w;
  // add this->offset_ ? this-> relative_coordinate ()? 
 }
index e02847f991f3cbdb18683cfacc47518d362313f9..7a6b240a155dc2aca487afd0838f0e24fd65b27f 100644 (file)
@@ -27,8 +27,6 @@
   here_mom_  = sum (length (musiclist [start ... cursor>))  %)  
   
  */
-
-
 Sequential_music_iterator::Sequential_music_iterator ()
 {
   cursor_ = SCM_EOL;
@@ -59,33 +57,33 @@ Grace_skip *
 get_grace_skips (SCM cursor)
 {
   Moment here (0);
-  Moment last (here);
+  Moment last (-1);
   Grace_skip *head = 0;
   Grace_skip **tail = &head;
-  bool first = true; 
-
   
   for (; gh_pair_p (cursor); cursor = gh_cdr (cursor))
     {
       Music * mus = unsmob_music (gh_car (cursor));
       Moment l =mus->length_mom ();
-      if (l.main_part_)
-       {
-         first = false;
-         last = here;
-         here += l;
-       }
-      else if(l.grace_mom_ && !first)
+      Moment s = mus->start_mom ();
+
+      if (s.grace_part_ && last >= Moment (0))
        {
-         assert (!l.main_part_);
          Grace_skip *p =new Grace_skip;
          p->start_ = last;
          p->length_ = (here - last).main_part_;
-         p->grace_length_ = l.grace_mom_;
+         p->grace_start_ = s.grace_part_;
          p->next_ = 0;
          *tail = p;
          tail = &(*tail)->next_; 
        }
+      
+      if (l.main_part_)
+       {
+         l.grace_part_ = Rational (0);
+         last = here;
+         here += l;
+       }
     }
   return  head;
 }
@@ -123,24 +121,31 @@ Sequential_music_iterator::next_element ()
   Moment len =iter_p_->music_length_mom ();
   Moment start  = iter_p_->music_start_mom ();
   assert (!grace_skips_  || grace_skips_->start_ >= here_mom_);
-
+  
   if (len.main_part_ && grace_skips_ && grace_skips_->start_ == here_mom_)
     {
       Moment sk;
       sk.main_part_ = grace_skips_->length_;
       here_mom_ +=  sk;
-      here_mom_.grace_mom_ = - grace_skips_->grace_length_;
+      here_mom_.grace_part_ = grace_skips_->grace_start_;
 
       Grace_skip * n =grace_skips_->next_;
-      delete       grace_skips_;
+      delete grace_skips_;
       grace_skips_ = n;
     }
-  else if (len.grace_mom_)
+  else if (len.grace_part_ && !len.main_part_)
     {
-      here_mom_.grace_mom_ =0;
+      here_mom_.grace_part_ =0;
     }
   else
     {
+      /*
+       !len.grace_part_ || len.main_part_
+
+       We skip over a big chunk (mainpart != 0). Any starting graces
+       in that chunk are compensated by subtracting START.
+
+      */
       here_mom_ += len - start;
     }
   
@@ -157,7 +162,6 @@ Sequential_music_iterator::next_element ()
   move to context of child iterator if it is deeper down in the
   hierarchy.
   */
-
 void
 Sequential_music_iterator::descend_to_child ()
 {
@@ -254,7 +258,7 @@ Sequential_music_iterator::process (Moment until)
            do the stuff/note/rest preceding a grace.
           */
          Moment u = until;
-         u.grace_mom_ = 0;
+         u.grace_part_ = 0;
          iter_p_->process (u - here_mom_);
        }
       else
@@ -279,16 +283,22 @@ Sequential_music_iterator::pending_moment () const
 {
   Moment cp = iter_p_->pending_moment ();
 
-  if (grace_skips_
-      && here_mom_ == grace_skips_->start_
+  /*
+    Fix-up a grace note halfway in the music.
+  */
+  if (grace_skips_ && here_mom_ == grace_skips_->start_
       && cp.main_part_ >=  grace_skips_->length_)
     {
-      cp += here_mom_ ;
-      cp.grace_mom_ = - grace_skips_->grace_length_;
-      return cp;
+         cp += here_mom_ ;
+         cp.grace_part_ = grace_skips_->grace_start_;
+         return cp;
+
     }
-  else
-    return cp + here_mom_ - iter_p_->music_start_mom ();
+
+    /*
+      Fix-up a grace note at  the start of the music.
+     */
+  return cp + here_mom_ - iter_p_->music_start_mom ();
 }
 
 
index 497f4c934b65318635b9e4ae9f7fd4e3ca23d753..636757b94d611417921ce30880521fbb6d5f0b24 100644 (file)
@@ -72,7 +72,7 @@ find_runs (Grob*me, Link_array<Grob> cols)
     {
       Moment w =  Paper_column::when_mom (cols[i]);
       
-      if (!w.grace_mom_ && Paper_column::musical_b (cols[i]))
+      if (!w.grace_part_ && Paper_column::musical_b (cols[i]))
        {
          filter_cols.push (cols[i]);
          col_moments.push (w);
@@ -125,7 +125,7 @@ Spacing_spanner::do_measure (Grob*me, Link_array<Grob> const & cols)
          /*
            ignore grace notes for shortest notes.
           */
-         if (when && when->grace_mom_)
+         if (when && when->grace_part_)
            continue;
          
          SCM  st = cols[i]->get_grob_property ("shortest-starter-duration");
@@ -469,7 +469,7 @@ Spacing_spanner::note_spacing (Grob*me, Grob *lc, Grob *rc,
     ugh: 0.1 is an arbitrary distance.
    */
   dist *= (double) (delta_t.main_part_ / shortest_playing_len.main_part_)
-    + 0.1 * (double) (delta_t.grace_mom_ / shortest_playing_len.main_part_);
+    + 0.1 * (double) (delta_t.grace_part_ / shortest_playing_len.main_part_);
 
 
 
@@ -486,9 +486,9 @@ Spacing_spanner::note_spacing (Grob*me, Grob *lc, Grob *rc,
 
   if (lm && rm)
     {
-      if (lm->grace_mom_ && rm->grace_mom_)
+      if (lm->grace_part_ && rm->grace_part_)
        dist *= 0.5;
-      else if (!rm->grace_mom_ && lm->grace_mom_)
+      else if (!rm->grace_part_ && lm->grace_part_)
        dist *= 0.7;
     }
 
index c8ec356f527378c7b01178266a02a6dd6f873ce0..729a926b01def3ef362756f99645fbcaa0bdbf02 100644 (file)
@@ -381,7 +381,9 @@ ScoreContext = \translator {
        keyAccidentalOrder = #'(
          (6 . -1) (2  . -1) (5 . -1 ) (1  . -1) (4  . -1) (0  . -1) (3  . -1)
         (3  . 1) (0 . 1) (4 . 1) (1 . 1) (5 . 1) (2 . 1) (6 . 1)
-       )
+         (6 . -2) (2  . -2) (5 . -2 ) (1  . -2) (4  . -2) (0  . -2) (3 . -2)
+         (3  . 2) (0 . 2) (4 . 2) (2 . 2) (5 . 2) (2 . 2) (6 . 2)
+        )
        breakAlignOrder = #'(
          Instrument_name
          Left_edge_item
index 92e9c30c2f3374235815a9229eef25a2ddce0f9d..b9a895cdc40f4f163ffe9a0a7f283526ecc89d39 100644 (file)
@@ -18,8 +18,11 @@ startGraceMusic = {
     \property Voice.Beam \override #'space-function = #grace-beam-space-function
     \property Voice.Beam \override #'thickness = #0.3
     
-    % must use staff. Accidentals should also be smaller. 
-    \property Staff.fontSize = #-2
+    % Can't use Staff.fontSize, since time sigs, keys sigs, etc. will
+    % be smaller as well.
+
+    \property Voice.fontSize = #-2
+    \property Staff.LocalKeyItem \override #'font-relative-size = #-2
 }
 
 stopGraceMusic = {
@@ -34,5 +37,9 @@ stopGraceMusic = {
     \property Voice.Stem \revert #'length
     \property Voice.Stem \revert #'direction    
     
-    \property Staff.fontSize \unset
+    % Can't use Staff.fontSize, since time sigs, keys sigs, etc. will
+    % be smaller as well.
+
+    \property Voice.fontSize \unset
+    \property Staff.LocalKeyItem \revert #'font-relative-size
 }
index 1c9487df19505691e25596816b0ab2a2b09b04b7..7b902765f2ae48e1465af8a2a6ca5a99203b45c4 100644 (file)
@@ -174,16 +174,7 @@ def lily_notename (tuple2):
        (n, a) = tuple2
        nn = chr ((n+ 2)%7 + ord ('a'))
 
-       if a == -1:
-               nn = nn + 'es'
-       elif a == -2:
-               nn = nn + 'eses'
-       elif a == 1:
-               nn = nn + 'is'
-       elif a == 2:
-               nn = nn + 'isis'
-
-       return nn
+       return nn + {-2:'eses', -1:'es', 0:'', 1:'is', 2:'isis'}[a]
 
 
 class Tuplet:
@@ -729,6 +720,10 @@ Add None to LIST until it contains entry number NO.
        return list
 
 def read_finale_value (str):
+       """
+Pry off one value from STR. The value may be $hex, decimal, or "string".
+Return: (value, rest-of-STR)
+       """
        while str and str[0] in ' \t\n':
                str = str[1:]
 
index 1e9a7329b32ac968d6c4c6cea4085434977d5a8a..63ded478b57b27057ea84e88b69dfe8929f3b0d6 100644 (file)
@@ -538,7 +538,8 @@ lily output file in TFILES after that, and return the Latex file constructed.  '
 '''
        
        if extra['pagenumber'] and extra['pagenumber'][-1] and extra['pagenumber'][-1] != 'no':
-               s = s + '\\pagestyle{plain}\n'
+               s = s + '\setcounter{page}{%s}\n' % (extra['pagenumber'][-1])
+                s = s + '\\pagestyle{plain}\n'
        else:
                s = s + '\\pagestyle{empty}\n'