Tweaks and minor refactoring
svn: r14096
This commit is contained in:
parent
bf0d4a5123
commit
517a5e3c90
@ -34,6 +34,7 @@
|
||||
#
|
||||
#------------------------------------------------------------------------
|
||||
from gen.ggettext import gettext as _
|
||||
from bisect import bisect
|
||||
|
||||
#------------------------------------------------------------------------
|
||||
#
|
||||
@ -47,6 +48,76 @@ import ImgManip
|
||||
import Errors
|
||||
import Utils
|
||||
|
||||
#------------------------------------------------------------------------
|
||||
#
|
||||
# Latex Article Template
|
||||
#
|
||||
#------------------------------------------------------------------------
|
||||
|
||||
_LATEX_TEMPLATE_1 = '\\documentclass[%s]{article}\n'
|
||||
_LATEX_TEMPLATE = '''\\usepackage[T1]{fontenc}
|
||||
%
|
||||
% We use latin1 encoding at a minimum by default.
|
||||
% GRAMPS uses unicode UTF-8 encoding for its
|
||||
% international support. LaTeX can deal gracefully
|
||||
% with unicode encoding by using the ucs style invoked
|
||||
% when utf8 is specified as an option to the inputenc
|
||||
% package. This package is included by default in some
|
||||
% installations, but not in others, so we do not make it
|
||||
% the default. Uncomment the second line if you wish to use it
|
||||
% (If you do not have ucs.sty, you may obtain it from
|
||||
% http://www.tug.org/tex-archive/macros/latex/contrib/supported/unicode/)
|
||||
%
|
||||
%\\usepackage[latin1]{inputenc}
|
||||
\\usepackage[latin1,utf8]{inputenc}
|
||||
\\usepackage{graphicx} % Extended graphics support
|
||||
\\usepackage{longtable} % For multi-page tables
|
||||
\\usepackage{calc} % For margin indents
|
||||
%
|
||||
% Depending on your LaTeX installation, the margins may be too
|
||||
% narrow. This can be corrected by uncommenting the following
|
||||
% two lines and adjusting the width appropriately. The example
|
||||
% removes 0.5in from each margin. (Adds 1 inch to the text)
|
||||
\\addtolength{\\oddsidemargin}{-0.5in}
|
||||
\\addtolength{\\textwidth}{1.0in}
|
||||
%
|
||||
% Create a margin-adjusting command that allows LaTeX
|
||||
% to behave like the other gramps-supported output formats
|
||||
\\newlength{\\leftedge}
|
||||
\\setlength{\\leftedge}{\\parindent}
|
||||
\\newlength{\\grampstext}
|
||||
\\setlength{\\grampstext}{\\textwidth}
|
||||
\\newcommand{\\grampsindent}[1]{%
|
||||
\\setlength{\\parindent}{\\leftedge + #1}%
|
||||
\\setlength{\\textwidth}{\\grampstext - #1}%
|
||||
}
|
||||
|
||||
\\begin{document}
|
||||
|
||||
'''
|
||||
|
||||
|
||||
#------------------------------------------------------------------------
|
||||
#
|
||||
# Font size table and function
|
||||
#
|
||||
#------------------------------------------------------------------------
|
||||
|
||||
# These tables coorelate font sizes to Latex. The first table contains
|
||||
# typical font sizes in points. The second table contains the standard
|
||||
# Latex font size names. Since we use bisect to map the first table to the
|
||||
# second, we are guaranteed that any font less than 6 points is 'tiny', fonts
|
||||
# from 6-7 points are 'script', etc. and fonts greater than or equal to 22
|
||||
# are considered 'Huge'. Note that fonts from 12-13 points are not given a
|
||||
# Latex font size name but are considered "normal."
|
||||
|
||||
_FONT_SIZES = [6, 8, 10, 12, 14, 16, 18, 20, 22]
|
||||
_FONT_NAMES = ['tiny', 'scriptsize', 'footnotesize', 'small', '',
|
||||
'large', 'Large', 'LARGE', 'huge', 'Huge']
|
||||
|
||||
def map_font_size(fontsize):
|
||||
""" Map font size in points to Latex font size """
|
||||
return _FONT_NAMES[bisect(_FONT_SIZES, fontsize)]
|
||||
#------------------------------------------------------------------------
|
||||
#
|
||||
# Functions for docbackend
|
||||
@ -138,24 +209,12 @@ class LateXBackend(DocBackend):
|
||||
return None
|
||||
elif type == DocBackend.FONTSIZE:
|
||||
#translate size in point to something LaTeX can work with
|
||||
if value >= 22:
|
||||
return ("{\\Huge ", "}")
|
||||
elif value >= 20:
|
||||
return ("{\\huge ", "}")
|
||||
elif value >= 18:
|
||||
return ("{\\LARGE ", "}")
|
||||
elif value >= 16:
|
||||
return ("{\\Large ", "}")
|
||||
elif value >= 14:
|
||||
return ("{\\large ", "}")
|
||||
elif value < 8:
|
||||
return ("{\\scriptsize ", "}")
|
||||
elif value < 10:
|
||||
return ("{\\footnotesize ", "}")
|
||||
elif value < 12:
|
||||
return ("{\\small ", "}")
|
||||
fontsize = map_font_size(value)
|
||||
if fontsize:
|
||||
return ("{\\" + fontsize + ' ', "}")
|
||||
else:
|
||||
return ("", "")
|
||||
|
||||
elif type == DocBackend.FONTFACE:
|
||||
if 'MONO' in value.upper():
|
||||
return ("{\\ttfamily ", "}")
|
||||
@ -191,7 +250,7 @@ def roman2arabic(strval):
|
||||
return 0
|
||||
|
||||
# Return None if there are chars outside of valid roman numerals
|
||||
if [char for char in strval if char not in 'MDCLXVI']:
|
||||
if not all(char in 'MDCLXVI' for char in strval):
|
||||
return 0
|
||||
|
||||
vals2 = ['CM', 'CD', 'XC', 'XL', 'IX', 'IV']
|
||||
@ -277,59 +336,14 @@ class LaTeXDoc(BaseDoc, TextDoc):
|
||||
# Paper selections are somewhat limited on a stock installation.
|
||||
# If the user picks something not listed here, we'll just accept
|
||||
# the default of the user's LaTeX installation (usually letter).
|
||||
paper_name = self.paper.get_size().get_name()
|
||||
if paper_name == "A4":
|
||||
options = options + ",a4paper"
|
||||
elif paper_name == "A5":
|
||||
options = options + ",a5paper"
|
||||
elif paper_name == "B5":
|
||||
options = options + ",b4paper"
|
||||
elif paper_name == "Legal":
|
||||
options = options + ",legalpaper"
|
||||
elif paper_name == "Letter":
|
||||
options = options + ",letterpaper"
|
||||
paper_name = self.paper.get_size().get_name().lower()
|
||||
if paper_name in ["a4", "a5", "legal", "letter"]:
|
||||
options += ',' + paper_name + 'paper'
|
||||
|
||||
# Use the article template, T1 font encodings, and specify
|
||||
# that we should use Latin1 and unicode character encodings.
|
||||
self._backend.write('\\documentclass[%s]{article}\n' % options)
|
||||
self._backend.write('\\usepackage[T1]{fontenc}\n')
|
||||
self._backend.write('%\n% We use latin1 encoding at a minimum by default.\n')
|
||||
self._backend.write('% GRAMPS uses unicode UTF-8 encoding for its\n')
|
||||
self._backend.write('% international support. LaTeX can deal gracefully\n')
|
||||
self._backend.write('% with unicode encoding by using the ucs style invoked\n')
|
||||
self._backend.write('% when utf8 is specified as an option to the inputenc\n')
|
||||
self._backend.write('% package. This package is included by default in some\n')
|
||||
self._backend.write('% installations, but not in others, so we do not make it\n')
|
||||
self._backend.write('% the default. Uncomment the second line if you wish to use it\n')
|
||||
self._backend.write('% (If you do not have ucs.sty, you may obtain it from\n')
|
||||
self._backend.write('% http://www.tug.org/tex-archive/macros/latex/contrib/supported/unicode/)\n')
|
||||
self._backend.write('%\n')
|
||||
self._backend.write('%\\usepackage[latin1]{inputenc}\n')
|
||||
self._backend.write('\\usepackage[latin1,utf8]{inputenc}\n')
|
||||
# add packages (should be standard on a default installation)
|
||||
# for finer output control. Put comments in file for user to read
|
||||
self._backend.write('\\usepackage{graphicx} % Extended graphics support\n')
|
||||
self._backend.write('\\usepackage{longtable} % For multi-page tables\n')
|
||||
self._backend.write('\\usepackage{calc} % For margin indents\n')
|
||||
self._backend.write('%\n% Depending on your LaTeX installation, the')
|
||||
self._backend.write(' margins may be too\n% narrow. ')
|
||||
self._backend.write(' This can be corrected by uncommenting the following\n')
|
||||
self._backend.write('% two lines and adjusting the width appropriately.')
|
||||
self._backend.write(' The example\n% removes 0.5in from each margin.')
|
||||
self._backend.write(' (Adds 1 inch to the text)\n')
|
||||
self._backend.write('\\addtolength{\\oddsidemargin}{-0.5in}\n')
|
||||
self._backend.write('\\addtolength{\\textwidth}{1.0in}\n%\n')
|
||||
self._backend.write('% Create a margin-adjusting command that allows LaTeX\n')
|
||||
self._backend.write('% to behave like the other gramps-supported output formats\n')
|
||||
self._backend.write('\\newlength{\\leftedge}\n')
|
||||
self._backend.write('\\setlength{\\leftedge}{\\parindent}\n')
|
||||
self._backend.write('\\newlength{\\grampstext}\n')
|
||||
self._backend.write('\\setlength{\\grampstext}{\\textwidth}\n')
|
||||
self._backend.write('\\newcommand{\\grampsindent}[1]{%\n')
|
||||
self._backend.write(' \\setlength{\\parindent}{\\leftedge + #1}%\n')
|
||||
self._backend.write(' \\setlength{\\textwidth}{\\grampstext - #1}%\n')
|
||||
self._backend.write('}\n\n')
|
||||
self._backend.write('\\begin{document}\n\n')
|
||||
self._backend.write(_LATEX_TEMPLATE_1 % options)
|
||||
self._backend.write(_LATEX_TEMPLATE)
|
||||
|
||||
self.in_list = 0
|
||||
self.in_table = 0
|
||||
@ -353,54 +367,30 @@ class LaTeXDoc(BaseDoc, TextDoc):
|
||||
# Is there special alignment? (default is left)
|
||||
align = style.get_alignment_text()
|
||||
if align == "center":
|
||||
thisstyle.font_beg = thisstyle.font_beg + "\\centerline{"
|
||||
thisstyle.font_beg += "\\centerline{"
|
||||
thisstyle.font_end = "}" + thisstyle.font_end
|
||||
elif align == "right":
|
||||
thisstyle.font_beg = thisstyle.font_beg + "\\hfill"
|
||||
thisstyle.font_beg += "\\hfill"
|
||||
|
||||
# Establish font face and shape
|
||||
if font.get_type_face() == FONT_SANS_SERIF:
|
||||
thisstyle.font_beg = thisstyle.font_beg + "\\sffamily"
|
||||
thisstyle.font_beg += "\\sffamily"
|
||||
thisstyle.font_end = "\\rmfamily" + thisstyle.font_end
|
||||
if font.get_bold():
|
||||
thisstyle.font_beg = thisstyle.font_beg + "\\bfseries"
|
||||
thisstyle.font_beg += "\\bfseries"
|
||||
thisstyle.font_end = "\\mdseries" + thisstyle.font_end
|
||||
if font.get_italic() or font.get_underline():
|
||||
thisstyle.font_beg = thisstyle.font_beg + "\\itshape"
|
||||
thisstyle.font_beg += "\\itshape"
|
||||
thisstyle.font_end = "\\upshape" + thisstyle.font_end
|
||||
|
||||
# Now determine font size
|
||||
sflag = 0
|
||||
if size >= 22:
|
||||
thisstyle.font_beg = thisstyle.font_beg + "\\Huge"
|
||||
sflag = 1
|
||||
elif size >= 20:
|
||||
thisstyle.font_beg = thisstyle.font_beg + "\\huge"
|
||||
sflag = 1
|
||||
elif size >= 18:
|
||||
thisstyle.font_beg = thisstyle.font_beg + "\\LARGE"
|
||||
sflag = 1
|
||||
elif size >= 16:
|
||||
thisstyle.font_beg = thisstyle.font_beg + "\\Large"
|
||||
sflag = 1
|
||||
elif size >= 14:
|
||||
thisstyle.font_beg = thisstyle.font_beg + "\\large"
|
||||
sflag = 1
|
||||
elif size < 8:
|
||||
thisstyle.font_beg = thisstyle.font_beg + "\\scriptsize"
|
||||
sflag = 1
|
||||
elif size < 10:
|
||||
thisstyle.font_beg = thisstyle.font_beg + "\\footnotesize"
|
||||
sflag = 1
|
||||
elif size < 12:
|
||||
thisstyle.font_beg = thisstyle.font_beg + "\\small"
|
||||
sflag = 1
|
||||
fontsize = map_font_size(size)
|
||||
if fontsize:
|
||||
thisstyle.font_beg += "\\" + fontsize
|
||||
thisstyle.font_end += "\\normalsize"
|
||||
|
||||
if sflag == 1:
|
||||
thisstyle.font_end = thisstyle.font_end + "\\normalsize"
|
||||
|
||||
thisstyle.font_beg = thisstyle.font_beg + " "
|
||||
thisstyle.font_end = thisstyle.font_end + " "
|
||||
thisstyle.font_beg += " "
|
||||
thisstyle.font_end += " "
|
||||
|
||||
left = style.get_left_margin()
|
||||
first = style.get_first_indent() + left
|
||||
@ -459,10 +449,8 @@ class LaTeXDoc(BaseDoc, TextDoc):
|
||||
self._backend.write(' \\renewcommand\\theenumi{\\arabic{enumi}}')
|
||||
else:
|
||||
# roman, set the case correctly
|
||||
if leader_1.islower():
|
||||
self._backend.write(' \\renewcommand\\theenumi{\\roman{enumi}}')
|
||||
else:
|
||||
self._backend.write(' \\renewcommand\\theenumi{\\Roman{enumi}}')
|
||||
elf._backend.write(' \\renewcommand\\theenumi{\\%soman{enumi}}'
|
||||
% ('r' if leader_1.islower() else 'R'))
|
||||
|
||||
self._backend.write(' \\setcounter{enumi}{%d} ' % num)
|
||||
self._backend.write(' \\addtocounter{enumi}{-1}\n')
|
||||
@ -612,8 +600,7 @@ class LaTeXDoc(BaseDoc, TextDoc):
|
||||
text = '\\newline\n'
|
||||
text = latexescape(text)
|
||||
#hard coded replace of the underline used for missing names/data
|
||||
text = text.replace('\\_\\_\\_\\_\\_\\_\\_\\_\\_\\_\\_\\_\\_',
|
||||
'\\underline{\hspace{3cm}}')
|
||||
text = text.replace('\\_'*13, '\\underline{\hspace{3cm}}')
|
||||
self._backend.write(text)
|
||||
|
||||
def write_styled_note(self, styledtext, format, style_name):
|
||||
|
Loading…
Reference in New Issue
Block a user