更新

更新

我正在尝试使用 Pandoc 将 Markdown 文件转换为 PDF 文件。

我的 Markdown 中有很多代码块,如果某行代码太长,它会在 PDF 中被截断。如何让 Pandoc 换行?

这是我现在正在使用的线路:

pandoc input.md --highlight-style tango -o output.pdf;

答案1

(看更新最后得到正确的颜色)

默认情况下,pandoc 使用其自己的高亮引擎,但可以将其更改为使用包listings。只需将--listings选项添加到 pandoc 命令行即可。

但是,列表使用的格式也不会打断长行,但您可以在单独的 tex 文件中准备所有必需的选项,例如:

% Contents of listings-setup.tex
\usepackage{xcolor}

\lstset{
    basicstyle=\ttfamily,
    numbers=left,
    numberstyle=\footnotesize,
    stepnumber=2,
    numbersep=5pt,
    backgroundcolor=\color{black!10},
    showspaces=false,
    showstringspaces=false,
    showtabs=false,
    tabsize=2,
    captionpos=b,
    breaklines=true,
    breakatwhitespace=true,
    breakautoindent=true,
    linewidth=\textwidth
}

然后使用以下行进行编译:

pandoc test.md --listings -H listings-setup.tex -o output.pdf

不幸的是,这个解决方案--highlight-style也不能使用该选项。如果你想要获取 colorscheme tango,你必须自己将其编码为列表包的选项,并将它们包含在上面\lstset

给定文件test.md如下:

% Title
% Author

# First section

Some code with long lines:

```java
public class Test {
    static Set<Thread> updateThreads = new HashSet<Thread>();

    public static void main(String[] args) {
        ConcurrentMap<Integer, String> concurrentMap = new ConcurrentHashMap<Integer, String>();
        for (int i = 0; i < 1000; i++) {
            startUpdateThread(i, concurrentMap);
        }
        for (Map.Entry<Integer, String> entry : concurrentMap.entrySet()) {
            System.out.println("Key :" + entry.getKey() + " Value:" + entry.getValue());
        }
        for (Thread thread : updateThreads) {
            thread.interrupt();
        }
    }
}
```

That's it.

前面pandoc命令行生成的结果是:

输出

更新

为了紧密模拟使用--highlight-style tango选项(没有listings包)获得的结果,我运行了 pandoc 请求中间.tex文件来发现该情况下颜色是如何定义的。

我使用选项编写了以下设置listings,这些选项使用相同的颜色(仅在适用的情况下,例如,listings没有为数字常量或其他语法元素设置特定颜色的意思)。此外,我减少了字符之间的间距,默认设置下字符之间的间距太大。这是新的设置:

% Contents of listings-setup.tex
\usepackage{xcolor}

\lstset{
    basicstyle=\ttfamily,
    numbers=left,
    keywordstyle=\color[rgb]{0.13,0.29,0.53}\bfseries,
    stringstyle=\color[rgb]{0.31,0.60,0.02},
    commentstyle=\color[rgb]{0.56,0.35,0.01}\itshape,
    numberstyle=\footnotesize,
    stepnumber=1,
    numbersep=5pt,
    backgroundcolor=\color[RGB]{248,248,248},
    showspaces=false,
    showstringspaces=false,
    showtabs=false,
    tabsize=2,
    captionpos=b,
    breaklines=true,
    breakatwhitespace=true,
    breakautoindent=true,
    escapeinside={\%*}{*)},
    linewidth=\textwidth,
    basewidth=0.5em,
}

使用这些设置,即pandoc使用选项运行:

pandoc test.md --listings -H listings-setup.tex -o output.pdf

得到以下结果:

带列表的结果

--listings作为参考,将其与没有使用但使用以下方法的结果进行比较--highlight-syntax tango

无列表

如您所见,样式非常接近(数字常量除外,使用 时为蓝色tango,使用 时为黑色listings)。还请注意行是如何用 换行的listings。我还添加了行号,以引用原始行(换行之前)。

答案2

有一个非常简单的解决方案,使用额外, 最近由 jannick0 推荐

修改您的YAML 标头选项包括

\usepackage{fvextra}
\DefineVerbatimEnvironment{Highlighting}{Verbatim}{breaklines,commandchars=\\\{\}}

并用xelatex进行编译。

例如,

---
header-includes:
 - \usepackage{fvextra}
 - \DefineVerbatimEnvironment{Highlighting}{Verbatim}{breaklines,commandchars=\\\{\}}
---

~~~~~{.java}
this is a very long long long long long long long long long long long long long line which is broken
~~~~~~

当编译时

pandoc input.md -o output.pdf

给出在此处输入图片描述

答案3

不需要 listing-setup.tex 即可实现此功能。

只需将其添加到您的 YAML-Header 中:

header-includes:
    - \usepackage{xcolor}
    - \lstset{breaklines=true}
    - \lstset{language=[Motorola68k]Assembler}
    - \lstset{basicstyle=\small\ttfamily}
    - \lstset{extendedchars=true}
    - \lstset{tabsize=2}
    - \lstset{columns=fixed}
    - \lstset{showstringspaces=false}
    - \lstset{frame=trbl}
    - \lstset{frameround=tttt}
    - \lstset{framesep=4pt}
    - \lstset{numbers=left}
    - \lstset{numberstyle=\tiny\ttfamily}
    - \lstset{postbreak=\raisebox{0ex}[0ex][0ex]{\ensuremath{\color{red}\hookrightarrow\space}}}

并使用 进行编译--listings。如果出现编译错误,请尝试添加--pdf-engine=xelatex--pdf-engine=lualatex

答案4

如果你仅有的想要添加换行符和不修改其余默认代码块布局, 您可以使用hda 的方法在简化版本中,并进行了修改以保持原始字体间距,这要归功于减少列表中的 monotype 字母间距

TL;DR:将其添加到您的 .md 文件顶部:

---
header-includes:
    - \lstset{basicstyle=\small\ttfamily, basewidth=0.5em}
    - \lstset{breaklines=true}
---

并使用以下命令进行编译:

pandoc test.md -o test.pdf --listings

相关内容