Pandoc 多Markdown转单PDF

news2024/11/20 0:44:56

文章目录

    • Pandoc 简介
    • Pandoc 安装
    • pandoc-latex-template
    • 字体安装
    • Powershell 脚本
    • Ubuntu Pandoc
    • Markdown 合并

Pandoc 简介

Pandoc, 免费的文档转换器, 支持常见的各种文件格式的相互转换, 如Markdown, HTML, EPUB, LaTeX, docx, RTF, PDF 等.

本篇以Windows下的多Markdown转单PDF为例, 最后也会介绍Ubuntu下的使用方法.

Pandoc 安装

Windows下的安装:

  • Pandoc: 直接到 Installing pandoc 下载安装.
  • MiKTeX: 直接到 Getting MiKTeX 下载安装, Pandoc默认使用 LaTeX 创建PDF, Windows上安装MiKTeX就包含了LaTeX. 安装完后, 打开 MiKTeX Console 检查MiKTeX及宏包的更新(第一次运行Pandoc转出PDF时, 可能会提示安装缺失的宏包)

安装完后, 检查和添加Pandoc和MiKTeX的环境变量

在这里插入图片描述

环境变量添加完, 首次需要在Powershell中刷新下环境, 让Powershell能找到MiKTeX一堆宏包exe文件的路径

$env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path","User") 

pandoc-latex-template

如果用默认参数, pandoc xxx.md --pdf-engine=xelatex -o yyy.pdf 生成PDF, 会发现各种小问题, 如代码块未和正文明显区分, 代码块中的单行过长会超出文档边界等.

类似PPT套模版, Pandoc生成好看的PDF也需要一套好用的模版, 如这个star数超多的 pandoc-latex-template, 即大名鼎鼎的eisvogel.

下载最新的pandoc-latex-template的 Releases 压缩包, 解压后, 把 eisvogel.latex 文件放入 C:\Users\<Your-Username>\AppData\Roaming\pandoc\templates\ 目录下即可(没有就自己新建目录).

Readme和examples中也介绍了很多eisvogel可以调的参数, 如命令行中让代码块不显示行号 -V listings-disable-line-numbers=true 等.

字体安装

Pandoc默认参数不支持中文, 需要指定中文字体才可以, Powershell 中查看支持的中文字体:

fc-list :lang=zh

最好是安装一些商用免费的. 如 得意黑?, 华为的鸿蒙字体HarmonyOS Sans?, 小米的MiSans? 等

下面的脚本以 阿里巴巴普惠体 和 微软cascadia-code 字体为例, 下载压缩包解压后, 双击ttf文件即可在Windows上安装. 这两种字体的数字’1, 小写l和大写I是可以分清楚的, 数字0 和大写O也能分清.

Powershell 脚本

现在有以下一些文件

> wsl tree -L 2                                  
.
├── 2022
│   ├── docker.assets	# .assets文件夹里面是md文件对应的图片
│   ├── docker.md
│   ├── wsl2.assets
│   └── wsl2.md
├── 2023
│   ├── rusterr.md
│   ├── test0.assets
│   ├── test0.md
│   ├── zellij.assets
│   └── zellij.md
├── cover.md
├── logo.png
└── md2pdf.ps1

文件 cover.md 是手写的封面文件, 主要是设置主标题, 副标题, 作者, 日期, logo, 颜色等

---
title: "Markdown Notes"
subtitle: "Write in TyporalI"
author: [Karoto]
date: "2023-01-12"
keywords: [Markdown, PDF]
---

把所有的.md文件转出成一个PDF文件, 下面是一个尚可能用的脚本, 仅供参考, md2pdf.ps1

# Recursive search for all .md files in the current directory and subdirectories
$mdfiles = Get-ChildItem -Path . -Recurse -Filter *.md
# Recursive search for all .assets folders in the current directory and subdirectories
$assets = Get-ChildItem -Path . -Recurse -Filter *.assets
# copy all .md files and .assets folders to new directory
New-Item -ItemType Directory -Path ./temp
$mdfiles | Copy-Item -Destination ./temp -Recurse
$assets | Copy-Item -Destination ./temp -Recurse
# change directory to new directory
Set-Location ./temp
# Recursive search for all .md files in the current directory and subdirectories
$mdfiles = Get-ChildItem -Path . -Recurse -Filter *.md
# print $mdfiles
$mdfiles | ForEach-Object {Write-Host $_.FullName}

# PDF Name
$pdffile = "../notes.pdf"

# Convert .md files to .pdf
pandoc $mdfiles -o $pdffile --from markdown --template eisvogel  --listings `
    --pdf-engine=xelatex `
    -V mainfont='Alibaba PuHuiTi' `
    -V sansfont='Alibaba PuHuiTi' `
    -V monofont='Cascadia Mono' `
    -V CJKmainfont='Alibaba PuHuiTi' `
    -V CJKsansfont='Alibaba PuHuiTi' `
    -V CJKmonofont='Cascadia Mono' `
    --toc `
    -V toc-own-page=true `
    -V toc-title="Content" `
    -V toc-color=NavyBlue `
    --number-sections `
    -V colorlinks=true `
    -V linkcolor=blue `
    -V urlcolor=blue `
    -V code-block-font-size=\scriptsize `
    -V titlepage=true `
    -V titlepage-color="FFFFFF" `
    -V titlepage-rule-color="FFFFFF" `
    -V titlepage-text-color="000000" `
    -V titlepage-logo="../logo.png" `
    -V logo-width=20mm `

# change directory back to original directory
Set-Location ..
# remove temp directory
Remove-Item -Path ./temp -Recurse

说明:

  • 脚本中把所有的md文件和assets文件夹复制到临时文件夹temp, 这里没有对重名文件处理, 如果有, 可能的结果是覆盖
  • 进入temp文件夹, 运行pandoc命令生成了pdf文件
  • 最后是退出temp文件夹并删除temp
  • --template eisvogel 使用了 模版 eisvogel
  • -V, --variable 变量
  • 正文, 封面和目录字体使用 阿里巴巴普惠体 Alibaba PuHuiTi, 代码英文字体是 Cascadia Mono
  • CJK的意思是Chinese, Japanese和Korean, 代表中日韩文字
  • --toc 自动添加目录, toc-title="Content" 这个写成 toc-title="目录" 会报错, 还不知道怎么解决
  • --number-sections 自动添加章节编号 1, 1.1, 2.1 这种, 不用自己在Markdown中手写编号, 章节的顺序是 $mdfiles 这个string list里面按照拼音升序的顺序, 如果想改变章节顺序, 可以手动编号或直接手写 $mdfiles 变量列表
  • 颜色方面, toc-color=NavyBlue设置了目录是深蓝色字体, titlepage-text-color="000000"设置封面黑色字体, linkcolor=blue 和 urlcolor=blue 设置链接是蓝色字体
  • 代码块的字体比正文小了些: code-block-font-size=\scriptsize, 可以设置为 \tiny, \scriptsize, \footnotesize, \small, \normalsize, \large, \Large, \LARGE, \huge and \Huge
  • 有行号的代码块复制的时候会连行号一块复制, 可以设置不显示行号 -V listings-disable-line-numbers=true
  • titlepage-logo="../logo.png"logo-width=20mm 指定了封面logo的目录和大小, 其实也可以直接写到封面的md文件里面

下面就看一下powershell脚本运行后, 生成的 notes.pdf 文件的效果

封面的标题, 副标题, 作者, logo 和日期:

在这里插入图片描述

自动编号的目录和页眉

在这里插入图片描述

页脚

在这里插入图片描述

正文图片, 链接颜色:

在这里插入图片描述

代码高亮, 行号, 单行的自动换行:

在这里插入图片描述

整体效果还算不错, 更好的封面效果可以参阅 title-page-custom

Ubuntu Pandoc

在 Ubuntu20 测试, 一直报 ! LaTeX Error: File scrartcl.cls’ not found.` 还不知道怎么解决, Ubuntu18没有这个问题, 所以暂时推荐在Ubuntu18上来测试.

Pandoc和texlive安装

#!/bin/bash
# https://pandoc.org/installing.html#linux
# https://github.com/jgm/pandoc/releases
wget https://github.com/jgm/pandoc/releases/download/2.19.2/pandoc-2.19.2-1-amd64.deb
sudo dpkg -i pandoc-2.19.2-1-amd64.deb
pandoc --version
sudo apt install -y texlive texlive-xetex texlive-latex-recommended

阿里巴巴普惠体和Cascadia Code字体安装

# fonts, Alibaba-PuHuiTi
# https://www.zitijia.com/i/250417369808129081.html
# 下载解压
sudo mkdir -p /usr/share/fonts/Alibaba-PuHuiTi
sudo cp -r Alibaba-PuHuiTi/* /usr/share/fonts/Alibaba-PuHuiTi
sudo fc-cache -fv
fc-list :lang=zh | grep Alibaba

# fonts, Cascadia Code
# https://github.com/microsoft/cascadia-code/releases
wget https://github.com/microsoft/cascadia-code/releases/download/v2111.01/CascadiaCode-2111.01.zip
unzip CascadiaCode-2111.01.zip
sudo mkdir -p /usr/share/fonts/Cascadia-Code
sudo cp -r ttf/* /usr/share/fonts/Cascadia-Code
sudo fc-cache -fv
fc-list | grep Cascadia

Eisvogel模版安装

# Eisvogel
# https://github.com/Wandmalfarbe/pandoc-latex-template/releases
mkdir -p eisvogel && cd eisvogel
wget https://github.com/Wandmalfarbe/pandoc-latex-template/releases/download/v2.1.0/Eisvogel-2.1.0.tar.gz
tar -xvf Eisvogel-2.1.0.tar.gz
mkdir -p ~/.pandoc/templates
cp eisvogel.latex ~/.pandoc/templates
cd ..

下面是Ubuntu的脚本 md2pdf.sh

#!/bin/bash

# if tmp exists, delete it
if [ -d "tmp" ]; then
    rm -rf tmp
fi
mkdir -p tmp

# Recursive search for all .md files in the current directory and subdirectories
md_files=$(find . -type f -name "*.md")
# Recursive search for all .assets folders in the current directory and subdirectories
assets_folders=$(find . -type d -name "*.assets")
# copy all .assets folders and .md files to the temp directory
cp -r $md_files $assets_folders tmp
cd tmp
# Recursive search for all .md files in the current directory and subdirectories
md_files=$(find . -type f -name "*.md")
echo $md_files
# PDF Name
pdf_name="../notes.pdf"

# Convert all .md files to .pdf
pandoc -o $pdf_name $md_files \
    --from markdown \
    --template eisvogel \
    --pdf-engine=xelatex --listings \
    --toc --number-sections \
    -V mainfont="Alibaba PuHuiTi" \
    -V sansfont="Alibaba PuHuiTi" \
    -V monofont="Cascadia Code" \
    -V CJKmainfont="Alibaba PuHuiTi" \
    -V CJKsansfont="Alibaba PuHuiTi" \
    -V CJKmonofont="Cascadia Code" \
    -V colorlinks=true \
    -V urlcolor=blue \
    -V linkcolor=blue \
    -V toc-color=NavyBlue \
    -V titlepage=true \
    -V titlepage-color="FFFFFF" \
    -V titlepage-rule-color="FFFFFF" \
    -V titlepage-text-color="000000" \
    -V titlepage-logo="../logo.png" \
    -V logo-width=20mm 
    

说明:

  • 仍然是把所有的md文件和assets文件夹拷贝到tmp文件夹
  • 去掉了 code-block-font-size=\scriptsize, 这么写有问题, 代码块前会有scriptsize字符, 改成code-block-font-size=\\scriptsize 有一个图片的位置变了, 索性删去了
  • 导出的PDF文档效果和Windows上基本一致

Markdown 合并

其实可以直接把多个Markdown合并成一个md文件, 图片都是相对路径, 把图片的assets文件夹和合并后的md文件放一个目录, 然后用Typora打开md文件, 导出PDF即可, 下面给出一个合并的脚本

#!/bin/bash

# if tmp exists, delete it
if [ -d "tmp" ]; then
    rm -rf tmp
fi
mkdir -p tmp

# Recursive search for all .md files in the current directory and subdirectories
md_files=$(find . -type f -name "*.md")
# Recursive search for all .assets folders in the current directory and subdirectories
assets_folders=$(find . -type d -name "*.assets")
# copy all .assets folders and .md files to the temp directory
cp -r $md_files $assets_folders tmp
cd tmp
# Recursive search for all .md files in the current directory and subdirectories
md_files=$(find . -type f -name "*.md")
echo $md_files
# all .md files into one file
echo "# Contents
@[toc]
" > all.md
cat $md_files >> all.md

欢迎关注微信公众号
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/159501.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

个性化脑机接口及应用

脑机接口&#xff08;BCI&#xff09;是一种变革传统人机交互的新型技术&#xff0c;用户的大脑是直接的控制信号源。在BCI转化为实际应用时&#xff0c;由于用户个体之间的感觉、知觉、表象与认知思维活动、脑结构与功能具有一定的差异&#xff0c;通用BCI难以满足不同个体的需…

国产linux操作系统——麒麟操作系统的来龙去脉(有下载地址,亲测可用)

文章目录1、linux操作系统2、国产操作系统3、麒麟操作系统4、引用1、linux操作系统 目前市场主流的linux操作系统分类大致如此&#xff0c;国产操作系统的麒麟操作系统&#xff0c;底层比较杂&#xff0c;所以单独一类。 2、国产操作系统 排名日期截止到2022.6。 这里提一下排…

基于java SSM的房屋租赁系统设计和实现

基于java SSM的房屋租赁系统设计和实现 博主介绍&#xff1a;5年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java毕设项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留言 文末获取源码联系方式 文…

ASO优化的两个渠道之推广+老用户维系

要想自己的APP在应用商城里获得较高的排名&#xff0c;提高用户的下载量&#xff0c;就要通过ASO优化来辅助完成。 &#xff08;一&#xff09;&#xff0c;ASO优化的排名因素——元数据的优化&#xff1a;1&#xff0c;icon图标。图片要直观和清晰地突出APP的内容&#xff0c…

力扣刷题记录——434. 字符串中的单词数、448. 找到所有数组中消失的数字、455. 分发饼干

本专栏主要记录力扣的刷题记录&#xff0c;备战蓝桥杯&#xff0c;供复盘和优化算法使用&#xff0c;也希望给大家带来帮助&#xff0c;博主是算法小白&#xff0c;希望各位大佬不要见笑&#xff0c;今天要分享的是——《434. 字符串中的单词数、448. 找到所有数组中消失的数字…

Google colab-思腾云

文章目录Google colab具体操作过程问题1问题2AutoDL问题1 无卡开机思腾云使用基础信息如何租用服务器&#xff1f;如何上传代码以及运行程序&#xff1f;操作服务器的方式&#xff1f;pycharm方式Xshell的形式问题1 libSM.so.6 和 libXrender.so.1问题2&#xff1a;运行代码出现…

Dubbo概述-快速入门

Dubbo概念 ●Dubbo是阿里巴巴公司开源的一个高性能、轻量级的Java RPC框架。 ●致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。 ●官网: http://ubbo.apache.orgo 节点角色说明: . ●Provider: 暴露服务的服务提供方 ●Contahier: 服务运行容器 ●Co…

YOLOv3论文精读: An Incremental Improvement-增量式的改进

Abstract 我们对 YOLO 进行了一系列更新&#xff01;它包含一堆小设计&#xff0c;可以使系统的性能得到更新。我们也训练了一个新的、比较大的神经网络。虽然比上一版更大一些&#xff0c;但是精度也提高了。不用担心&#xff0c;它的速度依然很快。YOLOv3 在 320320 输入图像…

【Django项目开发】部门管理模块的开发(九)

文章目录一、模型类设计二、视图设计1.都有哪些接口三、序列化器类设计四.分页操作1.utils工具中定义pagination.py2.视图类中使用五.路由配置一、模型类设计 一个部门下面可能会有很多子部门&#xff0c;一个子部门上面可能会有父部门&#xff1b;即部门内部之间进行关联&…

Grapecity DataViewsJS JavaScript Crack

Grapecity DataViewsJS一个完整的 React 数据展示和数据网格平台 通过从各种不同的演示视图中进行选择&#xff0c;包括树、卡片、砖石、网格、时间线、甘特图、日历和网格&#xff0c;超越传统的表格显示。采集 by Ω578867473 免费无限开发者许可&#xff01;只为部署付费 快…

Hexo博客搭建(简化版)

Hexo博客搭建&#xff08;简化版&#xff09; 一、环境搭建 1.1 Git Git官网-下载界面 > git --version1.2 Node.js 1.2.1 下载安装Node.js Node.js官网下载界面 > node --version1.2.2 Hexo与Node.js Hexo versionMinimum (Node.js version)Less than (Node.js …

2023年我花费数小时整理的Java常用类文档,建议收藏学习

推荐学习专栏&#xff1a;【Java 编程基础教程系列】&#xff0c;从入门到就业精通&#xff0c;买不了吃亏&#xff0c;买不了上当&#xff01;&#xff01; 文章目录1. 基本类型的包装类1.1 概念1.2 常用的属性1.3 常用的方法1.4 自动装箱和自动拆箱2. 字符串类2.1 String 类2…

二分模板:查找数的范围、数的三次方根

内容摘自ACWING&#xff0c;一个很好的算法学习平台。 二分模板 判断左边界 当q[mid]>x时&#xff0c;待查找元素只会在mid左边&#xff0c;令rmid。 while( l < r ) {mid l r >> 1;if(q[mid] > x) r mid;else l mid 1; }判断右边界 当q[mid]<x&…

Spring项目中自动打印执行SQL和耗时,这款神级插件你值得拥有

这里写自定义目录标题参考简介集成方式如何使用步骤一&#xff0c;引入P6Spy。步骤二&#xff0c;修改数据源的配置。步骤三&#xff0c;新建spy.properties文件&#xff0c;放在resources目录下。步骤四&#xff0c;新建一个类实现MessageFormattingStrategy&#xff0c;并重写…

spring cache @Cacheable的使用

Cacheable的使用1.Cacheable1.1 cacheNames value1.2 关联多个缓存名1.3 key 和 keygenerator1.4 CacheManager CacheResolver1.5 sync1.6 condition1.7 unless2.CachePut 放置缓存3.CacheEvict 删除缓存4.测试代码5.默认缓存和redis缓存6.过程中的问题1.Cacheable 注解在方法…

剩余系,欧拉定理,扩展欧拉定理

剩余类&#xff08;同余类&#xff09; 给定一个正整数n&#xff0c;以 r ∈[0, n -1]表示所有形如的整数组成的集合称为模n的剩余类。例n 5,r 3,则C3 5x &#xff0b;3为模5的一个剩余类。 完全剩余系&#xff08;完系&#xff09; 给定一个正整数n&#xff0c;在模n的剩…

kafka生产者API

生产者工作流程 首先生产者调用send方法发送消息后&#xff0c;会先经过拦截器&#xff0c;接着进入序列化器。序列化器主要用于对消息的Key和Value进行序列化。接着进入分区器选择消息的分区。 上面这几步完成之后&#xff0c;消息会进入到一个名为RecordAccumulator的缓冲队…

javaWeb servlet

使用案例&#xff1a; <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency> 导了包之…

五指山[《信息学奥赛一本通》](扩展欧几里得算法)

题目如下&#xff1a; 题解 or 思路 我们可以将题目 抽象 成数学模型 xkd≡y(modn)x kd \equiv y\ (mod\ n)xkd≡y (mod n) xkdya∗nx kd y a * nxkdya∗n k∗d−a∗ny−xk*d - a*n y - xk∗d−a∗ny−x 式子 在这里 kkk, aaa 是变量&#xff0c;其余是常数 我们可以扩展…

Java 快速开发几 MB 独立 EXE,写图形界面很方便

Java 写的桌面软件带上运行时只有 6 MB&#xff0c;而且还是独立 EXE 文 件&#xff0c;是不是难以置信&#xff1f; 想一想 Electron 没写多少功能就可能超过百 MB 的体积&#xff0c;Java 写的桌面软件算不算得上小、轻、快呢&#xff1f; aardio 可以支持很多编程语言&…