From 7013445bdd60bb5e673e8c94396d0c6f727e1ada Mon Sep 17 00:00:00 2001 From: Enrico Forestieri Date: Thu, 4 Jun 2015 17:58:55 +0200 Subject: [PATCH] Backport the latest changes to the instant preview scripts. Also fix a glitch recently reported on the devel list. No status line as this is a further amendement to b3d2ffc0. --- lib/scripts/legacy_lyxpreview2ppm.py | 25 +++++++++++--- lib/scripts/lyxpreview2bitmap.py | 49 +++++++++++++++++++++++----- lib/scripts/lyxpreview_tools.py | 2 +- 3 files changed, 61 insertions(+), 15 deletions(-) diff --git a/lib/scripts/legacy_lyxpreview2ppm.py b/lib/scripts/legacy_lyxpreview2ppm.py index 38dc825fdd..ee49e6afa3 100644 --- a/lib/scripts/legacy_lyxpreview2ppm.py +++ b/lib/scripts/legacy_lyxpreview2ppm.py @@ -233,8 +233,11 @@ def legacy_latex_file(latex_file, fg_color, bg_color): \definecolor{bg}{rgb}{%s} \pagecolor{bg} \usepackage[%s,tightpage]{preview} -\IfFileExists{lmodern.sty}{\usepackage{lmodern}}{\usepackage{ae,aecomp}} \makeatletter +\def\t@a{cmr} +\if\f@family\t@a +\IfFileExists{lmodern.sty}{\usepackage{lmodern}}{\usepackage{ae,aecompl}} +\fi \g@addto@macro\preview{\begingroup\color{bg}\special{ps::clippath fill}\color{fg}} \g@addto@macro\endpreview{\endgroup} \makeatother @@ -302,7 +305,7 @@ def legacy_conversion_step1(latex_file, dpi, output_format, fg_color, bg_color, # Compile the latex file. latex_status, latex_stdout = run_latex(latex, latex_file) if latex_status: - warning("trying to recover from failed compilation") + progress("Will try to recover from %s failure" % latex) if pdf_output: return legacy_conversion_step3(latex_file, dpi, output_format, True, skipMetrics) @@ -315,10 +318,13 @@ def legacy_conversion_step1(latex_file, dpi, output_format, fg_color, bg_color, def legacy_conversion_pdflatex(latex_file, failed_pages, legacy_metrics, use_pdftocairo, conv, gs_device, gs_ext, alpha, resolution, output_format): + error_count = 0 + # Search for pdflatex executable pdflatex = find_exe(["pdflatex"]) if pdflatex == None: warning("Can't find pdflatex. Some pages failed with all the possible routes.") + failed_pages = [] else: # Create a new LaTeX file from the original but only with failed pages pdf_latex_file = latex_file_re.sub("_pdflatex.tex", latex_file) @@ -357,6 +363,7 @@ def legacy_conversion_pdflatex(latex_file, failed_pages, legacy_metrics, if conv_status: # Give up! warning("Some pages failed with all the possible routes") + failed_pages = [] else: # We've done it! pdf_log_file = latex_file_re.sub(".log", pdf_latex_file) @@ -367,6 +374,7 @@ def legacy_conversion_pdflatex(latex_file, failed_pages, legacy_metrics, for index in error_pages: pdf_metrics.pop(index - 1) pdf_metrics.insert(index - 1, (index, -1.0)) + error_count += 1 original_bitmap = latex_file_re.sub("%d." + output_format, pdf_latex_file) destination_bitmap = latex_file_re.sub("%d." + output_format, latex_file) @@ -375,6 +383,8 @@ def legacy_conversion_pdflatex(latex_file, failed_pages, legacy_metrics, join_metrics_and_rename(legacy_metrics, pdf_metrics, failed_pages, original_bitmap, destination_bitmap) + return error_count + # The file has been processed through latex and we expect dvi output. # Run dvips, taking note whether it was successful. @@ -513,9 +523,11 @@ def legacy_conversion_step3(latex_file, dpi, output_format, dvips_failed, skipMe # Pass failed pages to pdflatex if len(failed_pages) > 0: warning("Now trying to obtain failed previews through pdflatex") - legacy_conversion_pdflatex(latex_file, failed_pages, legacy_metrics, - use_pdftocairo, conv, gs_device, gs_ext, alpha, resolution, - output_format) + error_count = legacy_conversion_pdflatex(latex_file, failed_pages, + legacy_metrics, use_pdftocairo, conv, gs_device, gs_ext, alpha, + resolution, output_format) + else: + error_count = 0 # Invalidate metrics for pages that produced errors if len(error_pages) > 0: @@ -523,6 +535,7 @@ def legacy_conversion_step3(latex_file, dpi, output_format, dvips_failed, skipMe if index not in failed_pages: legacy_metrics.pop(index - 1) legacy_metrics.insert(index - 1, (index, -1.0)) + error_count += 1 # Crop the ppm images if pnmcrop != None and output_format == "ppm": @@ -534,6 +547,8 @@ def legacy_conversion_step3(latex_file, dpi, output_format, dvips_failed, skipMe # Extract metrics info from the log file. metrics_file = latex_file_re.sub(".metrics", latex_file) write_metrics_info(legacy_metrics, metrics_file) + if error_count: + warning("Failed to produce %d preview snippet(s)" % error_count) return (0, legacy_metrics) diff --git a/lib/scripts/lyxpreview2bitmap.py b/lib/scripts/lyxpreview2bitmap.py index cef9c7447b..a7d76236fb 100755 --- a/lib/scripts/lyxpreview2bitmap.py +++ b/lib/scripts/lyxpreview2bitmap.py @@ -158,12 +158,17 @@ def extract_metrics_info(dvipng_stdout): return results -def fix_latex_file(latex_file): +def fix_latex_file(latex_file, pdf_output): documentclass_re = re.compile("(\\\\documentclass\[)(1[012]pt,?)(.+)") - newcommandx_re = re.compile("(\\\\newcommandx)(\\\\[a-zA-Z])(.+)") + def_re = re.compile(r"(\\newcommandx|\\global\\long\\def)(\\[a-zA-Z])(.+)") + usepackage_re = re.compile("\\\\usepackage") + userpreamble_re = re.compile("User specified LaTeX commands") + enduserpreamble_re = re.compile("\\\\makeatother") tmp = mkstemp() + in_user_preamble = 0 + usepkg = 0 changed = 0 macros = [] for line in open(latex_file, 'r').readlines(): @@ -173,7 +178,25 @@ def fix_latex_file(latex_file): tmp.write("%s%s\n" % (match.group(1), match.group(3))) continue - match = newcommandx_re.match(line) + if not pdf_output and not usepkg: + if userpreamble_re.search(line) != None: + in_user_preamble = 1 + elif enduserpreamble_re.search(line) != None: + in_user_preamble = 0 + if usepackage_re.match(line) != None and in_user_preamble: + usepkg = 1 + changed = 1 + tmp.write("\\def\\t@a{microtype}\n") + tmp.write("\\let\\oldusepkg\\usepackage\n") + tmp.write("\\def\\usepackage{\\@ifnextchar[\\@usepkg{\\@usepkg[]}}\n") + tmp.write("\\def\\@usepkg[#1]#2{\\@ifnextchar[") + tmp.write("{\\@@usepkg[#1]{#2}}{\\@@usepkg[#1]{#2}[]}}\n") + tmp.write("\\def\@@usepkg[#1]#2[#3]{\\def\\t@b{#2}") + tmp.write("\\ifx\\t@a\\t@b\\else\\oldusepkg[#1]{#2}[#3]\\fi}\n") + tmp.write(line) + continue + + match = def_re.match(line) if match == None: tmp.write(line) continue @@ -184,8 +207,12 @@ def fix_latex_file(latex_file): tmp.write(line) continue - changed = 1 - tmp.write("\\renewcommandx%s%s\n" % (match.group(2), match.group(3))) + definecmd = match.group(1) + if definecmd == "\\global\\long\\def": + tmp.write(line) + else: + changed = 1 + tmp.write("\\renewcommandx%s%s\n" % (match.group(2), match.group(3))) if changed: copyfileobj(tmp, open(latex_file,"wb"), 1) @@ -405,9 +432,9 @@ def main(argv): progress("Preprocess through lilypond-book: %s" % lilypond) progress("Altering the latex file for font size and colors") - # Omit font size specification in latex file and make sure multiple - # defined macros are not an issue. - fix_latex_file(latex_file) + # Omit font size specification in latex file and make sure that multiple + # defined macros and the microtype package don't cause issues. + fix_latex_file(latex_file, pdf_output) if lilypond: progress("Preprocess the latex file through %s" % lilypond_book) @@ -452,7 +479,7 @@ def main(argv): error_pages = [] latex_status, latex_stdout = run_latex(latex, latex_file, bibtex) if latex_status: - warning("trying to recover from failed compilation") + progress("Will try to recover from %s failure" % latex) error_pages = check_latex_log(latex_file_re.sub(".log", latex_file)) # The dvi output file name @@ -549,10 +576,14 @@ def main(argv): # Invalidate metrics for pages that produced errors if len(error_pages) > 0: + error_count = 0 for index in error_pages: if index not in ps_pages and index not in pdf_pages: dvipng_metrics.pop(index - 1) dvipng_metrics.insert(index - 1, (index, -1.0)) + error_count += 1 + if error_count: + warning("Failed to produce %d preview snippet(s)" % error_count) # Convert images to ppm format if necessary. if output_format == "ppm": diff --git a/lib/scripts/lyxpreview_tools.py b/lib/scripts/lyxpreview_tools.py index b5a64cf665..40ac7113d5 100644 --- a/lib/scripts/lyxpreview_tools.py +++ b/lib/scripts/lyxpreview_tools.py @@ -348,7 +348,7 @@ def run_tex(tex, tex_file): tex_status, tex_stdout = run_command(tex_call) if tex_status: - warning("%s had problems compiling %s" \ + progress("Warning: %s had problems compiling %s" \ % (os.path.basename(tex), tex_file)) return tex_status, tex_stdout