X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=python%2Fbook_latex.py;h=ec5412b1d8192bee41e292e31bc62a78798cc45d;hb=b872748c6aa8bb721ced458691b38ac2fac5dfc8;hp=c94240cd54e2b3dc783a7b65b8e93d7ae5718e61;hpb=f875ef39c544bd3499dae5360e9e24f69933575f;p=lilypond.git diff --git a/python/book_latex.py b/python/book_latex.py index c94240cd54..ec5412b1d8 100644 --- a/python/book_latex.py +++ b/python/book_latex.py @@ -3,6 +3,7 @@ import re import tempfile import os +import sys import subprocess import book_base as BookBase from book_snippets import * @@ -12,6 +13,7 @@ global _;_=ly._ progress = ly.progress warning = ly.warning error = ly.error +debug = ly.debug_output # Recognize special sequences in the input. # @@ -124,14 +126,15 @@ Latex_output = { \expandafter\preLilyPondExample \fi \def\lilypondbook{}%% -\input %(base)s-systems.tex +\input{%(base)s-systems.tex} \ifx\postLilyPondExample \undefined \else \expandafter\postLilyPondExample \fi }''', - PRINTFILENAME: '''\\texttt{%(filename)s} + PRINTFILENAME: r'''\texttt{%(filename)s} +\linebreak ''', QUOTE: r'''\begin{quote} @@ -163,35 +166,73 @@ LATEX_INSPECTION_DOCUMENT = r''' # Do we need anything else besides `textwidth'? def get_latex_textwidth (source, global_options): + # default value + textwidth = 550.0 + m = re.search (r'''(?P\\begin\s*{document})''', source) if m == None: warning (_ ("cannot find \\begin{document} in LaTeX document")) - - ## what's a sensible default? - return 550.0 + return textwidth preamble = source[:m.start (0)] latex_document = LATEX_INSPECTION_DOCUMENT % {'preamble': preamble} (handle, tmpfile) = tempfile.mkstemp('.tex') - logfile = os.path.splitext (tmpfile)[0] + '.log' - logfile = os.path.split (logfile)[1] + tmpfileroot = os.path.splitext (tmpfile)[0] + tmpfileroot = os.path.split (tmpfileroot)[1] + auxfile = tmpfileroot + '.aux' + logfile = tmpfileroot + '.log' tmp_handle = os.fdopen (handle,'w') tmp_handle.write (latex_document) tmp_handle.close () progress (_ ("Running `%s' on file `%s' to detect default page settings.\n") - % (global_options.latex_program, tmpfile)); - cmd = '%s %s' % (global_options.latex_program, tmpfile); - proc = subprocess.Popen (cmd, - universal_newlines=True, shell=True, - stdout=subprocess.PIPE, stderr=subprocess.PIPE); - if proc.returncode != 0: - warning (_ ("Unable to auto-detect default page settings:\n%s") - % proc.communicate ()[1]); + % (global_options.latex_program, tmpfile)) + cmd = '%s %s' % (global_options.latex_program, tmpfile) + debug ("Executing: %s\n" % cmd) + run_env = os.environ.copy() + run_env['LC_ALL'] = 'C' + run_env['TEXINPUTS'] = '%s:%s' % \ + (global_options.input_dir, run_env.get('TEXINPUTS',"")) + + ### unknown why this is necessary + universal_newlines = True + if sys.platform == 'mingw32': + universal_newlines = False + ### use os.system to avoid weird sleep() problems on + ### GUB's python 2.4.2 on mingw + # make file to write to + output_dir = tempfile.mkdtemp() + output_filename = os.path.join(output_dir, 'output.txt') + # call command + cmd += " > %s" % output_filename + oldtexinputs = os.environ.get ('TEXINPUTS') + os.environ['TEXINPUTS'] = run_env['TEXINPUTS'] + returncode = os.system(cmd) + if oldtexinputs: + os.environ['TEXINPUTS'] = oldtexinputs + else: + del os.environ['TEXINPUTS'] + parameter_string = open(output_filename).read() + if returncode != 0: + warning (_ ("Unable to auto-detect default settings:\n")) + # clean up + os.remove(output_filename) + os.rmdir(output_dir) + else: + proc = subprocess.Popen (cmd, + env=run_env, + universal_newlines=universal_newlines, + shell=True, + stdout=subprocess.PIPE, stderr=subprocess.PIPE) + (parameter_string, error_string) = proc.communicate () + if proc.returncode != 0: + warning (_ ("Unable to auto-detect default settings:\n%s") + % error_string) os.unlink (tmpfile) - parameter_string = "" + if os.path.exists (auxfile): + os.unlink (auxfile) if os.path.exists (logfile): parameter_string = file (logfile).read() os.unlink (logfile) @@ -206,12 +247,22 @@ def get_latex_textwidth (source, global_options): if m: columnsep = float (m.group (1)) - textwidth = 0 m = re.search ('textwidth=([0-9.]+)pt', parameter_string) if m: textwidth = float (m.group (1)) - if columns: - textwidth = (textwidth - columnsep) / columns + else: + warning (_ ("cannot detect textwidth from LaTeX")) + return textwidth + + debug ('Detected values:') + debug (' columns = %s' % columns) + debug (' columnsep = %s' % columnsep) + debug (' textwidth = %s' % textwidth) + + if m and columns: + textwidth = (textwidth - columnsep) / columns + debug ('Adjusted value:') + debug (' textwidth = %s' % textwidth) return textwidth @@ -252,9 +303,10 @@ class BookLatexOutputFormat (BookBase.BookOutputFormat): def input_fullname (self, input_filename): # Use kpsewhich if available, otherwise fall back to the default: if ly.search_exe_path ('kpsewhich'): - return os.popen ('kpsewhich ' + input_filename).read()[:-1] - else: - return BookBase.BookOutputFormat.input_fullname (self, input_filename) + trial = os.popen ('kpsewhich ' + input_filename).read()[:-1] + if trial: + return trial + return BookBase.BookOutputFormat.input_fullname (self, input_filename) def process_chunks (self, chunks): for c in chunks: @@ -267,8 +319,11 @@ class BookLatexOutputFormat (BookBase.BookOutputFormat): def snippet_output (self, basename, snippet): str = '' rep = snippet.get_replacements (); - rep['base'] = basename - str += self.output_print_filename (basename, snippet) + rep['base'] = basename.replace ('\\', '/') + rep['filename'] = os.path.basename (snippet.filename).replace ('\\', '/') + rep['ext'] = snippet.ext + if PRINTFILENAME in snippet.option_dict: + str += self.output[PRINTFILENAME] % rep if VERBATIM in snippet.option_dict: rep['verb'] = snippet.verb_ly () str += self.output[VERBATIM] % rep