我正在尝试使用 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