+ return (ps_pages, pdf_pages, page_index, pages_parameter)
+
+def main(argv):
+ # Set defaults.
+ dpi = 128
+ fg_color = "000000"
+ bg_color = "ffffff"
+ bibtex = None
+ latex = None
+ lilypond = False
+ lilypond_book = None
+ output_format = "png"
+ script_name = argv[0]
+
+ # Parse and manipulate the command line arguments.
+ try:
+ (opts, args) = getopt.gnu_getopt(argv[1:], "dhv", ["bibtex=", "bg=",
+ "debug", "dpi=", "fg=", "help", "latex=", "lilypond",
+ "lilypond-book=", "png", "ppm", "verbose"])
+ except getopt.GetoptError as err:
+ error("%s\n%s" % (err, usage(script_name)))
+
+ opts.reverse()
+ for opt, val in opts:
+ if opt in ("-h", "--help"):
+ print(usage(script_name))
+ sys.exit(0)
+ elif opt == "--bibtex":
+ bibtex = [val]
+ elif opt == "--bg":
+ bg_color = val
+ elif opt in ("-d", "--debug"):
+ lyxpreview_tools.debug = True
+ elif opt == "--dpi":
+ try:
+ dpi = int(val)
+ except:
+ error("Cannot convert %s to an integer value" % val)
+ elif opt == "--fg":
+ fg_color = val
+ elif opt == "--latex":
+ latex = [val]
+ elif opt == "--lilypond":
+ lilypond = True
+ elif opt == "--lilypond-book":
+ lilypond_book = [val]
+ elif opt in ("--png", "--ppm"):
+ output_format = opt[2:]
+ elif opt in ("-v", "--verbose"):
+ lyxpreview_tools.verbose = True
+
+ # Determine input file
+ if len(args) != 1:
+ err = "A single input file is required, %s given" % (len(args) or "none")
+ error("%s\n%s" % (err, usage(script_name)))
+
+ input_path = args[0]
+ dir, latex_file = os.path.split(input_path)
+
+ # Check for the input file
+ if not os.path.exists(input_path):
+ error('File "%s" not found.' % input_path)
+ if len(dir) != 0:
+ os.chdir(dir)
+
+ if lyxpreview_tools.verbose:
+ f_out = open('verbose.txt', 'a')
+ sys.stdout = f_out
+ sys.stderr = f_out
+
+ # Echo the settings
+ progress("Running Python %s" % str(sys.version_info[:3]))
+ progress("Starting %s..." % script_name)
+ if os.name == "nt":
+ progress("Use win32_modules: %d" % lyxpreview_tools.use_win32_modules)
+ progress("Output format: %s" % output_format)
+ progress("Foreground color: %s" % fg_color)
+ progress("Background color: %s" % bg_color)
+ progress("Resolution (dpi): %s" % dpi)
+ progress("File to process: %s" % input_path)
+
+ # For python > 2 convert strings to bytes
+ if not PY2:
+ fg_color = bytes(fg_color, 'ascii')
+ bg_color = bytes(bg_color, 'ascii')
+
+ fg_color_dvipng = make_texcolor(fg_color, False)
+ bg_color_dvipng = make_texcolor(bg_color, False)
+
+ # For python > 2 convert bytes to string
+ if not PY2:
+ fg_color_dvipng = fg_color_dvipng.decode('ascii')
+ bg_color_dvipng = bg_color_dvipng.decode('ascii')
+
+ # External programs used by the script.
+ latex = find_exe_or_terminate(latex or latex_commands)
+ bibtex = find_exe(bibtex or bibtex_commands)
+ if lilypond:
+ lilypond_book = find_exe_or_terminate(lilypond_book or
+ ["lilypond-book --safe"])
+
+ # These flavors of latex are known to produce pdf output
+ pdf_output = latex in pdflatex_commands
+
+ progress("Latex command: %s" % latex)
+ progress("Latex produces pdf output: %s" % pdf_output)
+ progress("Bibtex command: %s" % bibtex)
+ progress("Lilypond-book command: %s" % lilypond_book)
+ progress("Preprocess through lilypond-book: %s" % lilypond)
+ progress("Altering the latex file for font size and colors")
+
+ # Make sure that multiple defined macros and the microtype package
+ # don't cause issues in the latex file.
+ fix_latex_file(latex_file, pdf_output)
+
+ if lilypond:
+ progress("Preprocess the latex file through %s" % lilypond_book)
+ if pdf_output:
+ lilypond_book += " --pdf"
+ lilypond_book += " --latex-program=%s" % latex.split()[0]
+
+ # Make a copy of the latex file
+ lytex_file = latex_file_re.sub(".lytex", latex_file)
+ shutil.copyfile(latex_file, lytex_file)
+
+ # Preprocess the latex file through lilypond-book.
+ lytex_status, lytex_stdout = run_tex(lilypond_book, lytex_file)
+
+ if pdf_output:
+ progress("Using the legacy conversion method (PDF support)")
+ return legacy_conversion_step1(latex_file, dpi, output_format, fg_color,
+ bg_color, latex, pdf_output)
+
+ # This can go once dvipng becomes widespread.
+ dvipng = find_exe(["dvipng"])
+ if dvipng == None:
+ progress("Using the legacy conversion method (dvipng not found)")
+ return legacy_conversion_step1(latex_file, dpi, output_format, fg_color,
+ bg_color, latex, pdf_output)
+
+ dv2dt = find_exe(["dv2dt"])
+ if dv2dt == None:
+ progress("Using the legacy conversion method (dv2dt not found)")
+ return legacy_conversion_step1(latex_file, dpi, output_format, fg_color,
+ bg_color, latex, pdf_output)
+
+ pngtopnm = ""
+ if output_format == "ppm":
+ pngtopnm = find_exe(["pngtopnm"])
+ if pngtopnm == None:
+ progress("Using the legacy conversion method (pngtopnm not found)")
+ return legacy_conversion_step1(latex_file, dpi, output_format,
+ fg_color, bg_color, latex, pdf_output)
+
+ # Compile the latex file.
+ error_pages = []
+ latex_status, latex_stdout = run_latex(latex, latex_file, bibtex)
+ latex_log = latex_file_re.sub(".log", latex_file)
+ if latex_status:
+ progress("Will try to recover from %s failure" % latex)
+ error_pages = check_latex_log(latex_log)
+
+ # The dvi output file name
+ dvi_file = latex_file_re.sub(".dvi", latex_file)
+
+ # If there's no DVI output, look for PDF and go to legacy or fail
+ if not os.path.isfile(dvi_file):
+ # No DVI, is there a PDF?
+ pdf_file = latex_file_re.sub(".pdf", latex_file)
+ if os.path.isfile(pdf_file):
+ progress("%s produced a PDF output, fallback to legacy." \
+ % (os.path.basename(latex)))
+ progress("Using the legacy conversion method (PDF support)")
+ return legacy_conversion_step1(latex_file, dpi, output_format,
+ fg_color, bg_color, latex, True)
+ else:
+ error("No DVI or PDF output. %s failed." \
+ % (os.path.basename(latex)))
+
+ # Look for PS literals or inclusion of pdflatex files in DVI pages
+ # ps_pages: list of indexes of pages containing PS literals
+ # pdf_pages: list of indexes of pages requiring running pdflatex
+ # page_count: total number of pages
+ # pages_parameter: parameter for dvipng to exclude pages with PostScript
+ (ps_pages, pdf_pages, page_count, pages_parameter) = find_ps_pages(dvi_file)
+
+ # If all pages need PostScript or pdflatex, directly use the legacy method.
+ if len(ps_pages) == page_count:
+ progress("Using the legacy conversion method (PostScript support)")
+ return legacy_conversion_step1(latex_file, dpi, output_format, fg_color,
+ bg_color, latex, pdf_output)
+ elif len(pdf_pages) == page_count:
+ progress("Using the legacy conversion method (PDF support)")
+ return legacy_conversion_step1(latex_file, dpi, output_format, fg_color,
+ bg_color, "pdflatex", True)
+
+ # Retrieve resolution
+ resolution = extract_resolution(latex_log, dpi)
+