lilypond-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Guitar tablature for LilyPond !


From: Lamy Jean-Baptiste
Subject: Guitar tablature for LilyPond !
Date: Wed, 1 May 2002 21:57:29 +0200

Hi all !

I am writing a GUI guitar tablature editor for GNOME (GTablature,
http://oomadness.tuxfamily.org/gtablature/en) and i am thinking about using
Lilypond for output / printing.

I know that Lilypond doesn't support tablature (yet), though i've found the
Lilypond internal pretty "hackable" and i'm working on that.

My hack is based on the "tab-staff.ly" file found in Lilypond examples, and
it now prints the notes' frets at the right location !!!

Here it is.
The patch "note-head-engraver" must be applied on the
note-heads-engraver.cc c++ source file, and the "scm" one on the scm
directory; i am using LilyPond 1.5.54.

"tablature.ly", is a tablature example and tablature.ps the output.

still TODO :
 - Clean the code !!!
 - Increase distance between the guitar strings (or write smaller figures)
 - Non hardcoded guitar tuning
 - More user-friendly macros for string-changing (is it possible to have
macros with arguments ???)
 - Support chord (< \guitarstringone c \guitarstringtwo e > don't work)
 - Support slur (not tested, any volunteer ?)

Please help me !

Jiba94a95,96
>       note_p->set_grob_property ("semitone-pitch", gh_int2scm
(pit->semitone_pitch()));
> 
diff -rN ./lilypond-1.5.54.orig/scm/grob-property-description.scm
./lilypond-1.5.54/scm/grob-property-description.scm
25a26,27
> (grob-property-description 'semitone-pitch number? "semitone-pitch of a
note grob.")
> 
\version "1.3.146"

%{

Guitar tablature notation : a hacky hack !!
    ...but work quite well (exept for chord).

Based on the tab-staff.ly found in Lilypond.

TODO :
 - Clean the code !!!
 - Increase distance between the guitar strings (or write smaller figures
!)
 - Non hardcoded guitar tuning
 - More user-friendly macros for string-changing (is it possible to have
macros with arguments ???)
 - Support chord (< \guitarstringone c \guitarstringtwo e > don't work)
 - Support slur (not tested, any volunteer ?)

Please help me !

    Jiba -- address@hidden

%}

% The guitar tuning (hard-coded and identical for all...)
#(define guitartuning '(-8 -3 2 7 11 16))

% Macro for switching from a string to another,
% those long names are not really user friendly, though.
%
% 'guitar-string looks to be an undefined property and Lilypond
% complains but accepts it.

guitarstringone   = {
   \property Score.squashedPosition = #-6
   \property Voice.NoteHead \override #'guitar-string = #1
}
guitarstringtwo   = {
   \property Score.squashedPosition = #-4
   \property Voice.NoteHead \override #'guitar-string = #2
}
guitarstringthree = {
   \property Score.squashedPosition = #-2
   \property Voice.NoteHead \override #'guitar-string = #3
}
guitarstringfour  = {
   \property Score.squashedPosition = #0
   \property Voice.NoteHead \override #'guitar-string = #4
}
guitarstringfive  = {
   \property Score.squashedPosition = #2
   \property Voice.NoteHead \override #'guitar-string = #5
}
guitarstringsix   = {
   \property Score.squashedPosition = #4
   \property Voice.NoteHead \override #'guitar-string = #6
}

% The notes (a small arpegio around the C major chord).
%
% The "current" guitar string can be changed with \guitarstring*
% It doesn't work for chord :-(

bla =  \notes \relative c' {
\guitarstringtwo   c8 
\guitarstringfour  g'
\guitarstringfive  c
\guitarstringsix   e

\guitarstringthree e,
\guitarstringfour  g
\guitarstringfive  c
\guitarstringsix   e
} 

\score {
\notes
  <
    \context Voice = BLA \bla
    \context TabStaff  \context Thread \bla
  >

\paper {
  \translator {
    \StaffContext
    \name TabStaff
    
    % 6 strings, remove clef, use pitch squash
    
    StaffSymbol \override #'line-count = #6
    \remove "Clef_engraver"
    \remove "Time_signature_engraver"
    \consists "Pitch_squash_engraver"
    
    % Change the font for NoteHead : use a "normal" text font
    
    NoteHead \override #'font-family = #'roman
    
    % Change the molecule callback.
    % The new callback returns a textual molecule
    
    NoteHead \override #'molecule-callback = #(lambda (grob)
      (let ((molecule (fontify-text (ly-get-default-font grob)
          (string-append
           (number->string
            (-
             (ly-get-grob-property grob 'semitone-pitch) ; This property
was added in the c++ code (in the NoteHead engraver)
             (list-ref guitartuning (-
                                      (ly-get-grob-property grob
'guitar-string) ; this property was added by the /guitarstring* macros
                                      1 ; remove 1 because list index
starts at 0 and guitar string at 1.
                                    ))
            )
           )
          )
        )))
        
        molecule ; return the molecule.
      )
    )
    
    % Hide Beam, Stem and Dots
    
    Beam \override #'transparent = ##t
    Stem \override #'transparent = ##t
    Dots \override #'transparent = ##t
  }
  \translator {
    \ScoreContext
    \accepts TabStaff
  }
%  \translator {
%    \VoiceContext
%    \name stringone
%    Voice.NoteHead \override #'guitar-string = #1
%    squashedPosition = #2
%  }
%  \translator {
%    \VoiceContext
%    \name stringtwo
%    Voice.NoteHead \override #'guitar-string = #2
%    squashedPosition = #-5
%  }
}
}
%!PS-Adobe-2.0
%%Creator: dvips(k) 5.86 Copyright 1999 Radical Eye Software
%%Title: tablature.dvi
%%Pages: 1
%%PageOrder: Ascend
%%BoundingBox: 0 0 596 842
%%DocumentPaperSizes: a4
%%EndComments
%DVIPSWebPage: (www.radicaleye.com)
%DVIPSCommandLine: dvips -ta4 -otablature.ps tablature.dvi
%DVIPSParameters: dpi=600, compressed
%DVIPSSource:  TeX output 2002.05.01:2153
%%BeginProcSet: texc.pro
%!
/TeXDict 300 dict def TeXDict begin/N{def}def/B{bind def}N/S{exch}N/X{S
N}B/A{dup}B/TR{translate}N/isls false N/vsize 11 72 mul N/hsize 8.5 72
mul N/landplus90{false}def/@rigin{isls{[0 landplus90{1 -1}{-1 1}ifelse 0
0 0]concat}if 72 Resolution div 72 VResolution div neg scale isls{
landplus90{VResolution 72 div vsize mul 0 exch}{Resolution -72 div hsize
mul 0}ifelse TR}if Resolution VResolution vsize -72 div 1 add mul TR[
matrix currentmatrix{A A round sub abs 0.00001 lt{round}if}forall round
exch round exch]setmatrix}N/@landscape{/isls true N}B/@manualfeed{
statusdict/manualfeed true put}B/@copies{/#copies X}B/FMat[1 0 0 -1 0 0]
N/FBB[0 0 0 0]N/nn 0 N/IEn 0 N/ctr 0 N/df-tail{/nn 8 dict N nn begin
/FontType 3 N/FontMatrix fntrx N/FontBBox FBB N string/base X array
/BitMaps X/BuildChar{CharBuilder}N/Encoding IEn N end A{/foo setfont}2
array copy cvx N load 0 nn put/ctr 0 N[}B/sf 0 N/df{/sf 1 N/fntrx FMat N
df-tail}B/dfs{div/sf X/fntrx[sf 0 0 sf neg 0 0]N df-tail}B/E{pop nn A
definefont setfont}B/Cw{Cd A length 5 sub get}B/Ch{Cd A length 4 sub get
}B/Cx{128 Cd A length 3 sub get sub}B/Cy{Cd A length 2 sub get 127 sub}
B/Cdx{Cd A length 1 sub get}B/Ci{Cd A type/stringtype ne{ctr get/ctr ctr
1 add N}if}B/id 0 N/rw 0 N/rc 0 N/gp 0 N/cp 0 N/G 0 N/CharBuilder{save 3
1 roll S A/base get 2 index get S/BitMaps get S get/Cd X pop/ctr 0 N Cdx
0 Cx Cy Ch sub Cx Cw add Cy setcachedevice Cw Ch true[1 0 0 -1 -.1 Cx
sub Cy .1 sub]/id Ci N/rw Cw 7 add 8 idiv string N/rc 0 N/gp 0 N/cp 0 N{
rc 0 ne{rc 1 sub/rc X rw}{G}ifelse}imagemask restore}B/G{{id gp get/gp
gp 1 add N A 18 mod S 18 idiv pl S get exec}loop}B/adv{cp add/cp X}B
/chg{rw cp id gp 4 index getinterval putinterval A gp add/gp X adv}B/nd{
/cp 0 N rw exit}B/lsh{rw cp 2 copy get A 0 eq{pop 1}{A 255 eq{pop 254}{
A A add 255 and S 1 and or}ifelse}ifelse put 1 adv}B/rsh{rw cp 2 copy
get A 0 eq{pop 128}{A 255 eq{pop 127}{A 2 idiv S 128 and or}ifelse}
ifelse put 1 adv}B/clr{rw cp 2 index string putinterval adv}B/set{rw cp
fillstr 0 4 index getinterval putinterval adv}B/fillstr 18 string 0 1 17
{2 copy 255 put pop}for N/pl[{adv 1 chg}{adv 1 chg nd}{1 add chg}{1 add
chg nd}{adv lsh}{adv lsh nd}{adv rsh}{adv rsh nd}{1 add adv}{/rc X nd}{
1 add set}{1 add clr}{adv 2 chg}{adv 2 chg nd}{pop nd}]A{bind pop}
forall N/D{/cc X A type/stringtype ne{]}if nn/base get cc ctr put nn
/BitMaps get S ctr S sf 1 ne{A A length 1 sub A 2 index S get sf div put
}if put/ctr ctr 1 add N}B/I{cc 1 add D}B/bop{userdict/bop-hook known{
bop-hook}if/SI save N @rigin 0 0 moveto/V matrix currentmatrix A 1 get A
mul exch 0 get A mul add .99 lt{/QV}{/RV}ifelse load def pop pop}N/eop{
SI restore userdict/eop-hook known{eop-hook}if showpage}N/@start{
userdict/start-hook known{start-hook}if pop/VResolution X/Resolution X
1000 div/DVImag X/IEn 256 array N 2 string 0 1 255{IEn S A 360 add 36 4
index cvrs cvn put}for pop 65781.76 div/vsize X 65781.76 div/hsize X}N
/p{show}N/RMat[1 0 0 -1 0 0]N/BDot 260 string N/Rx 0 N/Ry 0 N/V{}B/RV/v{
/Ry X/Rx X V}B statusdict begin/product where{pop false[(Display)(NeXT)
(LaserWriter 16/600)]{A length product length le{A length product exch 0
exch getinterval eq{pop true exit}if}{pop}ifelse}forall}{false}ifelse
end{{gsave TR -.1 .1 TR 1 1 scale Rx Ry false RMat{BDot}imagemask
grestore}}{{gsave TR -.1 .1 TR Rx Ry scale 1 1 false RMat{BDot}
imagemask grestore}}ifelse B/QV{gsave newpath transform round exch round
exch itransform moveto Rx 0 rlineto 0 Ry neg rlineto Rx neg 0 rlineto
fill grestore}B/a{moveto}B/delta 0 N/tail{A/delta X 0 rmoveto}B/M{S p
delta add tail}B/b{S p tail}B/c{-4 M}B/d{-3 M}B/e{-2 M}B/f{-1 M}B/g{0 M}
B/h{1 M}B/i{2 M}B/j{3 M}B/k{4 M}B/w{0 rmoveto}B/l{p -4 w}B/m{p -3 w}B/n{
p -2 w}B/o{p -1 w}B/q{p 1 w}B/r{p 2 w}B/s{p 3 w}B/t{p 4 w}B/x{0 S
rmoveto}B/y{3 2 roll p a}B/bos{/SS save N}B/eos{SS restore}B end

%%EndProcSet
%%BeginProcSet: special.pro
%!
TeXDict begin/SDict 200 dict N SDict begin/@SpecialDefaults{/hs 612 N
/vs 792 N/ho 0 N/vo 0 N/hsc 1 N/vsc 1 N/ang 0 N/CLIP 0 N/rwiSeen false N
/rhiSeen false N/letter{}N/note{}N/a4{}N/legal{}N}B/@scaleunit 100 N
/@address@hidden div/hsc X}B/@address@hidden div/vsc X}B/@hsize{
/hs X/CLIP 1 N}B/@vsize{/vs X/CLIP 1 N}B/@clip{/CLIP 2 N}B/@hoffset{/ho
X}B/@voffset{/vo X}B/@angle{/ang X}B/@rwi{10 div/rwi X/rwiSeen true N}B
/@rhi{10 div/rhi X/rhiSeen true N}B/@llx{/llx X}B/@lly{/lly X}B/@urx{
/urx X}B/@ury{/ury X}B/magscale true def end/@MacSetUp{userdict/md known
{userdict/md get type/dicttype eq{userdict begin md length 10 add md
maxlength ge{/md md dup length 20 add dict copy def}if end md begin
/letter{}N/note{}N/legal{}N/od{txpose 1 0 mtx defaultmatrix dtransform S
atan/pa X newpath clippath mark{transform{itransform moveto}}{transform{
itransform lineto}}{6 -2 roll transform 6 -2 roll transform 6 -2 roll
transform{itransform 6 2 roll itransform 6 2 roll itransform 6 2 roll
curveto}}{{closepath}}pathforall newpath counttomark array astore/gc xdf
pop ct 39 0 put 10 fz 0 fs 2 F/|______Courier fnt invertflag{PaintBlack}
if}N/txpose{pxs pys scale ppr aload pop por{noflips{pop S neg S TR pop 1
-1 scale}if xflip yflip and{pop S neg S TR 180 rotate 1 -1 scale ppr 3
get ppr 1 get neg sub neg ppr 2 get ppr 0 get neg sub neg TR}if xflip
yflip not and{pop S neg S TR pop 180 rotate ppr 3 get ppr 1 get neg sub
neg 0 TR}if yflip xflip not and{ppr 1 get neg ppr 0 get neg TR}if}{
noflips{TR pop pop 270 rotate 1 -1 scale}if xflip yflip and{TR pop pop
90 rotate 1 -1 scale ppr 3 get ppr 1 get neg sub neg ppr 2 get ppr 0 get
neg sub neg TR}if xflip yflip not and{TR pop pop 90 rotate ppr 3 get ppr
1 get neg sub neg 0 TR}if yflip xflip not and{TR pop pop 270 rotate ppr
2 get ppr 0 get neg sub neg 0 S TR}if}ifelse scaleby96{ppr aload pop 4
-1 roll add 2 div 3 1 roll add 2 div 2 copy TR .96 dup scale neg S neg S
TR}if}N/cp{pop pop showpage pm restore}N end}if}if}N/normalscale{
Resolution 72 div VResolution 72 div neg scale magscale{DVImag dup scale
}if 0 setgray}N/psfts{S 65781.76 div N}N/startTexFig{/psf$SavedState
save N userdict maxlength dict begin/magscale true def normalscale
currentpoint TR/psf$ury psfts/psf$urx psfts/psf$lly psfts/psf$llx psfts
/psf$y psfts/psf$x psfts currentpoint/psf$cy X/psf$cx X/psf$sx psf$x
psf$urx psf$llx sub div N/psf$sy psf$y psf$ury psf$lly sub div N psf$sx
psf$sy scale psf$cx psf$sx div psf$llx sub psf$cy psf$sy div psf$ury sub
TR/showpage{}N/erasepage{}N/copypage{}N/p 3 def @MacSetUp}N/doclip{
psf$llx psf$lly psf$urx psf$ury currentpoint 6 2 roll newpath 4 copy 4 2
roll moveto 6 -1 roll S lineto S lineto S lineto closepath clip newpath
moveto}N/endTexFig{end psf$SavedState restore}N/@beginspecial{SDict
begin/SpecialSave save N gsave normalscale currentpoint TR
@SpecialDefaults count/ocount X/dcount countdictstack N}N/@setspecial{
CLIP 1 eq{newpath 0 0 moveto hs 0 rlineto 0 vs rlineto hs neg 0 rlineto
closepath clip}if ho vo TR hsc vsc scale ang rotate rwiSeen{rwi urx llx
sub div rhiSeen{rhi ury lly sub div}{dup}ifelse scale llx neg lly neg TR
}{rhiSeen{rhi ury lly sub div dup scale llx neg lly neg TR}if}ifelse
CLIP 2 eq{newpath llx lly moveto urx lly lineto urx ury lineto llx ury
lineto closepath clip}if/showpage{}N/erasepage{}N/copypage{}N newpath}N
/@endspecial{count ocount sub{pop}repeat countdictstack dcount sub{end}
repeat grestore SpecialSave restore end}N/@defspecial{SDict begin}N
/@fedspecial{end}B/li{lineto}B/rl{rlineto}B/rc{rcurveto}B/np{/SaveX
currentpoint/SaveY X N 1 setlinecap newpath}N/st{stroke SaveX SaveY
moveto}N/fil{fill SaveX SaveY moveto}N/ellipse{/endangle X/startangle X
/yrad X/xrad X/savematrix matrix currentmatrix N TR xrad yrad scale 0 0
1 startangle endangle arc savematrix setmatrix}N end

%%EndProcSet
TeXDict begin @defspecial

 /blot-diameter { lilypondpaperblotdiameter } bind def /skeel { scale
} bind def /set_tex_dimen { cvr def } bind def /euclidean_length {
1 copy mul exch 1 copy mul add sqrt } bind def /skeel { scale } bind
def /draw_box { currentdict /testing known { /blot 0.005 def }{ /blot
blot-diameter def } ifelse 0 setlinecap blot setlinewidth 1 setlinejoin
blot 2 div sub /h exch def blot 2 div sub /d exch def blot 2 div sub
/w exch def blot 2 div sub /b exch def b neg d neg moveto b w add 0
rlineto 0 d h add rlineto b w add neg 0 rlineto 0 d h add neg rlineto
currentdict /testing known { stroke }{ closepath gsave stroke grestore
fill } ifelse } bind def /draw_round_box { /blot exch def 0 setlinecap
blot setlinewidth 1 setlinejoin blot 2 div sub /h exch def blot 2 div
sub /d exch def blot 2 div sub /w exch def blot 2 div sub /b exch def
b neg d neg moveto b w add 0 rlineto 0 d h add rlineto b w add neg
0 rlineto 0 d h add neg rlineto currentdict /testing known { stroke
}{ closepath gsave stroke grestore fill } ifelse } bind def /draw_beam
{ currentdict /testing known { /blot 0.005 def }{ /blot blot-diameter
def } ifelse blot setlinewidth 0 setlinecap 1 setlinejoin blot sub
/t exch def blot sub /w exch def w mul /h exch def blot 2 div t 2 div
neg moveto w h rlineto 0 t rlineto w neg h neg rlineto 0 t neg rlineto
currentdict /testing known { stroke }{ closepath gsave stroke grestore
fill } ifelse } bind def /draw_repeat_slash { 1 setlinecap 1 setlinejoin
/beamthick exch def /slope exch def /width exch def beamthick beamthick
slope div euclidean_length /xwid exch def 0 0 moveto xwid 0 rlineto
width slope width mul rlineto xwid neg 0 rlineto closepath fill } bind
def /draw_ez_ball { findfont 0.7 scalefont setfont 0.1 setlinewidth
0 0 moveto 0 setgray 0.5 0 0.5 0 360 arc closepath fill stroke 1 eq
{ 0.01 setlinewidth 1 setgray 0.5 0 0.4 0 360 arc closepath fill stroke
} if setgray 0.25 -0.25 moveto show } bind def /simple_draw_ez_ball
{ findfont 0.85 scalefont setfont /origin { 0.45 0 } def 0 setgray
1.1 setlinewidth origin moveto origin lineto stroke setgray 0.9
setlinewidth
origin moveto origin lineto stroke setgray origin moveto -0.28 -0.30
rmoveto show } bind def /draw_bezier_sandwich { setlinewidth moveto
curveto lineto curveto gsave fill grestore stroke } bind def /draw_dot
{ 0 360 arc closepath fill stroke } bind def /draw_dashed_line { 1
setlinecap 1 setlinejoin setdash setlinewidth 0 0 moveto lineto stroke
} bind def /draw_dashed_slur { 1 setlinecap 1 setlinejoin setdash
setlinewidth
8 -2 roll moveto curveto stroke } bind def /bracket_traject { /traject_ds
exch def /traject_alpha exch def traject_ds traject_alpha sin mul add
exch traject_ds traject_alpha cos mul add exch } bind def /half_bracket
{ 0 0 bracket_thick arch_height add half_height arch_thick sub arch_width
add arch_angle arch_height -0.15 mul bracket_traject bracket_thick
0.5 mul half_height 0 arch_height 0.5 mul bracket_traject 0 half_height
bracket_thick half_height arch_thick sub 0 arch_height 0.4 mul
bracket_traject
bracket_thick arch_height add half_height arch_thick sub arch_width
add arch_angle arch_height -0.25 mul bracket_traject bracket_thick
arch_height add half_height arch_thick sub arch_width add bracket_thick
half_height arch_thick sub bracket_thick 0 0 0 } bind def
/draw_half_bracket
{ moveto lineto lineto curveto curveto lineto gsave fill grestore }
bind def /draw_bracket { /bracket_thick exch def /arch_thick exch def
/bracket_height exch def /arch_height exch def /arch_width exch def
/arch_angle exch def bracket_height 2 div bracket_thick add /half_height
exch def bracket_thick 0.5 mul setlinewidth 1 setlinecap 1 setlinejoin
half_bracket 20 copy 1 -1 scale draw_half_bracket stroke 1 -1 scale
draw_half_bracket stroke } bind def

 /lilypondpaperblotdiameter (0.014058) set_tex_dimen
 
@fedspecial end TeXDict begin
39158280 55380996 1000 600 600 (tablature.dvi) @start
%DVIPSBitmapFont: Fa cmr10 10 18
/Fa 18 122 df<121C127FEAFF80A213C0A3127F121C1200A412011380A2120313005A12
06120E5A5A5A12600A19798817>44 D<121C127FEAFF80A5EA7F00121C0909798817>46
D<EB03F8EB1FFF90387E0FC09038F803E03901E000F0484813780007147C48487FA248C7
7EA2481580A3007EEC0FC0A600FE15E0B3007E15C0A4007F141F6C1580A36C15006D5B00
0F143EA26C6C5B6C6C5B6C6C485A6C6C485A90387E0FC0D91FFFC7FCEB03F8233A7DB72A
>48 D<EB01C013031307131F13FFB5FCA2131F1200B3B3A8497E007FB512F0A31C3879B7
2A>I<EB0FF0EB7FFE48B57E3903E03FE0390F000FF0000E6D7E486D7E486D7E12300070
6D7E126012FCB4EC7F807FA56CC7FC121CC8FCEDFF00A34A5A5D14035D4A5A5D140F4A5A
4A5A92C7FC147C5C495A495A495A495A91C8FC011EEB01805B5B49130348481400485A48
5A000EC75A000FB6FC5A5A485CB6FCA321387CB72A>I<EB07F8EB3FFF4913C03901F80F
F03903C007F848486C7E380E0001000F80381FE0006D7FA56C5A6C5AC85A1401A25D4A5A
A24A5A5DEC0F80027EC7FCEB1FFCECFF809038000FE06E7EEC01FC816E7EED7F80A216C0
A2153F16E0A2121EEA7F80487EA416C049137F007F1580007EC7FC0070ECFF006C495A12
1E390F8003F83907F00FF00001B512C06C6C90C7FCEB0FF8233A7DB72A>I<1538A21578
15F8A2140114031407A2140F141F141B14331473146314C313011483EB03031307130613
0C131C131813301370136013C01201EA038013005A120E120C5A123812305A12E0B712F8
A3C73803F800AB4A7E0103B512F8A325397EB82A>I<0006140CD80780133C9038F003F8
90B5FC5D5D158092C7FC14FC38067FE090C9FCABEB07F8EB3FFE9038780F803907E007E0
90388003F0496C7E12066E7EC87EA28181A21680A4123E127F487EA490C71300485C12E0
00605C12700030495A00385C6C1303001E495A6C6C485A3907E03F800001B5C7FC38007F
FCEB1FE0213A7CB72A>I<B612E0A3000101C0C8FC6C90C9FCB3AD1718A517381730A317
70A317F0A216011603160FEE1FE0486D13FFB8FCA32D397DB834>76
D<EB1FE0EBFFFC3803E03F3907000F80390F8007E0486C6C7E13E06E7EA26E7E6C5A6C5A
C8FCA4147FEB07FFEB3FE0EBFE00EA03F8EA0FF0EA1FC0123F485A90C7FC160C12FEA314
01A26C13036CEB077C903980063E18383FC01E3A0FE0781FF03A03FFF00FE03A007F8007
C026277DA52A>97 D<EB07F8EB1FFF90387C0FC03901F803E03903F001F0D807E013F838
0FC0004848137CA248C7127E153E5A153F127E12FEA3B7FCA248C8FCA5127EA2127FA26C
14037F001F14076C6C13060007140E6D131CD801F013386C6C137090387E03E090381FFF
80903803FC0020277EA525>101 D<EA03F012FFA3120F1203B0EC0FF0EC3FFCECF03F90
39F1C01F809039F3800FC0EBF70013FE496D7EA25BA35BB3A3486C497EB500C1B51280A3
293A7EB92E>104 D<EA0380EA0FE0487EA56C5AEA0380C8FCAAEA03F012FFA312071203
B3AA487EB512C0A312387EB717>I<EA03F012FFA3120F1203B3B3AD487EB512C0A3123A
7EB917>108 D<3807E01F00FFEB7FC09038E1E3E09038E387F0380FE707EA03E613EE90
38EC03E09038FC0080491300A45BB3A2487EB512F0A31C257EA421>114
D<EBFF03000313E7380F80FF381E003F487F487F00707F12F0A2807EA27EB490C7FCEA7F
E013FF6C13E06C13F86C7F00037FC67F01071380EB007F141F00C0EB0FC01407A26C1303
A37E15806C13077EEC0F00B4131E38F3C07C38E1FFF038C03F801A277DA521>I<B53A1F
FFE03FFEA3260FF8009038000FF86C48017EEB03E018C00003023EEB0180A26C6C013FEB
0300A36C6CEC8006156FA2017E9038EFC00C15C7A2D93F016D5A15830281EBF038D91F83
1430150102C3EBF87090260FC6001360A2D907E66D5A02EC137CA2D903FCEB7F804A133F
A2010192C7FC4A7FA20100141E4A130E0260130C37257EA33C>119
D<B538803FFEA33A0FF8000FF06C48EB07C00003EC03806C7E16007F00001406A2017E5B
A2137F6D5BA26D6C5AA2ECC070010F1360A26D6C5AA214F101035BA2D901FBC7FCA214FF
6D5AA2147CA31438A21430A214701460A25CA2EA7C0100FE5B130391C8FC1306EAFC0EEA
701C6C5AEA1FF0EA0FC027357EA32C>121 D E
%EndDVIPSBitmapFont
%DVIPSBitmapFont: Fb feta20 20 3
/Fb 3 114 df<EEFFE0030F13FC037F13FF0203B612C0020F15E0023F15F04A15F849B7
FC4916FC130F5B4916FE5B90B8FC5A5AA25A5A18FC5AA24817F8A24817F0A218E0B9FC18
C01880A218005F5F5F6C5E5F17806C93C7FC16FC6C5D6C15E06C1580000102FCC8FC6C6C
13E0D90FFEC9FC372E809637>32 D[<4E7E4E7E4E7E180F4E7E4E7EF07FDCF0FFFC4D7F
855F4D804D80A24DEBFBE04D13FF864D13FDF1FFF894B6FC4C81A24CECFE7E19FC4C4A7E
19F04F6C7E4C14C0F1800F4C02007F60747E4C5B604E6D7E5E604E8093B5FC4E13018795
C7FCA24B5B875FA25F874B5BA35FA2885FA2625FA494C8FC62A462A26F5A5090C9FCA362
A3505A15001AFFA24F5BA261047E5E61A2047F4A5BA2704A5BA2614F5BA2706C90B55A60
98CAFC60040F495B17C04E5B4E5B160771485B6095B55A706C5C17F105F35CDC01F791CB
FC94B6FC6161826161615E4C5C4C5C4C91CCFCA24C5B4C5B4C5B93B55A5D604B5C4B805D
5D845D4B13FB92B5EAF1F817E15C4AECC0FC4A148017004A49137E5C4A5B4C133E4A4913
3F91B55AA2494A6D7E495C93C7FC49707E495B5D49496E7EA2495B4B140349835D90B55A
727E4891C8FC5C48F0FFF84A031FEBFFC0484992B612F8050315FF4A020F16C048043F16
F04A4A824CB812FE484949834C18C04A4984484B8491C7488489494A84007F92BBFC8A49
49ED0FCF06F001C0814BDA8007011F8049DBFE00EBE00700FF4A4903018005F06F7E494B
01036E7F4B496E130F4D707F94C781494A02016E7F031F707F4C187F8A4C020081894972
16804C84A2087C80127F087E6E13C0150FA2083E80003F810307163FA27084001F020382
6D801501000F6F8281706C19806C6C6F140F707E00036F7E6D6E7E00016F6C6F4913006D
6EB4FC00006F7F6D6E01E001075D017EDB3FF016036D6F7E6E0207606D6C02011707010F
DB00706E5C6D6C92C7150F6E636D6C05034A5A6D6C1A3F6D6C63027F505ADA3FC019FF6E
6C4E90C7FC6E6C4E5ADA07FC4E5ADA01FF71485A6E01C0EF3FF0DB7FF0EFFFE0DB1FFCDB
01F35B6FB46C92B5C8FC030301F85E0300D9FFC0011F13F8043F90B75A040F17C004014C
C9FC706C15F01707DD001F13E195C71201ABEEFF80030713F0031F7F037F13FE92B6FC4A
814A6F13034A81A24A81A24A6084A25C1A07A363A34E130FA36E4B5C1A1F60606E92C748
CAFC5F05F85C6ED99FC0147E04C0C812FE6E5F7014016E4C5A6E7F4F5A6F6C4A5A6F6C14
1F6F6C4A5A6F6CECFF806FD9C00390CBFC6F9038F01FFE030090B512F8705C041F14C004
0391CCFC9338007FE0>106 311 119 334 104 107 D<EE3FFE0307B512E0037F14F84A
B612FE02076F7E021FD9F0037F027F90C7EA7FF0DAFFFCEC0FF8010349EC03FC49496E7E
4949EC007F49EF3F804949EC03FF49040F13C090B548023F13E0604894B512F04891C75A
1AF8485E5F4819FC5C5F5A1AFE5AA45A7114FCA37114F8A2B56F14F07114E07213C07213
8095380FFE00F001F895C8FCAA7EA51A066C190FA31A1E7EA26C193CA26E177C6C19781A
F86C19F019016C6EED03E07EF107C06D6DED0F806D171F6D6DED3F006D177E6D6D5D6D6D
EC03F801006DEC0FF06EB4EC3FE0021F9039F001FFC0020790B6C7FC020115FC6E6C14F0
030714C09226003FFEC8FC485880AB47>113 D E
%EndDVIPSBitmapFont
%DVIPSBitmapFont: Fc cmbx10 10 1
/Fc 1 50 df<141E143E14FE1307133FB5FCA313CFEA000FB3B3A6007FB61280A4213779
B630>49 D E
%EndDVIPSBitmapFont
end
%%EndProlog
%%BeginSetup
%%Feature: *Resolution 600dpi
TeXDict begin
%%BeginPaperSize: a4
a4
%%EndPaperSize

%%EndSetup
%%Page: 1 1
1 0 bop 4077 -196 a Fc(1)p -43 1114 4168 5 v -43 1073
V -43 1031 V -43 990 V -43 948 V -43 907 V -43 595 V
-43 554 V -43 512 V -43 471 V -43 429 V 173 510 a Fb(q)-2
552 y(k)p 4118 593 7 167 v 4118 1112 7 208 v 4118 1112
V 4118 593 7 167 v 3199 367 a
 @beginspecial @setspecial 1.757299  2.83464566929134 mul 1.757299
 2.83464566929134 mul skeel  0.0611 12.0749 0.4800 draw_beam @endspecial
 3199 367 a 2703 397 a
 @beginspecial @setspecial 1.757299  2.83464566929134 mul 1.757299
 2.83464566929134 mul skeel  0.0611 12.0749 0.4800 draw_beam @endspecial
 2703
397 a 2207 427 a
 @beginspecial @setspecial 1.757299  2.83464566929134 mul 1.757299
 2.83464566929134 mul skeel  0.0611 12.0749 0.4800 draw_beam @endspecial
 2207 427 a 3695 436 6 101 v 3645 925
a Fa(0)3645 448 y Fb( )p 3199 478 6 112 v 3149 967 a
Fa(1)3149 489 y Fb( )p 2703 540 6 144 v 2653 1008 a Fa(0)2653
552 y Fb( )p 2207 582 6 155 v 1367 361 a
 @beginspecial @setspecial 1.757299  2.83464566929134 mul 1.757299
 2.83464566929134 mul skeel  0.0751 12.0749 0.4800 draw_beam @endspecial
 1367 361 a 872
398 a
 @beginspecial @setspecial 1.757299  2.83464566929134 mul 1.757299
 2.83464566929134 mul skeel  0.0751 12.0749 0.4800 draw_beam @endspecial
 872 398 a 376 435 a
 @beginspecial @setspecial 1.757299  2.83464566929134 mul 1.757299
 2.83464566929134 mul skeel  0.0751 12.0749 0.4800 draw_beam @endspecial
 376 435 a 2158 1050 a Fa(2)2158
593 y Fb( )p 1863 436 6 114 v 1814 925 a Fa(0)1814 448
y Fb( )p 1367 478 6 118 v 1318 967 a Fa(1)1318 489 y
Fb( )p 872 540 6 143 v 822 1008 a Fa(0)822 552 y Fb( )p
376 623 6 189 v 326 1091 a Fa(3)326 635 y
 @beginspecial @setspecial 1.757299  2.83464566929134 mul 1.757299
 2.83464566929134 mul skeel  0.3302 1.6512 0.1000 0.1000 0.2000
draw_round_box
@endspecial
 326 635 a Fb( )-2
552 y(k)173 510 y(q)p -43 1114 7 690 v -336 6075 a Fa(Lily)27
b(w)n(as)g(here,)g(1.5.54)p eop
%%Trailer
end
userdict /end-hook known{end-hook}if
%%EOF



reply via email to

[Prev in Thread] Current Thread [Next in Thread]