如何控制pandoc生成乳胶中的表?

时间:2015-12-03 18:34:19

标签: latex markdown pandoc

我正在使用pandoc将Markdown文档转换为LaTeX。我保存了默认的LaTeX模板(pandoc -D latex)并根据我的需要对其进行了修改。

我现在需要改变表格的样子:

  1. 更改表格标题的文字颜色;
  2. 将表格上方的标题位置更改为表格下方;
  3. 使用“网格”表格,其中单元格边界可见;
  4. 将标题更改为灰色背景上的粗体文字。
  5. 我可以使用:

    更改表格标题的颜色(第1点)
    \usepackage{caption}
    \DeclareCaptionFont{myColor}{\color[RGB]{40,70,119}}
    \captionsetup{labelfont=myColor,textfont=myColor,position=bottom}
    

    但忽略了position选项(第2点。)

    我希望能够控制pandoc生成的LaTeX表的样式。那可能吗?有什么建议吗?

    谢谢!

1 个答案:

答案 0 :(得分:2)

实际上可以更改表的生成方式,而不是稍后尝试修复它们。我们需要的是一个pandoc过滤器。

不是告诉pandoc生成最终文档,而是需要将其AST提供给过滤器,以便生成所需的格式而不是默认格式。然后将此修改后的AST发送回pandoc进行最终转换。

此AST是JSON格式。

流程如下:

pandoc -t json -s | ./filter.py | pandoc -f json

其中filter.py是一个过滤器,将JSON数据作为stdin并将修改后的JSON吐出到stdout

这可以通过告诉pandoc来完成:

pandoc --filter ./filter.py -s

这是我正在使用的过滤器:

#!/usr/bin/env python2

import pandocfilters as pf

def latex(s):
    return pf.RawBlock('latex', s)

def inlatex(s):
    return pf.RawInline('latex', s)

def tbl_caption(s):
    return pf.Para([inlatex(r'\caption{')] + s + [inlatex('}')])

def tbl_alignment(s):
    aligns = {
        "AlignDefault": 'l',
        "AlignLeft": 'l',
        "AlignCenter": 'c',
        "AlignRight": 'r',
    }
    return ''.join([aligns[e['t']] for e in s])

def tbl_headers(s):
    result = s[0][0]['c'][:]
    # Build the columns. Note how the every column value is bold.
    # We are still missing "\textbf{" for the first column
    # and a "}" for the last column.
    for i in range(1, len(s)):
        result.append(inlatex(r'} & \textbf{'))
        result.extend(s[i][0]['c'])
    # Don't forget to close the last column's "\textbf{" before newline
    result.append(inlatex(r'} \\ \hline'))
    # Put the missing "\textbf{" in front of the list
    result.insert(0, inlatex(r'\textbf{'))
    # Preprend the command to set the row color in front of everything
    result.insert(0, inlatex(r'\rowcolor{grey} '))
    return pf.Para(result)

def tbl_contents(s):
    result = []
    for row in s:
        para = []
        for col in row:
            para.extend(col[0]['c'])
            para.append(inlatex(' & '))
        result.extend(para)
        result[-1] = inlatex(r' \\ \hline' '\n')
    return pf.Para(result)

def do_filter(k, v, f, m):
    if k == "Table":
        # Ensure every alignment characters is surrounded by a pipes.
        # Get the string of the alignment characters
        # and split into an array for every characters.
        split_alignment = [c for c in tbl_alignment(v[1])]
        # Join this list into a single string with pipe symbols
        # between them, plus pipes at start and end.
        # This results in a boxed table.
        new_alignment = "|" + "|".join(split_alignment) + "|"
        return [latex(r'\begin{table}[h]'),
                latex(r'\centering'),
                latex(r'\begin{tabular}{%s} \hline' % new_alignment),
                tbl_headers(v[3]),
                tbl_contents(v[4]),
                latex(r'\end{tabular}'),
                # Put the caption after the tabular so it appears under table.
                tbl_caption(v[0]),
                latex(r'\end{table}')]


if __name__ == "__main__":
    pf.toJSONFilter(do_filter)

请注意,它使用的是pandocfilters python模块。使用pip安装它:

pip install pandocfilters

来源: