【问题标题】:Remove \hypertarget from pandoc LaTex output从 pandoc LaTex 输出中删除 \hypertarget
【发布时间】:2018-09-15 02:14:28
【问题描述】:

我正在使用 pypandoc 将 markdown 文件转换为 LaTex。我的markdown文件有一个header,例如:

# Header Text # 

当 pypandoc 将文件呈现为 .tex 文件时,它会显示为:

\hypertarget{header-text}{%
\section{Header Text}\label{header-text}}

虽然这是一个很好的功能,可以轻松链接回部分标题,但我不一定想要这样,并且在这种情况下更希望 pypandoc 只生成:

\section{Header Text}

是否有可用于关闭 \hypertarget{} 功能的 pandoc 设置或 pypandoc 设置?我已经查看了 pandoc 的文档,但没有在任何地方看到它。

【问题讨论】:

  • 您能否补充几句关于为什么您更喜欢简单的\section{} 而不是更完整的版本? \hypertarget{} 不应该给 AFAIK 带来任何问题。
  • 我认为,如果它让您感到困扰,您必须对输出进行后处理.. 使用 sed 例如
  • 抱歉延迟响应,但我想澄清一个我不希望 pandoc 添加 \hypertarget{} 功能的原因。正如您将在上面看到的,pandoc 以“%”结束该行。出于某种原因,当我使用 jinja2 模板时,那个“%”符号会导致错误。这很奇怪,我知道。如果我只是在 LaTex 中处理 pandoc 创建的 .tex 文件,它就可以正常工作。但是,当我使用 jinja2 在 python 中处理时,由于某种原因,“%”符号会触发错误。这与 jinja2 试图解释 % 符号的方式有关,但我无法弄清楚发生了什么。
  • REVISED:抱歉延迟响应,但我想澄清一个我不希望 pandoc 添加 \hypertarget{} 功能的原因。正如您将在上面看到的,pandoc 以“%”结束该行,这是一种典型的 LaTex 方式,可确保忽略该行的其余部分。但是 jinja 然后将最后两个字符视为“{%”并将其解释为块的开始。如果我只是在 LaTex 中处理 pandoc 创建的 .tex 文件,它就可以正常工作。但是,当我使用 jinja2 在 python 中处理时,“%”符号会触发错误。
  • Pandoc 也将 \hypertarget 添加到上下文输出中。 hyperref 包与上下文不兼容这是一个问题。

标签: pandoc pypandoc


【解决方案1】:

我也有同样的需求,我正在使用-auto_identifiers 开关,

pandoc -r markdown-auto_identifiers -w latex test.md -o test.tex

这将删除两者

\hypertarget{header-text}{%

\label{header-text}}

只离开

\section{Header Text}

如您所愿。

Source

【讨论】:

    【解决方案2】:

    没有这样的开关。如果您想要不同的输出,您要么必须使用pandoc filter,要么正如@mb21 已经指出的那样,对输出进行后处理。

    这些选项都不是很好:使用过滤器手动定义标题输出将失去各种其他 pandoc 功能,如--top-level-division 和对未编号标题的支持。另一方面,后处理往往很脆弱并且难以正确处理。

    无论如何,下面是一个panflute 过滤器,它将用自定义命令替换标题。将其保存到文件并通过 filters 选项将其传递给 pypandoc;这应该会给你想要的输出。

    from panflute import *
    
    sectionTypes = ["section", "subsection", "subsubsection",
                    "paragraph", "subparagraph"]
    
    def reduce_header(elem, doc):
        if type(elem) == Header:
            cmd = "\\%s{" % sectionTypes[elem.level - 1]
            inlines = [RawInline(cmd, "tex")]
            inlines.extend(elem.content)
            inlines.append(RawInline("}", "tex"))
            return Plain(*inlines)
    
    if __name__ == "__main__":
        run_filter(reduce_header)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多