使用 Pandoc 来转换 Markdown 为漂亮的 PDF 格式

2024-08-25 07:08

本文主要是介绍使用 Pandoc 来转换 Markdown 为漂亮的 PDF 格式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

安装好 Pandoc

详细可以参考 Pandoc - Installing pandoc。

官网上给出的简单的不修改格式的将 Markdown 转换为 PDF 命令如下:

pandoc -f markdown -t html -o index.pdf

或者通过官方提供的 Docker 镜像来免于安装的环境的烦恼。

docker run --rm -v "$(pwd):/data" pandoc/latex -f markdown -t html -o index.pdf

为了简化,后续的流程在镜像中进行 alias pandoc='docker run --rm -v "$(pwd):/data" pandoc/latex'

自定义样式

参考 Converting Markdown to Beautiful PDF with Pandoc - jdhao’s blog 增加一些自定义的配置之后。

由于 Pandoc 官方提供的 pandoc/latex 镜像有些 latex 包不完整,所以在其基础上,增加了一些 Latex 安装包,制作出新的镜像 5200710/pandoc-latex:latest。

FROM pandoc/latex
RUN tlmgr install quoting || exit 1
  1. 指定中文字体

由于默认的 latex 镜像中不包含中文字体,需要自己手动安装和选择。

fc-list :lang=zh

从列表中找到自己的所选择的字体类型。或者从相关的 fonts 的网站中找到相关的字体文件。

pandoc --latex-engine=xelatex -V mainfont='WenQuanYi Micro Hei' test.md -o test.pdf
  1. 更改 PDF 的 margin
pandoc --pdf-engine=xelatex -V geometry:"top=2cm, bottom=1.5cm, left=2cm,
right=2cm" -o test.pdf test.md
  1. inline code 增加背景色
% change background color for inline code in
% markdown files. The following code does not work well for
% long text as the text will exceed the page boundary
\definecolor{bgcolor}{HTML}{E0E0E0}
\let\oldtexttt\texttt\renewcommand{\texttt}[1]{\colorbox{bgcolor}{\oldtexttt{#1}}
}	

输出文件

构建好之后运行如下的命令:

docker run --rm -v "$(pwd):/data" -v "$HOME/fonts":"/usr/share/fonts" \5200710/pandoc-latex:latest \-f markdown /data/Spark\ 学习记录.md --pdf-engine=xelatex --toc \--highlight-style tango \-V colorlinks -V urlcolor=NavyBlue -V toccolor=NavyBlue \-H head.tex \-V 'mainfont:PingFang SC' -s -o index.pdf

我们来逐步的解释下上面的命令

  1. Docker 命令细节不做过多解释,其中 -v "$HOME/fonts":"/usr/share/fonts" 挂在了本地的 PingFang SC 字体到容器中,用于能够指定对应的字体;
  2. -f markdown 表明输入的文件格式;
  3. --pdf-engine=xelatex 表示采用的 PDF 渲染引擎;
  4. --highlight-style tango 表明采用了那种代码高亮的模板。因为是 PDF 所以才用了只有一点灰度的底色方案;
  5. -V colorlinks -V urlcolor=NavyBlue -V toccolor=NavyBlue 等表明一些链接的配置,默认是没有颜色;
  6. -H head.tex 可以把一些复杂的配置,写到 head.tex 文件中,然后应用。

这里给出一份 head.tex 参考方案。

\usepackage[top=2cm, bottom=1.5cm, left=2cm, right=2cm]{geometry}
% change background color for inline code in
% markdown files. The following code does not work well for
% long text as the text will exceed the page boundary
\definecolor{bgcolor}{HTML}{E0E0E0}
\let\oldtexttt\texttt\renewcommand{\texttt}[1]{\colorbox{bgcolor}{\oldtexttt{#1}}
}% Change the default style of block quote\usepackage{framed}
\usepackage{quoting}\definecolor{bgcolor}{HTML}{DADADA}
\colorlet{shadecolor}{bgcolor}
% define a new environment shadedquotation. You can change leftmargin and
% rightmargin as you wish.
\newenvironment{shadedquotation}
{\begin{shaded*}\quoting[leftmargin=1em, rightmargin=0pt, vskip=0pt, font=itshape]}{\endquoting
\end{shaded*}
}%
\def\quote{\shadedquotation}
\def\endquote{\endshadedquotation}

更多的 latex 变量参考链接 Pandoc - Pandoc User’s Guide。

效果

实际渲染的效果还是不错的,渲染后的 PDF 文件如下。 在这里插入图片描述

错误

错误1: LaTex 提示找不到相关的依赖包

Error producing PDF.
! LaTeX Error: File `quoting.sty' not found.Type X to quit or <RETURN> to proceed,
or enter new name. (Default extension: sty)Enter file name: 
! Emergency stop.
<read *> 

提示缺少相关的 quoting

  1. 自动安装,利用 latex 的 Package 管理工具来安装。简单高效

    tlmgr install quoting
    
  2. 手动安装

    1. 前往 CTAN 官网搜素对应的安装包

    2. 下载 安装包之后解压

    3. 进入解压目录下,利用latex命令, 将 .inc.dtx 后缀文件编译为 .sty 文件。

      latex quoting.ins
      
    4. 利用 kpsewhich -var-value TEXMFLOCAL 命令查找系统安装包的路径

      ➜  ~ kpsewhich -var-value TEXMFLOCAL
      /usr/local/texlive/2021basic/texmf-local
      
    5. 将前面的生成的 quoting.dtx 文件,复制到系统安装包的同级 texmf-dist 路径上,如: /usr/local/texlive/2021basic/texmf-dist/tex/latex/quoting 目录下。

    6. 运行 mktexlsr 刷新新增包的状态。一定要运行,否则手动安装的包不生效

错误2: LaTex 提示找不到相关的字体

在转换为PDF的时候,如果输入的是中文,默认不支持,需要手动的指定fonts。

➜  ~ fc-list :lang=zh | grep PingFang
/System/Library/Fonts/PingFang.ttc: PingFang TC,蘋方\-繁,苹方\-繁:style=Regular,標準體,常规体
/System/Library/Fonts/PingFang.ttc: PingFang SC,蘋方\-簡,苹方\-简:style=Regular,標準體,常规体

可以查看系统中安装了哪些中文字体。比如:我系统安装了 PingFang SC 的字体。

错误3:转换 HTML 格式为PDF 的时候可能会导致右边边界中文字符越界

可能的原因是在于,xelatex 默认是英文断行,会导致换行有些问题,需要在 head.tex显示的应用中文断行规则。在xelatex的配置导言区中添加如下指令。

\XeTeXlinebreaklocale "zh"
\XeTeXlinebreakskip = 0pt plus 1pt minus 0.1pt
\usepackage[top=2cm, bottom=1.5cm, left=2cm, right=2cm]{geometry}
...

参考

  1. installing - How do I install an individual package on a Linux system? - TeX - LaTeX Stack Exchange

这篇关于使用 Pandoc 来转换 Markdown 为漂亮的 PDF 格式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1104887

相关文章

深入理解Go语言中二维切片的使用

《深入理解Go语言中二维切片的使用》本文深入讲解了Go语言中二维切片的概念与应用,用于表示矩阵、表格等二维数据结构,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧... 目录引言二维切片的基本概念定义创建二维切片二维切片的操作访问元素修改元素遍历二维切片二维切片的动态调整追加行动态

prometheus如何使用pushgateway监控网路丢包

《prometheus如何使用pushgateway监控网路丢包》:本文主要介绍prometheus如何使用pushgateway监控网路丢包问题,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录监控网路丢包脚本数据图表总结监控网路丢包脚本[root@gtcq-gt-monitor-prome

Python通用唯一标识符模块uuid使用案例详解

《Python通用唯一标识符模块uuid使用案例详解》Pythonuuid模块用于生成128位全局唯一标识符,支持UUID1-5版本,适用于分布式系统、数据库主键等场景,需注意隐私、碰撞概率及存储优... 目录简介核心功能1. UUID版本2. UUID属性3. 命名空间使用场景1. 生成唯一标识符2. 数

SpringBoot中如何使用Assert进行断言校验

《SpringBoot中如何使用Assert进行断言校验》Java提供了内置的assert机制,而Spring框架也提供了更强大的Assert工具类来帮助开发者进行参数校验和状态检查,下... 目录前言一、Java 原生assert简介1.1 使用方式1.2 示例代码1.3 优缺点分析二、Spring Fr

Android kotlin中 Channel 和 Flow 的区别和选择使用场景分析

《Androidkotlin中Channel和Flow的区别和选择使用场景分析》Kotlin协程中,Flow是冷数据流,按需触发,适合响应式数据处理;Channel是热数据流,持续发送,支持... 目录一、基本概念界定FlowChannel二、核心特性对比数据生产触发条件生产与消费的关系背压处理机制生命周期

java使用protobuf-maven-plugin的插件编译proto文件详解

《java使用protobuf-maven-plugin的插件编译proto文件详解》:本文主要介绍java使用protobuf-maven-plugin的插件编译proto文件,具有很好的参考价... 目录protobuf文件作为数据传输和存储的协议主要介绍在Java使用maven编译proto文件的插件

SpringBoot线程池配置使用示例详解

《SpringBoot线程池配置使用示例详解》SpringBoot集成@Async注解,支持线程池参数配置(核心数、队列容量、拒绝策略等)及生命周期管理,结合监控与任务装饰器,提升异步处理效率与系统... 目录一、核心特性二、添加依赖三、参数详解四、配置线程池五、应用实践代码说明拒绝策略(Rejected

C++ Log4cpp跨平台日志库的使用小结

《C++Log4cpp跨平台日志库的使用小结》Log4cpp是c++类库,本文详细介绍了C++日志库log4cpp的使用方法,及设置日志输出格式和优先级,具有一定的参考价值,感兴趣的可以了解一下... 目录一、介绍1. log4cpp的日志方式2.设置日志输出的格式3. 设置日志的输出优先级二、Window

Ubuntu如何分配​​未使用的空间

《Ubuntu如何分配​​未使用的空间》Ubuntu磁盘空间不足,实际未分配空间8.2G因LVM卷组名称格式差异(双破折号误写)导致无法扩展,确认正确卷组名后,使用lvextend和resize2fs... 目录1:原因2:操作3:报错5:解决问题:确认卷组名称​6:再次操作7:验证扩展是否成功8:问题已解

Qt使用QSqlDatabase连接MySQL实现增删改查功能

《Qt使用QSqlDatabase连接MySQL实现增删改查功能》这篇文章主要为大家详细介绍了Qt如何使用QSqlDatabase连接MySQL实现增删改查功能,文中的示例代码讲解详细,感兴趣的小伙伴... 目录一、创建数据表二、连接mysql数据库三、封装成一个完整的轻量级 ORM 风格类3.1 表结构