【问题标题】:Using CSS when converting Markdown to PDF with Pandoc使用 Pandoc 将 Markdown 转换为 PDF 时使用 CSS
【发布时间】:2013-07-27 23:01:27
【问题描述】:

我正在 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

我想在每种情况下都将类“文件名”应用于封闭的文本,但它似乎对输出没有任何作用。但是手册说:

一些输出格式可以使用这些信息来进行语法高亮。目前,使用此信息的唯一输出格式是 HTML 和 LaTeX。

这是我的命令:

pandoc \
    --output ./output.pdf \
    --css source/styles.css \
    source/en/docs/input.md

我正在转换为 PDF,它是由 Pandoc 在内部由 LaTeX 编写的。我可以让它工作吗?或者,我可以使用使用 LaTeX 命令定义的样式吗? - 它不一定是 CSS。但是,它必须是一个样式系统 - 每次都更改 italic/font/color 属性是不可行的。

我尝试将输出临时发送到 HTML,在这种情况下,样式是直接从特定样式资源导入的。所以,我的样式表规范和跨度标记是正确的,至少对于一种输出格式是正确的。

附录

一些事后的想法:

  • 解决方案不必是 Pandoc 或 Markdown。但是,它确实需要是一种可以可靠地转换为 PDF 的简单的基于文本的标记语言,因为我想将文档文件存储在 Git 上以便于分叉和合并。我不喜欢 HTML,因为它很冗长,而且转换它的引擎也不是很好(尽管我的格式要求不高)。
  • Pandoc 的 HTML 输出很好,所以如果我能找到将(简单)HTML/CSS 可靠地转换为 PDF 的东西,我会没事的。当然,Pandoc 应该能够做到这一点,但内联样式(用于代码片段的背景颜色)不会被渲染。这可能是个小问题,因为我必须重新引入分页符之类的东西,这在 HTML 到 PDF 转换器中可能很重要。

【问题讨论】:

  • 顺便说一句,如果现在安装 pandoc 可以使用wkhtmltopdf:pandoc -t html5 --css mystyles.css input.md -o output.pdf
  • 谢谢@mb21,感谢。我认为样式从 Markdown 保留到 PDF?我已经忘记了这个问题的细节,但是从上面的阅读来看,Pandoc 中的 HTML 到 PDF 转换似乎是通过 LaTeX 进行的,它剥离了类信息。
  • 对于使用 pandoc 生成 pdf,您现在可以使用 latex(默认)或 wkhtmltopdf(它确实会接收跨度和 div 上的类/样式)。
  • @mb21:很可爱,很高兴听到!如果我再次需要这个,我会尝试那个配置。

标签: css latex pandoc


【解决方案1】:

“我想在每种情况下都将类“文件名”应用于封闭的文本,但它似乎对输出没有任何作用。”

它适用于 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:在转换为 PDF 时,可能能够很好地处理 HTML 和 CSS 的唯一免费实用程序是 wkhtmltopdf。但我不确定它与您的 CSS 的效果如何。 PrinceXML 震撼,我不介意第一页上不显眼的水印。如果你不想要它,付钱:-)
  • 我在商业上使用过 Prince - 它非常棒,尽管 IMO 非常昂贵。然而,这是一个免费项目,所以付款不是一种选择。但是,我一般理解水印/付款困境:-)。
  • 我不记得我是否尝试过wkhtmltopdf 用于提示此问题的用例。当我在商业上使用它时,它是 Prince 的潜在竞争对手,但 wkhtmltopdf 并不能很好地处理多页表。普林斯在这方面要好得多。
  • 偏向于作为他们的开发人员,但DocRaptor.com 是 PrinceXML 的托管提供商,提供不同的定价和交付模型。 wkhtmltopdf 是我们玩过的最好的操作系统。
【解决方案2】:

我根本不知道 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

这将创建一个具有背景颜色和等宽字体的样式。根据我的喜好,边距和填充有点大,但这是一个非常有用的开始。这是它的样子:

缺点是,如果我希望输出到支持适当样式的格式(例如 HTML),那么这些都会丢失。此外,我的解决方案仅适用于 LaTeX/PDF。因此,如果您可以解决这些问题,请添加更好的答案!


附录:我有一个更好的方法,那就是:

\newcommand{\inlinecodeblock}[1]{
    \fboxsep 1pt
    \fboxrule 0pt
    \colorbox{silver}{\strut{\texttt{#1}}}
}

这避免了水平填充过多的问题——我认为这是colorbox 参数中的换行符造成的。我在strut 中添加了,无论文本是否有下降,都会保持高亮相同的高度。

虽然它并不完美 - 框外的水平边距仍然太多,框后的逗号仍然会孤立到下一行。我可能会放弃 LaTeX,从 Pandoc 渲染成 HTML,然后使用wkhtmltopdf 渲染最终文档。

【讨论】:

  • LaTeX 将换行符视为空格,除非被注释转义,即如果有疑问,请在行尾添加 %,这样您的 exxtrace 空格就会消失。
  • 感谢@Ulrich,这是通过将我的第一个示例中的缩进方法交换为一行来解决的。所以这是一个 LaTeX 问题,还有八个问题……按照这个速度,我可能会坚持使用 Open Office ;-)。
  • 顺便提一下@Ulrich,如果您知道一种将 Markdown 等可合并文本格式转换为 PDF 的简单方法,同时保留寡/孤控制、keep-with-next-paragraph、内联样式、块样式等,那么我将非常感谢您的建议。我希望这可以在 LaTeX 中完成,但我没有耐心学习一门新语言,特别是考虑到同样可以在 Open Office 中立即完成。我想问一个关于 Stack Overflow 的新问题,但不幸的是这里是 o/t。
  • +1 表示“..我不知道 Latex,但是...”并且仍然得到“已解决”的检查。
  • 谢谢@BondedDust - 虽然这是一个自我回答:-)。
猜你喜欢
  • 2013-04-07
  • 2018-08-08
  • 2021-07-15
  • 1970-01-01
  • 2012-11-11
  • 2013-05-13
相关资源
最近更新 更多