From e4a70458388a99c5d68f4361a906064dd6f56076 Mon Sep 17 00:00:00 2001 From: Brian Matherly Date: Sat, 5 May 2007 04:01:35 +0000 Subject: [PATCH] Convert tabs to space-tabs in LaTeXDoc.py svn: r8436 --- ChangeLog | 3 + src/docgen/LaTeXDoc.py | 444 ++++++++++++++++++++--------------------- 2 files changed, 225 insertions(+), 222 deletions(-) diff --git a/ChangeLog b/ChangeLog index 1b539df23..667f69c94 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,6 @@ +2007-05-04 Brian Matherly + * src/docgen/LaTeXDoc.py: convert tabs to space-tabs + 2007-05-03 Benny Malengier * src/plugins/rel_de.py: issue #0000929 , rel_de.py diff --git a/src/docgen/LaTeXDoc.py b/src/docgen/LaTeXDoc.py index ccf5fbb9e..5724a7e02 100644 --- a/src/docgen/LaTeXDoc.py +++ b/src/docgen/LaTeXDoc.py @@ -112,16 +112,16 @@ def roman2arabic(strval): #------------------------------------------------------------------------ class TexFont: def __init__(self, style=None): - if style: - self.font_beg = style.font_beg - self.font_end = style.font_end - self.leftIndent = style.left_indent - self.firstLineIndent = style.firstLineIndent - else: - self.font_beg = "" - self.font_end = "" - self.leftIndent = "" - self.firstLineIndent = "" + if style: + self.font_beg = style.font_beg + self.font_end = style.font_end + self.leftIndent = style.left_indent + self.firstLineIndent = style.firstLineIndent + else: + self.font_beg = "" + self.font_end = "" + self.leftIndent = "" + self.firstLineIndent = "" #------------------------------------------------------------------------ # @@ -175,122 +175,122 @@ class LaTeXDoc(BaseDoc.BaseDoc,BaseDoc.TextDoc): # that we should use Latin1 and unicode character encodings. self.f.write('\\documentclass[%s]{article}\n' % options) self.f.write('\\usepackage[T1]{fontenc}\n') - self.f.write('%\n% We use latin1 encoding at a minimum by default.\n') - self.f.write('% GRAMPS uses unicode UTF-8 encoding for its\n') - self.f.write('% international support. LaTeX can deal gracefully\n') - self.f.write('% with unicode encoding by using the ucs style invoked\n') - self.f.write('% when utf8 is specified as an option to the inputenc\n') - self.f.write('% package. This package is included by default in some\n') - self.f.write('% installations, but not in others, so we do not make it\n') - self.f.write('% the default. Uncomment the second line if you wish to use it\n') - self.f.write('% (If you do not have ucs.sty, you may obtain it from\n') - self.f.write('% http://www.tug.org/tex-archive/macros/latex/contrib/supported/unicode/)\n') - self.f.write('%\n') + self.f.write('%\n% We use latin1 encoding at a minimum by default.\n') + self.f.write('% GRAMPS uses unicode UTF-8 encoding for its\n') + self.f.write('% international support. LaTeX can deal gracefully\n') + self.f.write('% with unicode encoding by using the ucs style invoked\n') + self.f.write('% when utf8 is specified as an option to the inputenc\n') + self.f.write('% package. This package is included by default in some\n') + self.f.write('% installations, but not in others, so we do not make it\n') + self.f.write('% the default. Uncomment the second line if you wish to use it\n') + self.f.write('% (If you do not have ucs.sty, you may obtain it from\n') + self.f.write('% http://www.tug.org/tex-archive/macros/latex/contrib/supported/unicode/)\n') + self.f.write('%\n') self.f.write('\\usepackage[latin1]{inputenc}\n') self.f.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 + # add packages (should be standard on a default installation) + # for finer output control. Put comments in file for user to read self.f.write('\\usepackage{graphicx} % Extended graphics support\n') self.f.write('\\usepackage{longtable} % For multi-page tables\n') self.f.write('\\usepackage{calc} % For margin indents\n') - self.f.write('%\n% Depending on your LaTeX installation, the') - self.f.write(' margins may be too\n% narrow. ') - self.f.write(' This can be corrected by uncommenting the following\n') - self.f.write('% two lines and adjusting the width appropriately.') - self.f.write(' The example\n% removes 0.5in from each margin.') - self.f.write(' (Adds 1 inch to the text)\n') - self.f.write('%\\addtolength{\\oddsidemargin}{-0.5in}\n') - self.f.write('%\\addtolength{\\textwidth}{1.0in}\n%\n') - self.f.write('% Create a margin-adjusting command that allows LaTeX\n') - self.f.write('% to behave like the other gramps-supported output formats\n') - self.f.write('\\newlength{\\leftedge}\n') - self.f.write('\\setlength{\\leftedge}{\\parindent}\n') - self.f.write('\\newlength{\\grampstext}\n') - self.f.write('\\setlength{\\grampstext}{\\textwidth}\n') - self.f.write('\\newcommand{\\grampsindent}[1]{%\n') - self.f.write(' \\setlength{\\parindent}{\\leftedge + #1}%\n') - self.f.write(' \\setlength{\\textwidth}{\\grampstext - #1}%\n') - self.f.write('}\n\n') + self.f.write('%\n% Depending on your LaTeX installation, the') + self.f.write(' margins may be too\n% narrow. ') + self.f.write(' This can be corrected by uncommenting the following\n') + self.f.write('% two lines and adjusting the width appropriately.') + self.f.write(' The example\n% removes 0.5in from each margin.') + self.f.write(' (Adds 1 inch to the text)\n') + self.f.write('%\\addtolength{\\oddsidemargin}{-0.5in}\n') + self.f.write('%\\addtolength{\\textwidth}{1.0in}\n%\n') + self.f.write('% Create a margin-adjusting command that allows LaTeX\n') + self.f.write('% to behave like the other gramps-supported output formats\n') + self.f.write('\\newlength{\\leftedge}\n') + self.f.write('\\setlength{\\leftedge}{\\parindent}\n') + self.f.write('\\newlength{\\grampstext}\n') + self.f.write('\\setlength{\\grampstext}{\\textwidth}\n') + self.f.write('\\newcommand{\\grampsindent}[1]{%\n') + self.f.write(' \\setlength{\\parindent}{\\leftedge + #1}%\n') + self.f.write(' \\setlength{\\textwidth}{\\grampstext - #1}%\n') + self.f.write('}\n\n') self.f.write('\\begin{document}\n\n') - + self.in_list = 0 - self.in_table = 0 - self.imagenum = 0 - - #Establish some local styles for the report - self.latexstyle = {} - self.latex_font = {} - - style_sheet = self.get_style_sheet() - for style_name in style_sheet.get_paragraph_style_names(): - style = style_sheet.get_paragraph_style(style_name) - font = style.get_font() - size = font.get_size() - - self.latex_font[style_name] = TexFont() - thisstyle = self.latex_font[style_name] - - thisstyle.font_beg = "" - thisstyle.font_end = "" - # Is there special alignment? (default is left) - align = style.get_alignment_text() - if align == "center": - thisstyle.font_beg = thisstyle.font_beg + "\\centerline{" - thisstyle.font_end = "}" + thisstyle.font_end - elif align == "right": - thisstyle.font_beg = thisstyle.font_beg + "\\hfill" - - # Establish font face and shape - if font.get_type_face() == BaseDoc.FONT_SANS_SERIF: - thisstyle.font_beg = thisstyle.font_beg + "\\sffamily" - thisstyle.font_end = "\\rmfamily" + thisstyle.font_end - if font.get_bold(): - thisstyle.font_beg = 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_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 - - if sflag == 1: - thisstyle.font_end = thisstyle.font_end + "\\normalsize" - - thisstyle.font_beg = thisstyle.font_beg + " " - thisstyle.font_end = thisstyle.font_end + " " - - left = style.get_left_margin() - first = style.get_first_indent() + left - - thisstyle.leftIndent = left - thisstyle.firstLineIndent = first - - self.latexstyle[style_name] = thisstyle + self.in_table = 0 + self.imagenum = 0 + + #Establish some local styles for the report + self.latexstyle = {} + self.latex_font = {} + + style_sheet = self.get_style_sheet() + for style_name in style_sheet.get_paragraph_style_names(): + style = style_sheet.get_paragraph_style(style_name) + font = style.get_font() + size = font.get_size() + + self.latex_font[style_name] = TexFont() + thisstyle = self.latex_font[style_name] + + thisstyle.font_beg = "" + thisstyle.font_end = "" + # Is there special alignment? (default is left) + align = style.get_alignment_text() + if align == "center": + thisstyle.font_beg = thisstyle.font_beg + "\\centerline{" + thisstyle.font_end = "}" + thisstyle.font_end + elif align == "right": + thisstyle.font_beg = thisstyle.font_beg + "\\hfill" + + # Establish font face and shape + if font.get_type_face() == BaseDoc.FONT_SANS_SERIF: + thisstyle.font_beg = thisstyle.font_beg + "\\sffamily" + thisstyle.font_end = "\\rmfamily" + thisstyle.font_end + if font.get_bold(): + thisstyle.font_beg = 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_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 + + if sflag == 1: + thisstyle.font_end = thisstyle.font_end + "\\normalsize" + + thisstyle.font_beg = thisstyle.font_beg + " " + thisstyle.font_end = thisstyle.font_end + " " + + left = style.get_left_margin() + first = style.get_first_indent() + left + + thisstyle.leftIndent = left + thisstyle.firstLineIndent = first + + self.latexstyle[style_name] = thisstyle def close(self): """Clean up and close the document""" @@ -305,70 +305,70 @@ class LaTeXDoc(BaseDoc.BaseDoc,BaseDoc.TextDoc): def start_paragraph(self,style_name,leader=None): """Paragraphs handling - A Gramps paragraph is any - single body of text from a single word to several sentences. - We assume a linebreak at the end of each paragraph.""" - style_sheet = self.get_style_sheet() - - style = style_sheet.get_paragraph_style(style_name) - ltxstyle = self.latexstyle[style_name] - self.level = style.get_header_level() - - self.fbeg = ltxstyle.font_beg - self.fend = ltxstyle.font_end - self.indent = ltxstyle.leftIndent - self.FLindent = ltxstyle.firstLineIndent - - if self.indent != None and not self.in_table: - myspace = '%scm' % str(self.indent) - self.f.write('\\grampsindent{%s}\n' % myspace) - self.fix_indent = 1 - - if leader != None and not self.in_list: - self.f.write('\\begin{enumerate}\n') - self.in_list = 1 - if leader != None: - # try obtaining integer - leader_1 = leader[:-1] - num = roman2arabic(leader_1) - if num == 0: - # Not roman, try arabic or fallback to 1 - try: - num = int(leader_1) - except ValueError: - num = 1 - self.f.write(' \\renewcommand\\theenumi{\\arabic{enumi}}') - else: - # roman, set the case correctly - if leader_1.islower(): - self.f.write(' \\renewcommand\\theenumi{\\roman{enumi}}') + single body of text from a single word to several sentences. + We assume a linebreak at the end of each paragraph.""" + style_sheet = self.get_style_sheet() + + style = style_sheet.get_paragraph_style(style_name) + ltxstyle = self.latexstyle[style_name] + self.level = style.get_header_level() + + self.fbeg = ltxstyle.font_beg + self.fend = ltxstyle.font_end + self.indent = ltxstyle.leftIndent + self.FLindent = ltxstyle.firstLineIndent + + if self.indent != None and not self.in_table: + myspace = '%scm' % str(self.indent) + self.f.write('\\grampsindent{%s}\n' % myspace) + self.fix_indent = 1 + + if leader != None and not self.in_list: + self.f.write('\\begin{enumerate}\n') + self.in_list = 1 + if leader != None: + # try obtaining integer + leader_1 = leader[:-1] + num = roman2arabic(leader_1) + if num == 0: + # Not roman, try arabic or fallback to 1 + try: + num = int(leader_1) + except ValueError: + num = 1 + self.f.write(' \\renewcommand\\theenumi{\\arabic{enumi}}') else: - self.f.write(' \\renewcommand\\theenumi{\\Roman{enumi}}') + # roman, set the case correctly + if leader_1.islower(): + self.f.write(' \\renewcommand\\theenumi{\\roman{enumi}}') + else: + self.f.write(' \\renewcommand\\theenumi{\\Roman{enumi}}') + + self.f.write(' \\setcounter{enumi}{%d} ' % num) + self.f.write(' \\addtocounter{enumi}{-1}\n') + self.f.write(' \\item ') - self.f.write(' \\setcounter{enumi}{%d} ' % num) - self.f.write(' \\addtocounter{enumi}{-1}\n') - self.f.write(' \\item ') - - if leader == None and not self.in_list and not self.in_table: - self.f.write('\n') - - self.f.write('%s ' % self.fbeg) + if leader == None and not self.in_list and not self.in_table: + self.f.write('\n') + + self.f.write('%s ' % self.fbeg) def end_paragraph(self): """End the current paragraph""" - newline = '\ \\newline\n' - - if self.in_list: - self.in_list = 0 - self.f.write('\n\\end{enumerate}\n') - newline = '' - - elif self.in_table: - newline = ('') - - self.f.write('%s%s' % (self.fend,newline)) - if self.fix_indent == 1: - self.fix_indent = 0 - self.f.write('\\grampsindent{0cm}\n') + newline = '\ \\newline\n' + + if self.in_list: + self.in_list = 0 + self.f.write('\n\\end{enumerate}\n') + newline = '' + + elif self.in_table: + newline = ('') + + self.f.write('%s%s' % (self.fend,newline)) + if self.fix_indent == 1: + self.fix_indent = 0 + self.f.write('\\grampsindent{0cm}\n') def start_bold(self): """Bold face""" @@ -399,29 +399,29 @@ class LaTeXDoc(BaseDoc.BaseDoc,BaseDoc.TextDoc): def end_table(self): """Close the table environment""" - self.in_table = 0 - # Create a paragraph separation below the table. - self.f.write('\\end{longtable}\n\\par\n') + self.in_table = 0 + # Create a paragraph separation below the table. + self.f.write('\\end{longtable}\n\\par\n') def start_row(self): """Begin a new row""" - # doline/skipfirst are flags for adding hor. rules - self.doline = 0 - self.skipfirst = 0 + # doline/skipfirst are flags for adding hor. rules + self.doline = 0 + self.skipfirst = 0 self.curcol = 0 - self.currow = self.currow + 1 - + self.currow = self.currow + 1 + def end_row(self): """End the row (new line)""" - self.f.write('\\\\ ') - if self.doline == 1: - if self.skipfirst == 1: - self.f.write('\\cline{2-%d}\n' % self.numcols) - else: - self.f.write('\\hline\n') - else: - self.f.write('\n') - + self.f.write('\\\\ ') + if self.doline == 1: + if self.skipfirst == 1: + self.f.write('\\cline{2-%d}\n' % self.numcols) + else: + self.f.write('\\hline\n') + else: + self.f.write('\n') + def start_cell(self,style_name,span=1): """Add an entry to the table. We always place our data inside braces @@ -441,7 +441,7 @@ class LaTeXDoc(BaseDoc.BaseDoc,BaseDoc.TextDoc): cellfmt = "p{\linewidth-3cm}" else: cellfmt = "l" - + # Account for vertical rules if self.lborder == 1: cellfmt = '|' + cellfmt @@ -452,17 +452,17 @@ class LaTeXDoc(BaseDoc.BaseDoc,BaseDoc.TextDoc): if self.bborder == 1: self.doline = 1 elif self.curcol == 1: - elf.skipfirst = 1 + self.skipfirst = 1 if self.tborder != 0: self.f.write('\\hline\n') self.f.write ('\\multicolumn{%d}{%s}{' % (span,cellfmt)) - + def end_cell(self): """Prepares for next cell""" - self.f.write('} ') - if self.curcol < self.numcols: - self.f.write('& ') + self.f.write('} ') + if self.curcol < self.numcols: + self.f.write('& ') def add_media_object(self,name,pos,x,y): """Add photo to report""" @@ -472,19 +472,19 @@ class LaTeXDoc(BaseDoc.BaseDoc,BaseDoc.TextDoc): except: return - self.imagenum = self.imagenum + 1 - picf = self.filename[:-4] + '_img' + str(self.imagenum) + '.eps' - pic.eps_convert(picf) - - # x and y will be maximum width OR height in units of cm - mysize = 'width=%dcm,height=%dcm,keepaspectratio' % (x,y) - if pos == "right": - self.f.write('\\hfill\\includegraphics[%s]{%s}\n' % (mysize,picf)) - elif pos == "left": - self.f.write('\\includegraphics[%s]{%s}\\hfill\n' % (mysize,picf)) - else: - self.f.write('\\centerline{\\includegraphics[%s]{%s}}\n' % (mysize,picf)) - + self.imagenum = self.imagenum + 1 + picf = self.filename[:-4] + '_img' + str(self.imagenum) + '.eps' + pic.eps_convert(picf) + + # x and y will be maximum width OR height in units of cm + mysize = 'width=%dcm,height=%dcm,keepaspectratio' % (x,y) + if pos == "right": + self.f.write('\\hfill\\includegraphics[%s]{%s}\n' % (mysize,picf)) + elif pos == "left": + self.f.write('\\includegraphics[%s]{%s}\\hfill\n' % (mysize,picf)) + else: + self.f.write('\\centerline{\\includegraphics[%s]{%s}}\n' % (mysize,picf)) + def write_note(self,text,format,style_name): """Write the note's text to the file, respecting the format""" self.start_paragraph(style_name) @@ -497,14 +497,14 @@ class LaTeXDoc(BaseDoc.BaseDoc,BaseDoc.TextDoc): def write_text(self,text,mark=None): """Write the text to the file""" - if text == '\n': - text = '\\newline\n' - text = text.replace('#','\#') - text = text.replace('&','\&') - text = text.replace('','\\textsuperscript{') - text = text.replace('','}') - text = text.replace('_____________','\\underline{\hspace{3cm}}') - self.f.write(text) + if text == '\n': + text = '\\newline\n' + text = text.replace('#','\#') + text = text.replace('&','\&') + text = text.replace('','\\textsuperscript{') + text = text.replace('','}') + text = text.replace('_____________','\\underline{\hspace{3cm}}') + self.f.write(text) #------------------------------------------------------------------------