使用CSS将Markdown转换为PDF时如何使用Pandoc?

8
我是一位有用的助手,可以为您进行文本翻译。以下是需要翻译的内容:

我正在尝试在 OS X 上使用 Pandoc,目前结果令人印象深刻。然而,一个阻碍问题是如何让 CSS 样式在内联代码示例中起作用。我正在将 Markdown 转换为 PDF。

我在源代码中有这个字符串:

* Create a simple HTML document (<span class="filename">simple.html</span>) and load it into the browser via the file system

我也尝试过这个方法:
* Create a simple HTML document (`simple.html`{.filename}) and load it into the browser via the file system

我想将“filename”类应用于每种情况下的封闭文本,但似乎对输出没有任何影响。然而,手册中说:
一些输出格式可以使用此信息进行语法高亮。目前,唯一使用此信息的输出格式是HTML和LaTeX。
这是我的命令:
pandoc \
    --output ./output.pdf \
    --css source/styles.css \
    source/en/docs/input.md

我正在将使用LaTeX编写的Pandoc文档转换为PDF,我能够实现吗?或者,我可以使用使用LaTeX命令定义的样式吗?- 不必使用CSS。但是,它必须是一个样式系统 - 在每个场合更改斜体/字体/颜色属性是不可行的。
我已经尝试将输出临时发送到HTML,在这种情况下,样式直接从特定样式资产中导入。因此,我的样式表规范和跨度标记至少对于一个输出格式是正确的。
追加说明:
一些想法:
- 解决方案不必是 Pandoc 或 Markdown。然而,它确实需要是一个简单的基于文本的标记语言,可以可靠地转换为PDF,因为我希望将文档文件存储在 Git 上以便轻松分叉和合并。我不喜欢HTML,因为它很冗长,而且将其转换的引擎并不那么好(尽管,诚然,我的格式要求很简单)。 - Pandoc 的 HTML 输出很好,因此如果我能找到某个可以可靠地将(简单的)HTML / CSS 转换为 PDF 的东西,我就可以了。当然,Pandoc 应该能够做到这一点,但内联样式(用于代码片段的背景颜色)未呈现。这可能会很烦人,因为我将不得不重新引入诸如分页之类的东西,在从 HTML 到 PDF 转换器中可以是非常棘手的。

3
顺便说一下,如果安装了wkhtmltopdf,Pandoc现在可以使用它: pandoc -t html5 --css mystyles.css input.md -o output.pdf - mb21
感谢@mb21,非常感谢。我理解从Markdown到PDF的样式是保留的吗?我已经忘记了这个问题的细节,但从上面的阅读中看来,Pandoc中的HTML到PDF转换过去是通过LaTeX进行的,这会剥离类信息。 - halfer
对于使用Pandoc生成PDF,现在可以选择使用默认的LaTeX或wkhtmltopdf(它确实会在span和div上接收类/样式)。 - mb21
@mb21:太好了,很高兴听到这个消息!如果我再需要这个,我会尝试那个配置。 - halfer
1
相关:如何将Markdown + CSS转换为PDF? - Gabriel Staples
@GabrielStaples 有没有办法使用 Pandoc 在 HTML 转 PDF 的过程中添加或修复 CSS?我的观察是,Pandoc 转换的 PDF 文档在进行精确的 HTML 到 PDF 转换时并不干净。 - Mahesh Mesta
2个回答

2
我希望将“filename”类应用于每个案例中的封闭文本,但似乎对输出没有任何影响。它适用于HTML。在交互式运行Pandoc时,使用^D查看结果代码。
$>  pandoc -f markdown -t html

* Create a simple HTML document (`simple.html`{.filename}) and load it.

^D

<ul>
<li>Create a simple HTML document (<code class="filename">simple.html</code>) and load it.</li>
</ul>

如果您使用.filename类,则无法在LaTeX中正常工作。 您需要使用其中一个已知的类名:

$>  pandoc -f markdown -t latex

* Create a simple HTML document (`simple.html`{.filename}) and load it.

^D

\begin{itemize}
\tightlist
\item
  Create a simple HTML document (\texttt{simple.html}) and load it.
\end{itemize}

现在使用其中一个已知的类名,比如 .bash.postscript.php 等:

$>  pandoc -f markdown -t latex

* Create a simple HTML document (`simple.html`{.bash}) and load it.

^D

\begin{itemize}
\tightlist
\item
  Create a simple HTML document (\VERB|\KeywordTok{simple.html}| and
  load it.
\end{itemize}

要将HTML + CSS转换为PDF,您还可以查看PrinceXML,非商业使用免费。


嗨 Kurt - 我想回来感谢并评论你的答案 - 抱歉当时我没有这样做。我不再急需此功能 - 但将来可能会用到,所以参考它会很有用。我曾考虑过PrinceXML,但免费版本会在文档上放置水印,我不想要这个。 - halfer
@halfer:唯一可能能够在将HTML转换为PDF时足够处理CSS的免费实用程序是wkhtmltopdf。但我不确定它在处理你的CSS方面表现如何。PrinceXML非常出色,我不介意第一页上的非侵入式水印。如果你不想要它,就付款吧 :-) - Kurt Pfeifle
2
我曾经商业地使用过Prince - 它非常出色,但我认为它非常昂贵。然而这是一个免费项目,所以付款不是一个选项。但是,我理解一般的水印/付款困境 :-) - halfer
我记不清我是否在促使这个问题的用例中尝试过 wkhtmltopdf。当我商业使用它时,它是 Prince 的一个潜在竞争对手,但 wkhtmltopdf 在处理多页表格方面表现不佳。在这方面,Prince要好得多。 - halfer
2
作为开发人员,我们可能会有偏见,但 https://DocRaptor.com 是 PrinceXML 的托管提供商,提供不同的定价和交付模式。然而,wkhtmltopdf 是我们使用过的最好的操作系统。 - jamespaden

1

我完全不了解LaTeX,但是通过使用this helpful manual,我成功地找到了这个解决方案。首先,创建一个样式:

\definecolor{silver}{RGB}{230,230,230}

\newcommand{\inlinecodeblock}[1]{
    \colorbox{silver}{
        \texttt{#1}
    }
}

这是如何使用它的方法:

Some \inlinecodeblock{inline code}, and some widgets, go here

这创建了一个带有背景色和等宽字体的样式。我的喜好是边距和填充有点大,但它是一个非常实用的开始。以下是它的外观:

Screenshot of inline formatting

缺点是,如果我想输出支持样式的格式(如HTML),则这些样式将丢失。此外,我的解决方案仅适用于LaTeX/PDF。因此,如果您能解决这些问题,请添加更好的答案!
补充说明:我有一个更好的方法,如下所示:
\newcommand{\inlinecodeblock}[1]{
    \fboxsep 1pt
    \fboxrule 0pt
    \colorbox{silver}{\strut{\texttt{#1}}}
}

这样可以避免过多的水平填充 - 我认为是colorbox参数中的换行符造成的。我添加了strut,无论文本是否有下降,都保持了相同的高度。
但它仍然不完美 - 盒子外面仍然有太多的水平边距,并且在方框后面加逗号仍会孤立到下一行。我可能会放弃LaTeX,从Pandoc渲染到HTML,然后使用wkhtmltopdf来呈现最终文档。

1
LaTeX 将换行视为空格,除非通过注释进行转义。即,当有疑问时,请在行末加上“%”,这样多余的空格就会消失。 - Ulrich Schwarz
感谢@Ulrich,通过将我的第一个示例中的缩进方式更换为一行代码来解决了这个问题。所以这是一个LaTeX问题解决了,还有八个问题要解决...按照这个速度,我可能会坚持使用Open Office ;-) - halfer
顺便问一下@Ulrich,如果您知道一种简单的方法可以将类似Markdown这样可合并的文本格式转换为PDF,并保留孤行控制、与下一段连续、内联样式、块样式等,则非常感谢您的建议。我想这可以在LaTeX中完成,但是我没有耐心学习一门新语言,特别是考虑到在Open Office中可以立即完成相同的操作。我想在Stack Overflow上提一个新问题,但很遗憾这里不适合。 - halfer
1
+1 对于“..我不会Latex,但是…”并仍然获得“已解决”的勾选。 - IRTFM
谢谢@BondedDust - 尽管这是一个自我回答 :-) - halfer
(旁注:刚才的踩是某个人在踩我不相关的回答,与本回答内容无关) - halfer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接