繁体   English   中英

从 Markdown 4th header 生成 pdf 的 Pandoc 呈现方式不同

[英]Pandoc generation of pdf from markdown 4th header is rendered differently

我正在使用 pandoc 从一些降价生成 pdf。 我通过哈希符号使用 h1 到 h4。 示例 h1=#, h4=####。 当我像这样生成我的文档时:

pandoc input.md -o output.pdf

我得到一个文档,其中 h1、h2 和 h3 后面有一个换行符,但 h4 没有换行符。 文本与标题在同一行开始(它的格式不同,但中间没有换行符)。

我尝试在 #### 之后添加空格并使用我的编辑器添加手动换行,但似乎没有任何效果。

有任何想法吗?

pandoc通过 LaTeX 生成 PDF。 在 LaTeX 中,使用以下命令生成“标题”:

  1. \\section
  2. \\subsection
  3. \\subsubsection
  4. \\paragraph
  5. \\subparagraph

如您所见,“四级标题”对应于\\paragraph命令,它按照您的描述呈现。 根本没有要使用的\\subsubsubsection命令。

获得所需内容的唯一方法是重新定义\\paragraph命令,这非常棘手。 我一直无法让它与 Pandoc 一起工作。

虽然提到的解决方案工作正常, pandoc 提供了一个内置变量来为\\paragraph启用块标题。

pandoc -s -o out.pdf some.md -V block-headings

潘多克手册

虽然@tarleb 的答案肯定是最好的(除了它指定了错误的垂直空间量),但这里有一个“更简单”(从某种意义上说)但更笨拙(至少在 LaTeX 术语中)的解决方案,它可以选择使用 Pandoc Lua 过滤器或 LaTeX hack 但避免加载另一个 LaTeX 包。

我们希望 LaTeX 源看起来像这样:

\hypertarget{level-4-heading}{%
\paragraph{Level 4 heading}\label{level-4-heading}}

\hfill

Lorem ipsum dolor sit amet.

这个 LaTeX 看起来很糟糕,但如果你不需要保留或共享 LaTeX 源代码,它会做你可能想要的:第 4 级标题和它后面的段落之间的空间等于第 3 级标题和段落之间的空间之后。

带分段符的 4 级标题

这是它的工作原理:由于一行上的\\hfill与 LaTeX 中的空段落尽可能接近,因此您将获得第一段 - 与标题一起运行的段落 - 仅包含水平空白,直到行尾,然后紧接在一个新段落之后——标题之后的实际第一段——在它和标题之间只有一个普通的段落空间。 这可能也扰乱了 LaTeX 关于\\paragraph应该尽可能少的想法。

执行此操作的“手动”方法如下:

    #### Level 4 heading

    ````{=latex}
    \hfill
    ````

    Lorem ipsum dolor sit amet.

这使用了 Pandoc 相对较新的原始标记语法——“代码块”实际上是一个原始的 LaTeX 块——但它看起来比生成的 LaTeX 源代码更糟糕! 必须在每个 4 级标题之后插入它也是一件乏味的苦差事。 换句话说,您想自动插入原始 LaTeX,这可以通过 Lua 过滤器完成:

    --[======================================================================[

    latex-h4-break.lua - Pandoc filter to get break after a level 4 heading.

    Usage:

        $ pandoc --lua-filter latex-h4-break.lua input.md -o output.pdf

    --]======================================================================]

    -- create it once, use it many times!
    local hfill_block = pandoc.RawBlock('latex', '\\hfill')

    function Header (elem)
        if 4 == elem.level then 
            return { elem, hfill_block }
        else -- ignore headings at other levels!
            return nil 
        end
    end

但是,您也可以在header-includes元数据块中执行简单的 LaTeX hack 以获得相同的效果:

    ---
    header-includes: 
      - |
        ``` {=latex}
        \let\originAlParaGraph\paragraph
        \renewcommand{\paragraph}[1]{\originAlParaGraph{#1} \hfill}
        ```
    ---

    #### Level 4 heading

    Lorem ipsum dolor sit amet.

这首先创建\\paragraph命令的“别名”,然后重新定义\\paragraph命令本身,使用新定义中的别名,这样现在 Pandoc 创建的 LaTeX 源包含\\paragraph{Foo}任何地方,如果它是取而代之的是包含\\paragraph{Foo} \\hfill ,它以零额外的依赖来完成我们想要的! (如果你想知道“aliased”命令的古怪拼写是为了最小化它与任何已经存在的东西冲突的风险,因为 TeX \\let命令不会检查它。我们当然不想覆盖任何现有命令!)

注意:如果您确实需要比标题后的正常分段\\hfill更多或更少的空间,只需在\\hfill之后添加适当的\\vspace命令: \\hfill \\vspace{-0.5\\parskip}

移动标题

可以说,解决这个问题的最好方法是通过改变 4 级标题对应的内容来完全避免这个问题。 对于pandoc默认是使用\\section命令为1级和\\paragraph为4级标题。 这可以通过--top-level-division参数进行更改:

--top-level-division=[default|section|chapter|part]

将顶级标题视为 LaTeX [...] 输出中的给定划分类型。 层次顺序是部分,章节,然后部分; 所有标题都被移动,使得顶级标题成为指定的类型。 默认行为是通过启发式 [...]

因此,使用--top-level-division=chapter ,将通过\\subsubsection命令生成第 4 级标题。

通过 LaTeX 进行样式设置

如果这不是一个选项,下一个最好的方法是配置相应的 LaTeX 命令的布局:对于四级标题,默认情况下是\\paragraph 以下方法取自TeX StackExchange 答案

请检查 bpj 的答案,这比下面提出的要简单得多。

默认文档类

默认方式是通过titlesec包配置\\paragraph 我们可以为此使用header-includes元数据字段,pandoc 将包含在中间 LaTeX 文档中。

---
header-includes: |
  ``` {=latex}
  \usepackage{titlesec}
  \titlespacing*{\paragraph}{0pt}{1ex}{-\parskip}
  \titleformat{\paragraph}[hang]
      {\normalfont\bfseries}
      {}
      {0pt}
      {}
  ```
---

KOMA 文档类

对于使用 KOMA 类(如scrartcl )的文档,使用titlesec将无法正常工作,因为 KOMA 有它自己的做事方式。 对于这些,请使用此替代代码段:

---
documentclass: scrartcl
header-includes: |
  ``` {=latex}
  \makeatletter
  \renewcommand\paragraph{\@startsection{paragraph}{4}{\z@}%
    {-3.25ex \@plus -1ex \@minus -0.2ex}%
    {0.01pt}%
    {\raggedsection\normalfont\sectfont\nobreak\size@paragraph}%
  }
  \makeatother
  ```
---

我不确定,为什么,但这对我有用:

$\\ \\\\ $放在#### headline后的第一行

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM