Python Jinja2 LaTeX表格

3

我是一名新手,正在探索模板引擎Jinja2,帮助我使用Python排版几个LaTeX文档。在我的初步探索中,我只是尝试使用以下Python代码填充表格:

   latex_jinja_env = jinja2.Environment(
        block_start_string = '\BLOCK{',
        block_end_string = '}',
        variable_start_string = '\VAR{',
        variable_end_string = '}',
        comment_start_string = '\#{',
        comment_end_string = '}',
        line_statement_prefix = '%%',
        line_comment_prefix = '%#',
        trim_blocks = True,
        autoescape = False,
        loader = jinja2.FileSystemLoader(os.path.abspath('.'))
)

header = ['Num', 'Date', 'Ticker']
data = [[1, 2, 3], [4, 'STR', 'Test'], [5, 6, 'Ticker']]

template = latex_jinja_env.get_template('template.tex')
print(template.render(section1='Test Table', header = header, data = data))

LaTeX模板的构建如下所示:
\documentclass[12pt,a4paper]{article}

\begin{document}
\section{\VAR{section1}}

\BLOCK{set colsep = joiner("&")}
\begin{tabular}{ ccc }
    \hline
    \BLOCK{for col in header} \VAR{colsep()} \textbf{\VAR{col}} \BLOCK{endfor}  \\         
    \hline
    \hline
    \BLOCK{for row in data} \BLOCK{for col in row} \VAR{colsep()}  \VAR{col}  \BLOCK{endfor} \\ 
    \BLOCK{endfor}           
    \hline
 \end{tabular}
 \end{document}

虽然标题已按要求生成,但是在数据方面出现了一个空列被插入到数据之前:

bash-3.2$ ./rep.py
\documentclass[12pt,a4paper]{article}

\begin{document}
\section{Test Table}

\begin{tabular}{ ccc }
   \hline
      \textbf{Num}   & \textbf{Date}   & \textbf{Ticker}    \\         
   \hline
   \hline
    & 1   & 2   & 3    \\ 
    & 4   & STR   & Test    \\ 
    & 5   & 6   & Ticker    \\ 

  \hline
\end{tabular}
\end{document}
bash-3.2$

什么是用合适的方式向模板表格填充数据?非常感谢您帮助这位新手。
1个回答

5

我不知道你是否已经找到答案,但可以尝试以下方法:

data2 = [[1, 2, 3], [4, 'STR', 'Test'], [5, 6, 'Ticker']]
renderer_template = template.render(dict_map = data2, header = header)

您应该像字典一样粘贴数据,这样您可以单独处理每个数据元素。

然后在您的template.tex文件中,您将会看到类似于以下内容:

\begin{document}
\begin{tabular}{ ccc  }

     \BLOCK{for col in header} 

    \BLOCK{if loop.last} %checks if loop reached to the end
        \VAR{col}
    \BLOCK{else}
        \VAR{col} &
    \BLOCK{endif}

    \BLOCK{endfor}  \\  

    \BLOCK{for col in dict_map} 
    \VAR{col[0]} & \VAR{col[1]} & \VAR{col[2]}  \\
    \BLOCK{endfor}  \\  

    \end{tabular}

在您的代码标题中只打印了一列,如果您想让标题中的每个项目在单独的列中,则必须将标题项目作为item1&item2获取,但是最后一个项目没有符号“&”,因此必须在循环到达最后一个项目时检查它是否为“loop.last”。对于数据,您必须获取数据项中的每个子项,例如col [0]获取1等等。
附言:我不是LaTeX和jinja2的专家。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接