4 =======================================================================
5 LilyPond to dvi converter
7 Features include Title information, paper size specification, and image
10 Usage: ly2dvi.py [OPTION]... [FILE]...
11 Input: LilyPond source or LilyPond generated TeX files
13 =======================================================================
31 This class handles all ly2dvi.py input file methods
35 __init__() Constructor
36 open(file) Open a .ly file or .tex file using lilyinclude path
37 close() Close current file
38 type() Determine file type .ly (input) or .tex (output)
39 setVars() Set title definitions found in .tex (output) file
54 open file and set private class variable __fd. The search
55 sequence is: current directory followed by the directories
56 found in include property list. Each directory is searched
57 for file, file.ly, file.sly and file.fly.
61 error: ExitNotFound Exception
64 for i in [''] + Props.get('include')[0:]:
65 ifile = os.path.join(i,file)
66 for j in ['','.ly','.fly', '.sly']:
69 this.__fd = open( jfile, 'r' )
73 sys.exit('ExitNotFound', file)
81 close file object __fd
95 Determine input file type. LilyPond source is 'input' type
96 and LilyPond generated TeX file is 'output' type
99 output: 'input' | 'output'
103 firstline = this.__fd.readline()
105 if re.match('%created by: GNU LilyPond [0-9]+[.0-9]+',firstline ):
116 Search for properties in the current input file and set the
117 appropriate values. The supported properties names are in
118 local variable varTable along with the property list
129 ( 'language', Props.setLanguage ),
130 ( 'latexheaders', Props.setHeader ),
131 ( 'orientation', Props.setOrientation ),
132 ( 'paperpapersize', Props.setPaperZize ),
133 ( 'papertextheight', Props.setTextHeight ),
134 ( 'paperlinewidth', Props.setLineWidth ),
135 ( 'filename', Props.setFilename ),
139 for line in this.__fd.readlines():
140 m=re.match('\\\\def\\\\mudela([\w]+){(.*)}',line)
143 if m.group(1) == var[0]:
144 var[1](m.group(2),'file')
146 for var in Props.get('titledefs'):
147 if m.group(1) == var:
148 titles[var]=m.group(2)
150 Props.setTitles(titles,'file')
157 This class handles all ly2dvi.py output file methods
160 __mudelaDefs(opt) Send title info to output file
163 __init__() Constructor
164 write(str) Write a string to output file
165 start(file) Start the latex file
166 next() Process next output file
167 end() Finish latex file and run latex
181 def __mudelaDefs(this,opt):
183 Write titles to output
185 input: opt Supports header and subheader output
190 titles = Props.get('titles')
191 for key in titles.keys():
192 this.write('%s\\mudela%s{%s}%%\n' % (opt,key,titles[key]))
199 Write str to current output file
201 input: str String to write
211 def start(this,file):
213 Start LaTeX file. Calculates the horizontal and vertical
214 margin using pagewidth, pageheight, linewidth, and textheight.
215 Creates temporary output filename and opens it for write.
216 Sends the LaTeX header information to output. Lastly sends
217 the title information to output.
219 input: file output file name
224 now=time.asctime(time.localtime(time.time()))
225 linewidth = Props.get('linewidth')
226 textheight = Props.get('textheight')
228 if Props.get('orientation') == 'landscape':
229 pagewidth = Props.get('pageheight')
230 pageheight = Props.get('pagewidth')
232 pageheight = Props.get('pageheight')
233 pagewidth = Props.get('pagewidth')
235 horizontalMarginArg = ( (pagewidth - linewidth)/2 )
236 verticalMarginArg = ( (pageheight - textheight)/2 )
240 %% Automatically generated from %s, %s
242 \\documentclass[%s]{article}
245 \\usepackage{geometry}
246 \\usepackage[latin1]{inputenc}
247 %%\\usepackage[T1]{fontenc}
249 %%\\addtolength{\\oddsidemargin}{-1cm}
250 %%\\addtolength{\\topmargin}{-1cm}
251 %%\\setlength{\\textwidth}{%s}
252 %%\\setlength{\\textheight}{%s}
253 \\geometry{width=%spt, left=%spt, height=%spt, top=%spt}
258 """ % ( program_id(), Props.get('filename'), now, Props.get('papersize'),
259 Props.get('language'), Props.get('pagenumber'), linewidth, textheight,
260 linewidth, horizontalMarginArg, textheight, verticalMarginArg,
261 Props.get('header') )
263 pathcomp = os.path.splitext(file)
264 this.__base = pathcomp[0]
265 this.__outfile = '%s.%d%s' % (pathcomp[0], os.getpid(), pathcomp[1])
267 this.__fd = open(this.__outfile,"w")
269 sys.exit('ExitNoWrite', this.__outfile)
271 this.__mudelaDefs('')
281 Write LaTeX subheader information to support more than one
282 score in a document. Lastly send current title information to
294 \\def\\mudelapiece{}%
296 this.__mudelaDefs("\\def")
298 \\def\\theopus{\\mudelaopus}% ugh
299 \\def\\thepiece{\\mudelapiece}%
309 Close output file and run latex on it.
313 error: ExitBadLatex Exception
316 outfile=this.__base + '.dvi'
317 if Props.get('output') != '':
318 outfile = os.path.join(Props.get('output'), outfile )
321 \\vfill\\hfill{\\mudelatagline}
325 if os.path.isfile(outfile):
327 if ( os.name == 'posix' ):
328 stat = os.system('latex \'\\nonstopmode \\input %s\'' %
330 else: # Windows shells don't eat the single quotes
331 stat = os.system('latex \\nonstopmode \\input %s' %
334 sys.exit('ExitBadLatex')
335 if not os.path.isfile(outfile):
336 os.rename(this.__base + '.' + str(os.getpid()) + '.dvi', outfile)
338 sys.stderr.write('\n' + program_id() + ': dvi file name is %s\n\n'
341 if Props.get('postscript'):
342 psoutfile=this.__base + '.ps'
343 if Props.get('output') != '':
344 psoutfile = os.path.join(Props.get('output'), psoutfile )
345 stat = os.system('dvips -o %s %s' % (psoutfile,outfile))
347 sys.exit('ExitBadPostscript')
354 This class handles all ly2dvi.py property manipulation
358 __init__() Constructor
359 set<property> methods
365 # Following is the order of priority for property assignment. The
366 # list is organized from lowest to highest priority. Each
367 # assignment is overridden by the next requester in the list.
369 # Requester Description
370 # --------- -----------
371 # init Initial default values
372 # file The values found in the lilypond generated TeX files
373 # environment Envrionment variables LILYINCLUDE, LILYPONDPREFIX
374 # rcfile $LILYPONDPREFIX/.lilyrc
375 # rcfile $HOME/.lilyrc
377 # commandline command line arguments
379 this.__overrideTable = {
388 this.__roverrideTable = {} # reverse lookup used for debug
389 for i in this.__overrideTable.items():
390 this.__roverrideTable[i[1]]=i[0]
393 'pagewidth' : [597, this.__overrideTable['init']],
394 'pageheight' : [845, this.__overrideTable['init']],
395 'papersize' : ['a4paper', this.__overrideTable['init']],
396 'textheight' : [0, this.__overrideTable['init']],
397 'linewidth' : [500, this.__overrideTable['init']],
398 'orientation' : ['portrait', this.__overrideTable['init']],
399 'language' : ['%', this.__overrideTable['init']],
400 'include' : [[], this.__overrideTable['init']],
401 'debug' : [0, this.__overrideTable['init']],
402 'keeplilypond' : [0, this.__overrideTable['init']],
403 'keeply2dvi' : [0, this.__overrideTable['init']],
404 'pagenumber' : ['%', this.__overrideTable['init']],
405 'separate' : [0, this.__overrideTable['init']],
406 'output' : ['', this.__overrideTable['init']],
407 'header' : ['%', this.__overrideTable['init']],
408 'dependencies' : [0, this.__overrideTable['init']],
409 'root' : ['', this.__overrideTable['init']],
410 'tmp' : ['d:\tmp', this.__overrideTable['init']],
411 'filename' : ['', this.__overrideTable['init']],
412 'titledefs' : [[], this.__overrideTable['init']],
413 'titles' : [{}, this.__overrideTable['init']],
414 'lilyOutputFiles' : [[], this.__overrideTable['init']],
415 'postscript' : [0, this.__overrideTable['init']],
419 # Try to set root and HOME first before calling rcfile
421 if os.environ.has_key('LILYPONDPREFIX'):
422 this.setRoot(os.environ['LILYPONDPREFIX'], 'environment')
424 p=os.path.split(sys.argv[0])
425 p=os.path.split(p[0])
426 # bit silly. for ly2dvi, overrules compiled-in datadir...
427 # how to do this better (without running lily, of course?
428 this.setRoot(os.path.join(p[0],'share','lilypond'), 'init')
430 if not os.environ.has_key('HOME'):
431 if os.environ.has_key('HOMEDRIVE') and \
432 os.environ.has_key('HOMEPATH'):
433 os.environ['HOME'] = os.environ['HOMEDRIVE'] + \
434 os.environ['HOMEPATH']
436 os.environ['HOME'] = os.curdir
438 this.rcfile() # Read initialization file(s)
440 if os.environ.has_key('LILYINCLUDE'):
441 tmp=this.get('include')
442 for s in string.split(os.environ['LILYINCLUDE'],os.pathsep):
444 this.__set('include', tmp, 'environment')
448 if os.environ.has_key ('TEXINPUTS'):
449 t = os.environ['TEXINPUTS'] + os.pathsep
450 os.environ['TEXINPUTS'] = t + \
451 os.path.join(this.get('root'), 'tex' ) + \
452 os.pathsep + os.path.join(this.get('root'), 'ps' )
455 if os.environ.has_key ('MFINPUTS'):
456 t = os.environ['MFINPUTS']
457 os.environ['MFINPUTS'] = os.pathsep + t + \
458 os.path.join(this.get('root'), 'mf')
460 if os.environ.has_key('TMP'):
461 this.__set('tmp',os.environ['TMP'],'environment')
464 fd=this.get_texfile_path ('titledefs.tex')
467 for line in fd.readlines():
468 m=re.match('\\\\newcommand\*{\\\\mudela([\w]+)}',line)
470 mudefs.append(m.group(1))
472 this.__set('titledefs', mudefs, 'init')
477 def __set(this,var,value,requester):
479 All of the set methods call this to set a property. If the value
480 was last set by a requestor of lesser priority the new value is
481 assigned, else the old value has priority and is unchanged.
484 if this.__overrideTable[requester] < this.__data[var][1]:
487 this.__data[var] = [value, this.__overrideTable[requester]]
494 All of the get methods call this to get a property value. List
495 variable types are return by value to facilitate an append operation.
498 if var == 'include' or var == 'lilyOutputFiles':
499 return this.__data[var][0][0:] # return a copy not a ref
501 return this.__data[var][0]
506 def get_texfile_path (this, var):
508 locate and open titledefs.tex file
512 path = os.path.join(this.get('root'), 'tex', var)
515 cmd =('kpsewhich tex %s %s' % (var,errorlog))
516 pipe = os.popen (cmd, 'r')
517 path = pipe.readline ()[:-1] # chop off \n
518 return_status = pipe.close()
519 if return_status and not path:
520 path = os.path.join(this.get('root'), 'tex', var)
530 Read initialization file(s)
535 ( 'DEBUG', this.setDebug ),
536 ( 'DEPENDENCIES', this.setDependencies ),
537 ( 'KEEPLILYPOND', this.setKeeplilypond ),
538 ( 'KEEPLY2DVI', this.setKeeply2dvi ),
539 ( 'LANGUAGE', this.setLanguage ),
540 ( 'LATEXHF', this.setHeader ),
541 ( 'LILYINCLUDE', this.setInclude ),
542 ( 'LILYPONDPREFIX', this.setRoot ),
543 ( 'NONUMBER', this.setNonumber ),
544 ( 'ORIENTATION', this.setOrientation ),
545 ( 'OUTPUTDIR', this.setOutput ),
546 ( 'PAPERSIZE', this.setPaperZize ),
547 ( 'PHEIGHT', this.setTextHeight ),
548 ( 'POSTSCRIPT', this.setPostscript ),
549 ( 'PWIDTH', this.setLineWidth ),
550 ( 'SEPARATE', this.setSeparate ),
551 ( 'TMP', this.setTmp ),
554 if ( os.name == 'posix' ):
555 dotFilename='.lilyrc'
556 else: # Windows apps like edit choke on .lilyrc
557 dotFilename='_lilyrc'
559 for d in [os.path.join(this.get('root'),'ly'), \
560 os.environ['HOME'], os.curdir ]:
561 file=os.path.join(d,dotFilename)
563 fd = open( file, 'r' )
567 for line in fd.readlines():
568 if re.match('#.*',line):
570 m=re.search('([\w]+)=(.*)',line)
573 if m.group(1) == var[0]:
574 var[1](m.group(2),'rcfile')
581 def setPaperZize(this,size,requester):
583 Set paper size properties
587 # regex width height name
588 # ----- ----- ------ ----
589 ( 'a0.*', 2389, 3381, 'a0paper' ),
590 ( 'a1$|a1p.*', 1690, 2389, 'a1paper' ),
591 ( 'a2.*', 1194, 1690, 'a2paper' ),
592 ( 'a3.*', 845, 1194, 'a3paper' ),
593 ( 'a4.*', 597, 845, 'a4paper' ),
594 ( 'a5.*', 423, 597, 'a5paper' ),
595 ( 'a6.*', 298, 423, 'a6paper' ),
596 ( 'a7.*', 211, 298, 'a7paper' ),
597 ( 'a8.*', 305, 211, 'a8paper' ),
598 ( 'a9.*', 105, 305, 'a9paper' ),
599 ( 'a10.*', 74, 105, 'a10paper' ),
600 ( 'b0.*', 2847, 4023, 'b0paper' ),
601 ( 'b1.*', 2012, 2847, 'b1paper' ),
602 ( 'b2.*', 1423, 2012, 'b2paper' ),
603 ( 'b3.*', 1006, 1423, 'b3paper' ),
604 ( 'b4.*', 712, 1006, 'b4paper' ),
605 ( 'b5.*', 503, 712, 'b5paper' ),
606 ( 'archA$', 650, 867, 'archApaper' ),
607 ( 'archB$', 867, 1301, 'archBpaper' ),
608 ( 'archC$', 1301, 1734, 'archCpaper' ),
609 ( 'archD$', 1734, 2602, 'archDpaper' ),
610 ( 'archE$', 2602, 3469, 'archEpaper' ),
611 ( 'flsa$|flse$', 614, 940, 'flsapaper' ),
612 ( 'halfletter$', 397, 614, 'halfletterpaper' ),
613 ( 'ledger$', 1229, 795, 'ledgerpaper' ),
614 ( 'legal$', 614, 1012, 'legalpaper' ),
615 ( 'letter$', 614, 795, 'letterpaper' ),
616 ( 'note$', 542, 723, 'notepaper' )
620 for paper in paperTable:
621 if re.match(paper[0],size):
623 this.__set('pagewidth',paper[1],requester)
624 this.__set('pageheight',paper[2],requester)
625 this.__set('papersize',paper[3],requester)
629 sys.exit('ExitBadPaper',size)
634 def setTextHeight(this,size,requester):
636 Set textheight property
639 m=re.match('([0-9][.0-9]*)(cm|mm|pt|$)',size)
641 if m.group(2) == 'cm':
642 this.__set('textheight',\
643 float(m.group(1)) * 72.27/2.54, requester )
644 elif m.group(2) == 'mm':
645 this.__set('textheight',\
646 float(m.group(1)) * 72.27/25.4, requester )
647 elif m.group(2) == 'pt':
648 this.__set('textheight', float(m.group(1)), requester )
649 elif m.group(2) == '':
650 this.__set('textheight', float(m.group(1)), requester )
652 sys.exit('ExitBadHeight', m.group(2))
654 sys.exit('ExitBadHeight', size)
659 def setLineWidth(this,size,requester):
661 Set linewidth propery
664 m=re.match('([0-9][.0-9]*)(cm|mm|pt|$)',size)
666 if m.group(2) == 'cm':
667 this.__set('linewidth', \
668 float(m.group(1)) * 72.27/2.54, requester )
669 elif m.group(2) == 'mm':
670 this.__set('linewidth', \
671 float(m.group(1)) * 72.27/25.4, requester )
672 elif m.group(2) == 'pt':
673 this.__set('linewidth', float(m.group(1)), requester )
674 elif m.group(2) == '':
675 this.__set('linewidth', float(m.group(1)), requester )
677 sys.exit('ExitBadWidth', m.group(2))
679 sys.stderr.write ('ly2dvi: warning: ignoring linewidth: ' + size + '\n')
684 def setOrientation(this,orient,requester):
686 Set orientation property
689 if orient == 'landscape' or orient == 'portrait':
690 this.__set('orientation', orient, requester )
692 sys.exit('ExitBadOrient', orient)
697 def setLanguage(this,lang,requester):
699 Set language property
702 this.__set('language', '\\usepackage[%s]{babel}' % (lang), requester )
707 def setInclude(this,inc, requester):
709 Append an include path
712 tmp = this.get('include')
714 this.__set('include', tmp, requester )
719 def setDebug(this,value,requester):
721 Set or Clear debug flag
725 this.__set('debug',1,requester)
727 this.__set('debug',0,requester)
732 def setKeeplilypond(this, value, requester):
734 Set or Clear keeplilypond flag
738 this.__set('keeplilypond',1,requester)
740 this.__set('keeplilypond',0,requester)
745 def setKeeply2dvi(this, value, requester):
747 Set or Clear keeply2dvi flag
751 this.__set('keeply2dvi',1,requester)
753 this.__set('keeply2dvi',0,requester)
758 def setNonumber(this, value, requester):
764 this.__set('pagenumber','\\pagestyle{empty}',requester)
766 this.__set('pagenumber','%',requester)
771 def setSeparate(this, value, requester):
773 Set or Clear separate flag
777 this.__set('separate',1,requester)
779 this.__set('separate',0,requester)
782 # Set output directory name
784 def setOutput(this,out,requester):
785 this.__set('output',out,requester)
788 # Set latex header name
790 def setHeader(this,head, requester):
791 this.__set('header',head,requester)
794 # Set or Clear Dependencies flag to generate makefile dependencies
796 def setDependencies(this, requester):
798 Set or Clear dependencies flag
802 this.__set('dependencies',1,requester)
804 this.__set('dependencies',0,requester)
809 def setTmp(this,dir, requester):
810 this.__set('tmp',dir,requester)
813 # Set mudela source file name
815 def setFilename(this,file, requester):
816 this.__set('filename',file,requester)
821 def setTitles(this,titles, requester):
822 this.__set('titles',titles,requester)
827 def addLilyOutputFiles(this,filelist,requester):
829 Add a to the lily output list
832 tmp = this.get('lilyOutputFiles')
834 this.__set('lilyOutputFiles',tmp,requester)
837 # Set/Clear postscript flag
839 def setPostscript(this,value,requester):
845 this.__set('postscript',1,requester)
847 this.__set('postscript',0,requester)
852 def setRoot(this,path, requester):
854 Set lilypond root directory
857 os.environ['LILYPONDPREFIX'] = path
858 if os.name == 'nt' or os.name == 'dos':
859 path = unc2dos(path);
861 this.__set('root',path,requester)
867 def printProps(this):
872 for key in this.__data.keys():
873 print "%s <%s>:<%s>" % (key,this.get(key),
874 this.__roverrideTable[this.__data[key][1]])
884 if len(Props.get('include')) > 0:
885 inc = string.join (map (lambda x: '-I "%s"' % x, Props.get('include')))
888 if Props.get('dependencies'):
895 def writeLilylog(contents):
896 if Props.get('keeplilypond'):
897 file='lilylog.' + str(os.getpid())
898 output = Props.get('output')
900 file = os.path.join( output, file )
902 fd = open( file, 'w' )
904 sys.exit('ExitNoWrite', file)
908 def getTeXFile(contents):
910 for line in string.split(contents,'\n'):
911 m = re.search('^Paper output to (.+)\.\.\.', line)
913 texfiles.append(m.group(1))
916 sys.exit('ExitNoTeXName')
922 Convert a path of format //<drive>/this/that/the/other to
923 <drive>:\this\that\the\other
925 m=re.match('^//([A-Za-z])(/.*)$',path)
927 return m.group(1) + ':' + os.path.normpath(m.group(2))
932 return name + ' ' + version;
937 return os.environ['MAILADDRESS']
939 return '(address unknown)'
943 sys.stderr.write (program_id () + '\n')
947 'Generate dvi file from mudela or lilypond output\n'
948 'Usage: ' + name + ' [OPTION]... [FILE]...\n'
951 ' -D,--debug increase verbosity\n'
952 ' -F,--headers= name of additional LaTeX headers file\n'
953 ' -H,--Height= set paper height (points) (see manual page)\n'
954 ' -I,--include=DIR add DIR to LilyPond\'s search path\n'
955 ' -K,--keeplilypond keep lilypond output files\n'
956 ' -L,--landscape set landscape orientation\n'
957 ' -N,--nonumber switch off page numbering\n'
958 ' -O,--orientation= set orientation (obsolete - use -L instead)\n'
959 ' -P,--postscript generate postscript file\n'
960 ' -W,--Width= set paper width (points) (see manual page)\n'
961 ' -d,--dependencies tell lilypond make a dependencies file\n'
962 ' -h,--help this help text\n'
963 ' -k,--keeply2dvi keep ly2dvi output files\n'
964 ' -l,--language= give LaTeX language (babel)\n'
965 ' -o,--output= set output directory\n'
966 ' -p,--papersize= give LaTeX papersize (eg. a4)\n'
967 ' -s,--separate run all files separately through LaTeX\n'
969 'files may be (a mix of) input to or output from lilypond(1)\n'
979 """Generate dvi files from lilypond source/output"""
982 outfile = TeXOutput()
985 (options, files) = getopt.getopt (sys.argv[1:],
986 'DF:H:I:KLNPW:dhkl:o:p:s',
987 ['debug', 'headers=', 'Height=',
988 'include=', 'keeplilypond', 'landscape',
989 'nonumber', 'Width=', 'dependencies',
990 'help', 'keeply2dvi', 'language=',
991 'output=', 'papersize=', 'separate',
996 if o == '--debug' or o == '-D':
997 Props.setDebug(1,'commandline')
998 elif o == '--headers' or o == '-F':
999 Props.setHeader(a,'commandline')
1000 elif o == '--include' or o == '-I':
1001 Props.setInclude(a,'commandline')
1002 elif o == '--Height' or o == '-H':
1003 Props.setTextHeight(a,'commandline')
1004 elif o == '--keeplilypond' or o == '-K':
1005 Props.setKeeplilypond(1,'commandline')
1006 elif o == '--landscape' or o == '-L':
1007 Props.setOrientation('landscape','commandline')
1008 elif o == '--nonumber' or o == '-N':
1009 Props.setNonumber(1,'commandline')
1010 elif o == '--Width' or o == '-W':
1011 Props.setLineWidth(a,'commandline')
1012 elif o == '--dependencies' or o == '-d':
1013 Props.setDependencies(1,'commandline')
1014 elif o == '--help' or o == '-h':
1017 elif o == '--keeply2dvi' or o == '-k':
1018 Props.setKeeply2dvi(1,'commandline')
1019 elif o == '--language' or o == '-l':
1020 Props.setLanguage(a,'commandline')
1021 elif o == '--output' or o == '-o':
1022 Props.setOutput(a,'commandline')
1023 elif o == '--papersize' or o == '-p':
1024 Props.setPaperZize(a,'commandline')
1025 elif o == '--separate' or o == '-s':
1026 Props.setSeparate(1,'commandline')
1027 elif o == '--postscript' or o == '-P':
1028 Props.setPostscript(1,'commandline')
1033 type = infile.type()
1035 if type == 'source':
1036 if os.environ.has_key('OS') and \
1037 os.environ['OS'] == 'Windows_95':
1038 cmd = 'ash -c "lilypond %s %s 2>&1"' %(getLilyopts(), file)
1040 cmd = 'lilypond %s %s 2>&1' % (getLilyopts(), file)
1041 sys.stderr.write ('executing: %s\n'% cmd)
1043 fd = os.popen(cmd , 'r')
1048 sys.stderr.write (s)
1055 sys.stderr.write (s)
1061 sys.exit('ExitBadLily', cmd )
1062 texFiles=getTeXFile(log)
1064 Props.addLilyOutputFiles(texFiles,'program')
1065 texInputFiles = texInputFiles + texFiles
1067 texInputFiles.append(file)
1070 for file in texInputFiles:
1072 infile.setVars() # first pass set variables
1074 if Props.get('debug'):
1083 if Props.get('separate'):
1087 if not Props.get('separate'):
1091 sys.exit('ExitBadArgs','No files specified')
1097 'ExitInterupt' : ['Ouch!', 1 ],
1098 'ExitBadArgs' : ['Wrong number of arguments', 2 ],
1099 'ExitNotFound' : ['File not found', 3 ],
1100 'ExitBadPaper' : ['Unknown papersize', 4 ],
1101 'ExitBadHeight' : ['Invalid Height specification', 5 ],
1102 'ExitBadWidth' : ['Invalid Width specification', 6 ],
1103 'ExitBadOrient' : ['Invalid Orientation specification', 7 ],
1104 'ExitNoWrite' : ['Permission denied', 8 ],
1105 'ExitNoTeXName' : ['hmm, I could not find an output file name', 9 ],
1106 'ExitBadLily' : ['Lilypond failed', 10 ],
1107 'ExitBadLatex' : ['Latex failed', 11 ],
1108 'ExitBadPostscript' : ['Postscript failed', 12 ],
1109 'ExitUnknown' : ['Unknown Exit Code', 20 ],
1115 if not Props.get('keeplilypond'):
1116 lilyfiles = Props.get('lilyOutputFiles')
1117 if not Props.get('keeply2dvi'):
1118 tmpfiles = glob.glob('*.' + str(os.getpid()) + '.*' )
1119 for file in lilyfiles + tmpfiles:
1120 if os.path.isfile(file):
1125 Props = Properties()
1130 except KeyboardInterrupt:
1131 print ExitTable['ExitInterupt'][0]
1133 sys.exit(ExitTable['ExitInterupt'][1])
1135 except SystemExit, errno:
1136 if ExitTable.has_key(errno.args[0]):
1137 msg = ExitTable[errno.args[0]]
1139 msg = ExitTable['ExitUnknown']
1140 if len(errno.args) > 1:
1141 sys.stderr.write( '%s: %s: %s\n' % (name, msg[0], errno.args[1]))
1143 sys.stderr.write( '%s %s\n' % (name, msg[0]))
1144 if Props.get('debug'):