请帮助乌克兰!
赞助商
Pandoc   一个通用文档转换器

常见问题

如何将整个目录的文件从 Markdown 转换为 RTF?

在 Linux 或 OSX 上

for f in *.txt; do pandoc "$f" -s -o "${f%.txt}.rtf"; done

在 Windows Powershell 中

gci -r -i *.txt
|foreach{$rtf=$_.directoryname+"\"+$_.basename+".rtf";pandoc -f markdown -s $_.fullname -o $rtf}

我用 pandoc 将文档转换为 ICML(或 OPML 或 RTF),当我尝试打开它时,却提示无效。我做错了什么?

请务必使用 -s--standalone 标志,否则您只会得到一个片段,而不是一个包含所需头部的完整文档。

pandoc -s -f markdown -t icml -o my.icml my.md

当我尝试将包含中文的 Markdown 文档转换为 PDF 时,得到一个空白文档。

默认情况下,pandoc 使用 pdflatex 生成 PDF,而 pdflatex 不支持中文字符。但您可以将默认设置更改为使用 xelatex。您还应该确保使用支持中文的字体。例如

pandoc -o c.pdf --pdf-engine=xelatex -V mainfont='Adobe Ming Std'

Windows 安装程序执行单用户安装,而不是为所有用户安装 pandoc。如何为所有用户安装 pandoc?

以管理员身份运行以下命令

msiexec /i pandoc-VERSION.msi ALLUSERS=1

这会将 pandoc 安装到 C:\Program Files\Pandoc。您可以通过设置 APPLICATIONFOLDER 参数将 Pandoc 安装到不同的目录,例如

msiexec /i pandoc-1.11.1.msi ALLUSERS=1 APPLICATIONFOLDER="C:\Pandoc"

如何更改 PDF 输出中的页边距?

该选项

-V geometry:margin=1in

会将每侧页边距设置为一英寸。如果您不需要统一的页边距,可以这样做

-V geometry:"top=2cm, bottom=1.5cm, left=1cm, right=1cm"

或者

-V geometry:"left=3cm, width=10cm"

有关更多选项,请参阅 LaTeX geometry package 的文档。

pandoc 与 multimarkdown 相比如何?

这里有一个比较两者的 wiki 页面

当我指定图像宽度为 50% 并转换为 LaTeX 时,pandoc 会将高度设置为 textheight,并且纵横比没有保留。如何防止这种情况发生?

例如,如果您转换一个带有 {width="50%"} 的图像,生成的 LaTeX 将是 \includegraphics[width=0.5\textwidth,height=\textheight]

此输出假定 pandoc 默认 LaTeX 模板中包含以下代码

% Scale images if necessary, so that they will not overflow the page
% margins by default, and it is still possible to overwrite the defaults
% using explicit options in \includegraphics[width, height, ...]{}
\setkeys{Gin}{width=\maxwidth,height=\maxheight,keepaspectratio}

如果您的自定义模板中没有此内容,则应添加它。如果我们不以这种方式显式设置 height,则除非图像被缩放到小于其原始大小,否则图像将无法正确调整大小。

Pandoc 有时会占用过多内存。如何限制 pandoc 使用的内存?

pandoc +RTS -M30m -RTS 会将堆内存限制为 30MB。当转换文档所需的内存超过此限制时,将发出内存不足错误。

当将 --include-in-header 与 PDF 或 LaTeX 输出一起使用时,如何引用默认模板中 $header-includes$ 之后出现的 TeX 声明?

由于各种原因,$header-includes$ 不在 LaTeX 导言区的末尾。当您插入的代码依赖于 $header-includes$ 位置之后导言区中的声明时,这会带来问题。例如,您可能想要引用 \author\title 元数据值(在导言区的最底部设置),并在页边距中呈现它们。在这种情况下,您可以将代码包装在 etoolbox\AtEndPreamble 中。此技术在 此 gist 中进行了演示。使用 \AtEndPreamble 时,请将任何 makeatlettermakeatother 放在 \AtEndPreamble 之外,如示例所示。

如何使用 pandoc 将 PDF 转换为其他格式?

您不能。您可以尝试在 Word 或 Google Docs 中打开 PDF,并保存为 pandoc 可以直接转换的格式。

我真的需要安装一个 1 GB 的 TeX 安装包才能使用 pandoc 生成 PDF 吗?

不。您可以使用相对较小的 TeX 安装,例如,从 MacTeX 的 Basic TeX 分发版开始,并使用 tlmgr 工具安装 pandoc 所需的一些包(参见手册)。

或者,您可以通过 HTML 和 wkhtmltopdf,或通过 groff ms 和 pdfroff 生成 PDF。(这些生成的效果不如 TeX 排版好,尤其是在数学方面,但对于许多目的来说可能足够了。)

在 M1 Mac 上转换为 PDF 时,出现“无法分配内存”错误。

我们不确定为什么会发生这种情况,但我们发现完整指定 pdflatex 路径可以避免此错误。例如,

pandoc -o my.pdf --pdf-engine=/Library/TeX/texbin/pdflatex

当我从 ipynb 转换时,有些可视化效果没有显示。

首先,除非您的目标是二进制格式(docx、odt、epub),否则您必须使用 --extract-media 或(仅适用于 HTML)--embed-resources 来使 ipynb 容器中的图像可用于您的输出文件。

其次,一些 Jupyter 扩展,特别是那些使用 JavaScript 进行可视化的扩展,假定存在 require.js。为确保此脚本在您的 HTML 输出中可用,您可以使用

pandoc -s -o output.html input.ipynb \
-V header-includes='<script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.6/require.min.js"></script>'

当我从 LaTeX 转换时,如何使 BibTeX 参考文献正常工作?

使用 --citeproc 选项。如果仍然不起作用,您可能需要使用 --bibliography 告诉 pandoc 您的参考文献文件在哪里。您的参考文献格式可能与您使用 latexbibtex 时的格式不同;您可以通过使用 --csl 指定适当的 CSL 参考文献样式来更改引文格式(参见手册)。

如何使用 pandoc 生成 PDF/A?

最简单的方法是通过 ConTeXt

pandoc --pdf-engine=context -V pdfa

或者,--pdf-engine=pdflatex 可以与元数据中的以下 header-includes 一起使用(或从文件通过 --include-in-header 包含)

\usepackage[a-2u,mathxmp]{pdfx}
\usepackage[pdfa]{hyperref}

或者 --pdf-engine=lualatex 可以与以下内容一起使用

\usepackage{hyperxmp}
\hypersetup{pdfapart=3,pdfaconformance=B}
\immediate\pdfobj stream attr{/N 3} file{sRGB.icc}
\pdfcatalog{/OutputIntents [<<
/Type /OutputIntent /S /GTS_PDFA1
/DestOutputProfile \the\pdflastobj\space 0 R
/OutputConditionIdentifier (sRGB) /Info (sRGB)
>>]}

当任何行的宽度大于 --columns 设置时,Pandoc 会向管道表格添加列宽。如何防止这种情况发生?

将此过滤器保存为 nowidths.lua,然后将 --lua-filter nowidths.lua 作为附加选项传递给 pandoc。(参见 issue 8139。)

-- Unset the width attribute of HTML colspecs in tables
-- See https://github.com/jgm/pandoc/issues/8139
function Table (tbl)
  if PANDOC_VERSION[1] >= 2 and PANDOC_VERSION[2] >= 10 then
    tbl.colspecs = tbl.colspecs:map(function (colspec)
        local align = colspec[1]
        local width = nil  -- default width
        return {align, width}
    end)
  else
    for i, w in ipairs(tbl.widths) do
      tbl.widths[i] = 0
    end
  end
  return tbl
end

如何使用 pandoc 读取旧的 .DOC 格式的 Word 文件?

安装 antiword 并使用它将 doc 文件转换为 DocBook,DocBook 可以被 pandoc 读取。

antiword -x db input.doc | pandoc -f docbook