使用Sphinx更改Latex表格样式

使用Sphinx更改Latex表格样式,latex,python-sphinx,pandoc,pdflatex,Latex,Python Sphinx,Pandoc,Pdflatex,我正在使用sphinx生成公司手册。在我们的传统手册中,我们有一个特定的表格样式,我们希望保留它 表格样式由标题为深绿色背景的表格组成,然后是几行浅绿色背景行,然后是几行白色背景行 Sphinx生成我的LaTeX输入文件,然后使用PdfLatex将其制作成PDF。可以在LaTeX表以:raw role:开头之前包含特定于LaTeX的注释 输入RST文件: .. role:: raw-role(raw) :format: latex :raw-role:`\firstRow` ==

我正在使用
sphinx
生成公司手册。在我们的传统手册中,我们有一个特定的表格样式,我们希望保留它

表格样式由标题为深绿色背景的表格组成,然后是几行浅绿色背景行,然后是几行白色背景行

Sphinx
生成我的LaTeX输入文件,然后使用PdfLatex将其制作成PDF。可以在LaTeX表以
:raw role:
开头之前包含特定于LaTeX的注释

输入RST文件:

.. role:: raw-role(raw)
   :format: latex

:raw-role:`\firstRow`   

=== === ===
 A   B   C
=== === ===
1A   1B  1C
2A   2B  2C
3A   3B  3C
4A   4B  4C
=== === ===
将转化为:

\firstRow

\noindent\begin{tabulary}{\linewidth}{|L|L|L|}
\hline
\sphinxstylethead{\relax 
A
\unskip}\relax &\sphinxstylethead{\relax 
B
\unskip}\relax &\sphinxstylethead{\relax 
C
\unskip}\relax \\
\hline
1A
&
1B
&
1C
\\
\hline
2A
&
2B
&
2C
\\
\hline
3A
&
3B
&
3C
\\
\hline
4A
&
4B
&
4C
\\
\hline\end{tabulary}
我现在需要一个名为
\firstRow
的命令,该命令修改
\tabulary
环境的行为,以便标题具有深绿色背景,下面的第一行具有浅绿色背景,其余行具有白色背景

如果其他所有操作都失败,则仍有可能使用
pandoc
之类的工具自动替换RST文件中单元格的内容。 例如,可以将RST文件中的
1A
替换为
:原始角色:'\background{green}'1A
,然后使用
sphinx
对其进行转换

我发现有趣的是,对于sphinx
HTML
目标,通过使用包含类
firstRow
的经过调整的
样式.css
以及类似
的命令,可以很容易地解决问题。。rst class::firstRow
,其中
firstRow
表示具有一个浅绿色背景的表格样式


不幸的是,LaTeX目标缺少类似于
style.css

的东西一般来说,LaTeX没有HTML+css那样可定制

可能有一些软件包提供了方便的接口来着色表的前两行,不幸的是,我不知道有一个软件包可以在表前面使用宏,如
\firstRow
xcolor
包提供了一个
\rowcolors
命令(如果加载了选项表),但它似乎不够。通过手动标记LaTeX源代码很容易获得所需的目标,但仅使用
\firstRow
宏来实现这一目标更为复杂

我最终采用了一种复杂的方法,并在Sphinx1.5.3上进行了测试

conf.py
中:

latex_elements = {
    'preamble': r"""
\usepackage{colortbl}
\protected\def\sphinxstylethead {\cellcolor{green}\textsf}
"""
}

编辑:自Sphinx 1.6以来,
\sphinxstylethead
已被弃用,
\sphinxstylethead家族
。这意味着上述内容现在应为:

latex_elements = {
    'preamble': r"""
\usepackage{colortbl}
\protected\def\sphinxstyletheadfamily {\cellcolor{green}\sffamily}
"""
}
前一个版本适用于Sphinx 1.6,但在Sphinx停止使用
\sphinxstylethead
时,将在Sphinx 1.7中失败


在reST源代码中,类似以下内容:

======  === ===
  A      B   C
======  === ===
|x| 1A   1B  1C
2A       2B  2C
3A       3B  3C
4A       4B  4C
======  === ===


.. |x| raw:: latex

       \rowcolor{blue}
当然可以根据你的喜好改变颜色。您可能需要将类似于
dvipsnames
的选项传递给
xcolor
包,然后可以使用类似于
\rowcolor[named]{ForestGreen}
的东西

Sphinx1.6将有表格模板,允许一些更简单的定制,但这与HTML+CSS相比仍然是一条漫长的道路


为了完整起见,这里介绍了如何将
dvipsnames
选项传递到
xcolor

latex_elements = {
    'passoptionstopackages': '\\PassOptionsToPackage{dvipsnames}{xcolor}',

    'preamble': r"""
\usepackage{colortbl}
% for Sphinx 1.5.x (1.6 ok, but 1.7 not):
\protected\def\sphinxstylethead {\cellcolor{Aquamarine}\textsf}
% better to use rather this with Sphinx 1.6 and mandatory if Sphinx 1.7:
% \protected\def\sphinxstyletheadfamily {\cellcolor{Aquamarine}\sffamily}
""",
}
另外,我上面提到的
[named]
\rowcolor[named]{ForestGreen}
)在
xcolor
中是不需要的,我也没有在这里的
'preamble'
配置中使用它

当仅使用
color
软件包,而Sphinx使用
xcolor
软件包(如果可用)时,需要使用该选项

如果还将选项
传递给
xcolor
,则不需要加载
colortbl
,这可能是在以后需要使用
xcolor
时更好的方法


网格表中的合并单元格会导致棘手的问题,Sphinx 1.6在这方面会比目前好得多,但是在当前的开发状态下,合并单元格(多行、多列或两者)被设置为只忽略表格颜色命令。

酷。非常感谢。这似乎是迄今为止我见过的最好的解决方案。我试试看。我期待着在Sphinx 1.6中看到很酷的功能。谢谢,这里的一个问题是,我不能像替换第二行那样替换第一行,因为
\rowcolor
需要排在第一行,它可能会在
\sphinxstylethead
中结束。使用Sphinx主分支上当前的模板,可以在插入表头之前将
\rowcolor
放在那里。表模板将允许一些这样的基本内容,我不想提出太多希望;-)对于任何从Google(像我一样)来到这里学习如何加粗所有表(表>30行除外)的标题行的人,请在序言中添加以下内容:
\protected\def\sphinxstyletheadafamily{\bfseries}
,在较新版本的Sphinx中。