@ -35,6 +35,7 @@ class LaTeXRenderer(mistletoe.latex_renderer.LaTeXRenderer):
def __init__ ( self , * extras ) :
super ( ) . __init__ ( * extras )
self . render_map [ ' NumberedHeading ' ] = self . render_numbered_heading
self . render_map [ ' Subrules ' ] = self . render_subrules
self . render_map [ ' SubrulesItem ' ] = self . render_subrules_item
self . render_map [ ' Note ' ] = self . render_note
@ -43,11 +44,31 @@ class LaTeXRenderer(mistletoe.latex_renderer.LaTeXRenderer):
self . heading_last = False
def render_raw_text ( self , token ) :
result = super ( ) . render_inner ( token )
result = super ( ) . render_raw_text ( token )
result = result . replace ( ' ★★★ ' , r ' \ texorpdfstring { \ freeserif ★★★} { ★★★} ' )
return result
def render_heading ( self , token ) :
if token . level == 1 :
heading_last , self . heading_last = self . heading_last , True
return format ( r ' { \ par \ vspace { 1cm plus 0.3cm minus 0.3cm} \ bfseries \ fontsize {13pt} {15pt} \ selectfont \ centering \ uppercase { <content>} \ phantomsection \ addcontentsline {toc} {section} { <content>} \ nopagebreak \ par} ' ,
content = self . render_inner ( token )
)
if token . level == 2 :
heading_last , self . heading_last = self . heading_last , True
return format ( r ' { \ par \ vspace { <space_above>} \ bfseries \ fontsize {13pt} {15pt} \ selectfont \ centering <content> \ phantomsection \ addcontentsline {toc} {subsection} { <content>} \ nopagebreak \ par} ' ,
space_above = ' 1cm plus 0.3cm minus 0.3cm ' if not heading_last else ' 0cm ' ,
content = self . render_inner ( token )
)
if token . level == 3 :
heading_last , self . heading_last = self . heading_last , False
return format ( r ' { \ par \ bfseries \ makebox[<lmarg>][l] { ~}<content> \ phantomsection \ addcontentsline {toc} {subsubsection} { <content>} \ nopagebreak \ par} ' ,
content = self . render_inner ( token )
)
def render_numbered_heading ( self , token ) :
if token . level == 1 :
# Part
heading_last , self . heading_last = self . heading_last , True
@ -117,6 +138,51 @@ class LaTeXRenderer(mistletoe.latex_renderer.LaTeXRenderer):
content = self . render_inner ( token )
)
def render_table ( self , token ) :
align = [ ' X ' for col in token . column_align ]
if hasattr ( token , ' header ' ) :
for i , col in enumerate ( token . header . children ) :
if ' [ ' in col . children [ 0 ] . content . split ( ' ' ) [ 0 ] :
param = col . children [ 0 ] . content [ col . children [ 0 ] . content . index ( ' [ ' ) : col . children [ 0 ] . content . index ( ' ] ' ) + 1 ]
align [ i ] + = param
result = [
format ( ' { \\ footnotesize \\ begin {longtabu} to \\ dimexpr \\ columnwidth-<lmarg> \\ relax [r] { ' ) ,
' ' . join ( align ) ,
' } \\ toprule \n ' ]
if hasattr ( token , ' header ' ) :
result . append ( self . render_table_header ( token . header ) + ' \\ midrule[ \\ heavyrulewidth] \n ' )
for i , row in enumerate ( token . children ) :
result . append ( self . render_table_row ( row ) )
if i != len ( token . children ) - 1 :
result . append ( ' \\ midrule \n ' )
result . append ( r ' \ bottomrule \ end {longtabu} } ' )
return ' ' . join ( result )
def render_table_header ( self , token ) :
cells1 = [ ' { \\ bfseries Column ' + self . render_inner ( child ) . split ( ' ' ) [ 0 ] . split ( ' [ ' ) [ 0 ] + ' } ' for child in token . children ]
cells2 = [ ' { \\ bfseries ' + ' ' . join ( self . render_inner ( child ) . split ( ' ' ) [ 1 : ] ) + ' } ' for child in token . children ]
return ' & ' . join ( cells1 ) + ' \\ \\ \\ midrule \n ' + ' & ' . join ( cells2 ) + ' \\ \\ '
def render_table_row ( self , token ) :
cells = [ self . render_table_cell ( child , colnum ) for colnum , child in enumerate ( token . children ) ]
return ' & ' . join ( cells ) + ' \\ \\ '
def render_table_cell ( self , token , colnum ) :
inner = self . render_inner ( token )
if colnum == 0 :
return format ( r ' \ makebox[1.8em][l] { <rownum>.}<content> ' ,
rownum = inner . split ( ' ' ) [ 0 ] ,
content = ' ' . join ( inner . split ( ' ' ) [ 1 : ] )
)
else :
return inner
def render_document ( self , token ) :
template = r '''
\documentclass [ a4paper , 12 pt ] { article }
@ -131,6 +197,7 @@ class LaTeXRenderer(mistletoe.latex_renderer.LaTeXRenderer):
\usepackage { fancyhdr }
\setlength { \emergencystretch } { 3 em }
\usepackage { microtype }
\usepackage { longtable } \usepackage { tabu } \usepackage { booktabs }
\newlength \notetaglength
\newlength \lastalign \newcommand { \updatealign } { \global \lastalign = \dimexpr \leftskip + \hangindent \relax }
% TOC format