[英]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 中,使用以下命令生成“标题”:
\\section
\\subsection
\\subsubsection
\\paragraph
\\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 级标题和段落之间的空间之后。
这是它的工作原理:由于一行上的\\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 命令的布局:对于四级标题,默认情况下是\\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 类(如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.