lyxpreview: Simplify the color handling.

Let's have this in trunk for testing. The real difference maker
when it comes to color is whether we use dvipng or ghostscript.

For dvipng:

  - The color info is passed as command-line arguments.

  - The tightpage option is not necessary, and since it adds
    ps specials to the output, we shouldn't use it.

For ghostscript:

  - The color info needs to be in the latex file.

  - The foreground color is set for each preview inset.

  - The background color is set by \pagecolor in the preamble,
    which is understood by pdflatex, but ignored in dvips mode.
    Thus dvips is handled with a ps special.

  - The tightpage option is necessary to crop the images.

git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@39797 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
Julien Rioux 2011-10-03 16:43:33 +00:00
parent 873f0f4297
commit 35b580fb30
3 changed files with 33 additions and 92 deletions

View File

@ -194,42 +194,45 @@ def extract_resolution(log_file, dpi):
return dpi * (10.0 / fontsize) * (1000.0 / magnification)
def legacy_latex_file(latex_file, fg_color, bg_color, bg_color_gr):
use_preview_dvi_re = re.compile("(\s*\\\\usepackage\[[^]]+)(dvips\]{preview})")
use_preview_pdf_re = re.compile("(\s*\\\\usepackage\[[^]]+)(pdftex\]{preview})")
def legacy_latex_file(latex_file, fg_color, bg_color):
use_preview_re = re.compile(r"\s*\\usepackage\[([^]]+)\]{preview}")
fg_color_gr = make_texcolor(fg_color, True)
bg_color_gr = make_texcolor(bg_color, True)
tmp = mkstemp()
success = 0
try:
for line in open(latex_file, 'r').readlines():
match = use_preview_dvi_re.match(line)
if match == None:
match = use_preview_pdf_re.match(line)
if match == None:
tmp.write(line)
continue
success = 1
tmp.write(" \\usepackage{color}\n" \
" \\pagecolor[rgb]{%s}\n" \
"%s\n" \
% (bg_color_gr, match.group()))
continue
success = 1
tmp.write("%stightpage,%s\n" \
" \\AtBeginDocument{\\AtBeginDvi{%%\n" \
" \\special{!userdict begin/bop-hook{//bop-hook exec\n" \
" <%s%s>{255 div}forall setrgbcolor\n" \
" clippath fill setrgbcolor}bind def end}}}\n" \
% (match.group(1), match.group(2), fg_color, bg_color))
f = open(latex_file, 'r')
except:
# Unable to open the file, but do nothing here because
# the calling function will act on the value of 'success'.
warning('Warning in legacy_latex_file! Unable to open "%s"' % latex_file)
warning(`sys.exc_type` + ',' + `sys.exc_value`)
for line in f.readlines():
if success:
tmp.write(line)
continue
match = use_preview_re.match(line)
if match == None:
tmp.write(line)
continue
success = 1
# Package order: color should be loaded before preview
# Preview options: add the options lyx and tightpage
tmp.write(r"""
\usepackage{color}
\definecolor{fg}{rgb}{%s}
\definecolor{bg}{rgb}{%s}
\pagecolor{bg}
\usepackage[%s,lyx,tightpage]{preview}
\makeatletter
\g@addto@macro\preview{\begingroup\color{bg}\special{ps::clippath fill}\color{fg}}
\g@addto@macro\endpreview{\endgroup}
\makeatother
""" % (fg_color_gr, bg_color_gr, match.group(1)))
if success:
copyfileobj(tmp, open(latex_file,"wb"), 1)
@ -284,10 +287,10 @@ def legacy_conversion(argv, skipMetrics = False):
def legacy_conversion_step1(latex_file, dpi, output_format, fg_color, bg_color,
latex, pdf_output = False, skipMetrics = False):
# Move color information into the latex file.
bg_color_gr = make_texcolor(bg_color, True)
if not legacy_latex_file(latex_file, fg_color, bg_color, bg_color_gr):
error("Unable to move color info into the latex file")
# Move color information, lyx and tightpage options into the latex file.
if not legacy_latex_file(latex_file, fg_color, bg_color):
error("""Unable to move the color information, and the lyx and tightpage
options of preview-latex, into the latex file""")
# Compile the latex file.
latex_status, latex_stdout = run_latex(latex, latex_file)

View File

@ -155,42 +155,6 @@ def extract_metrics_info(dvipng_stdout):
return results
def color_pdf(latex_file, bg_color, fg_color):
use_preview_pdf_re = re.compile("(\s*\\\\usepackage\[[^]]+)((pdftex|xetex)\]{preview})")
tmp = mkstemp()
fg = ""
if fg_color != "0.000000,0.000000,0.000000":
fg = ' \\AtBeginDocument{\\let\\oldpreview\\preview\\renewcommand\\preview{\\oldpreview\\color[rgb]{%s}}}\n' % (fg_color)
success = 0
try:
for line in open(latex_file, 'r').readlines():
match = use_preview_pdf_re.match(line)
if match == None:
tmp.write(line)
continue
success = 1
tmp.write(" \\usepackage{color}\n" \
" \\pagecolor[rgb]{%s}\n" \
"%s" \
"%s\n" \
% (bg_color, fg, match.group()))
continue
except:
# Unable to open the file, but do nothing here because
# the calling function will act on the value of 'success'.
warning('Warning in color_pdf! Unable to open "%s"' % latex_file)
warning(`sys.exc_type` + ',' + `sys.exc_value`)
if success:
copyfileobj(tmp, open(latex_file,"wb"), 1)
return success
def fix_latex_file(latex_file):
documentclass_re = re.compile("(\\\\documentclass\[)(1[012]pt,?)(.+)")
@ -385,9 +349,6 @@ def main(argv):
fg_color_dvipng = make_texcolor(fg_color, False)
bg_color_dvipng = make_texcolor(bg_color, False)
fg_color_gr = make_texcolor(fg_color, True)
bg_color_gr = make_texcolor(bg_color, True)
# External programs used by the script.
latex = find_exe_or_terminate(latex or latex_commands)
bibtex = find_exe(bibtex or bibtex_commands)
@ -448,10 +409,6 @@ def main(argv):
return legacy_conversion_step1(latex_file, dpi, output_format,
fg_color, bg_color, latex, pdf_output)
# Move color information for PDF into the latex file.
if not color_pdf(latex_file, bg_color_gr, fg_color_gr):
warning("Unable to move color info into the latex file")
# Compile the latex file.
latex_status, latex_stdout = run_latex(latex, latex_file, bibtex)

View File

@ -741,26 +741,7 @@ void PreviewLoader::Impl::dumpPreamble(otexstream & os) const
// Also support PDF output (automatically generated e.g. when
// \usepackage[pdftex]{hyperref} is used and XeTeX.
os << "\n"
<< "\\newif\\ifxetex\n"
<< "\\expandafter\\ifx\\csname XeTeXrevision\\endcsname\\relax\n"
<< " \\xetexfalse\n"
<< "\\else\n"
<< " \\xetextrue\n"
<< "\\fi\n"
<< "\\newif\\ifpdf\n"
<< "\\ifx\\pdfoutput\\undefined\n"
<< "\\else\\ifx\\pdfoutput\\relax\n"
<< "\\else\\ifnum0=\\pdfoutput\n"
<< "\\else\\pdftrue\\fi\\fi\\fi\n"
<< "\\ifxetex\n"
<< " \\usepackage[active,delayed,tightpage,showlabels,lyx,xetex]{preview}\n"
<< "\\else\n"
<< "\\ifpdf\n"
<< " \\usepackage[active,delayed,tightpage,showlabels,lyx,pdftex]{preview}\n"
<< "\\else\n"
<< " \\usepackage[active,delayed,showlabels,lyx,dvips]{preview}\n"
<< "\\fi\n"
<< "\\fi\n"
<< "\\usepackage[active,delayed,showlabels,lyx]{preview}\n"
<< "\n";
}