我正在尝试生成一个带有由 Pandas 数据框生成的表的乳胶文件,但没有成功。
我正在使用 pylatex 库来生成整个文件
示例代码如下:
geometry_options = {"tmargin": "1cm", "lmargin": "10cm"}
doc = Document(geometry_options=geometry_options)
with doc.create(Section("Top 10 canales")) as target:
target.append(df.to_latex())
doc.generate_pdf('full', clean_tex=False)
的输出print(df.to_latex())
为:
\begin{tabular}{lr}
\toprule
{} & ATCCO \\
\midrule
All channels & 16395.0 \\
OLATV\_El Trece & 4421.0 \\
OLATV\_TN & 2801.0 \\
OLATV\_Telefe & 2113.0 \\
OLATV\_ESPN 2 & 1632.0 \\
OLATV\_Atcco Canal 2 & 1361.0 \\
OLATV\_America & 925.0 \\
TV Publica & 838.0 \\
OLATV\_Fox Sports 2 & 536.0 \\
OLATV\_ESPN & 497.0 \\
\bottomrule
\end{tabular}
如果我更改该Section()
语句,Tabular()
它会在编译成 pdf 时返回错误
最终的tex文件如下:
\documentclass{article}%
\usepackage[T1]{fontenc}%
\usepackage[utf8]{inputenc}%
\usepackage{lmodern}%
\usepackage{textcomp}%
\usepackage{lastpage}%
\usepackage{geometry}%
\geometry{tmargin=1cm,lmargin=10cm}%
%
%
%
\begin{document}%
\normalsize%
\section{Top 10 canales}%
\label{sec:Top10canales}%
\textbackslash{}begin\{tabular\}\{lr\}\newline%
\textbackslash{}toprule\newline%
\{\} \& ATCCO \textbackslash{}\textbackslash{}\newline%
\textbackslash{}midrule\newline%
All channels \& 16395.0 \textbackslash{}\textbackslash{}\newline%
OLATV\textbackslash{}\_El Trece \& 4421.0 \textbackslash{}\textbackslash{}\newline%
OLATV\textbackslash{}\_TN \& 2801.0 \textbackslash{}\textbackslash{}\newline%
OLATV\textbackslash{}\_Telefe \& 2113.0 \textbackslash{}\textbackslash{}\newline%
OLATV\textbackslash{}\_ESPN 2 \& 1632.0 \textbackslash{}\textbackslash{}\newline%
OLATV\textbackslash{}\_Atcco Canal 2 \& 1361.0 \textbackslash{}\textbackslash{}\newline%
OLATV\textbackslash{}\_America \& 925.0 \textbackslash{}\textbackslash{}\newline%
TV Publica \& 838.0 \textbackslash{}\textbackslash{}\newline%
OLATV\textbackslash{}\_Fox Sports 2 \& 536.0 \textbackslash{}\textbackslash{}\newline%
OLATV\textbackslash{}\_ESPN \& 497.0 \textbackslash{}\textbackslash{}\newline%
\textbackslash{}bottomrule\newline%
\textbackslash{}end\{tabular\}\newline%
%
\end{document}
无渲染:
答案1
的输出df.to_latex()
是包含 LaTeX 代码的字符串。这不符合 PyLaTeX 的正常处理模型,即使用相关 Python 类(如Document()
、Section()
等Tabular()
)生成文档中的所有元素。 的输入应为常规文本,如果此输入中有任何 LaTeX 符号,则使用、和其他符号Section.append()
进行转义。\textbackslash
\&
对于这种情况,PyLaTeX 有一个类NoEscape()
,可以关闭特殊字符处理。手册页对此进行了进一步解释https://jeltef.github.io/PyLaTeX/current/usage.html#plain-latex-strings. 在这种情况下您需要NoEscape(df.to_latex())
。
梅威瑟:
from pylatex import Document, Package, Section, NoEscape
import pandas as pd
df = pd.DataFrame([["All channels", 16395],["OLATV_El Trece",4421.0]],columns=["channel", "ATTCCO"])
geometry_options = {"tmargin": "1cm", "lmargin": "10cm"}
doc = Document(geometry_options=geometry_options)
doc.packages.append(Package('booktabs'))
with doc.create(Section("Top 10 canales")) as target:
target.append(NoEscape(df.to_latex()))
doc.generate_pdf('full', clean_tex=False)
结果:
请注意,我将booktabs
包添加到文档中是因为to_latex()
Pandas 需要它。另外,似乎有一个错误导致to_latex()
输出中跳过一个空列,因此我还为第一列提供了一个列名。
对于空列名,可以使用以下解决方法to_latex(multicolumn=False)
,请参阅https://github.com/pandas-dev/pandas/issues/20008。 代码:
df = pd.DataFrame([["All channels", 16395],["OLATV_El Trece",4421.0]],columns=["", "ATTCCO"])
with doc.create(Section("Top 10 canales")) as target:
target.append(NoEscape(df.to_latex(multicolumn=False)))
结果: