如何用markdown生成带目录、页眉、页脚的pdf?
TODO List
- [OK] 实现基础的md转pdf的shell脚本
- 将md转pdf封装成云服务,为整个安纳斯联盟提供
相关的转化方式
- markdown => html => pdf
- 选择/推荐
- markdown => latex => pdf
pandoc+Latex模板
latex基础
推荐字体
## 建议用于标题的字体
-V mainfont="思源黑体 CN"
pacman -S adobe-source-han-sans-cn-fonts
## 建议用与特殊段落的字体
-V mainfont="AR PL New Kai"
pacman -S opendesktop-fonts
常用脚本
## 简单版
pandoc --latex-engine=xelatex README.md -o read.pdf -V mainfont="思源黑体 CN" --highlight-style pygments
## 带段落与头部
pandoc -N --template=mytemplate.tex --variable mainfont="Palatino" --variable sansfont="Century Gothic" --variable monofont="Consolas" --variable fontsize=12pt --variable version=1.15.2 README.md --latex-engine=xelatex --toc -o readexam.pdf --highlight-style pygments
## 字体变量可省略
pandoc -N --template=mytemplate.tex --variable fontsize=12pt --variable version=1.15.2 README.md --latex-engine=xelatex --toc -o readexam.pdf --highlight-style pygments -V mainfont=""
代码高亮
推荐样式: - pygments
--highlight-style kate
--highlight-style pygments
--highlight-style kate
--highlight-style monochrome
--highlight-style espresso
--highlight-style haddock
--highlight-style tango
--highlight-style zenburn
常见错误
# 报错:缺少latex文件
! LaTeX Error: File etoolbox.sty not found.
apt-get install texlive-latex-extra
pacman -S texlive-latexextra
# 报错:中文不显示错误
pandoc --latex-engine=xelatex README.md -o read.pdf -V mainfont="SimSun"
## 报错 缺少字体
fontspec error: "font-not-found"
## 查看当前系统字体
fc-list
## 列出所有能被 xetex 使用的字体
fc-list :outline -f "%{family}\n" | sort -u
## 推荐字体
"文泉驿微米黑"
图片分页问题
圖片唯一的問題是,pandoc有時會將表格放在錯誤的位置。因為某些圖片過高,所以pandoc會把他們插入到一個新的空白頁,然後將後面的內容直接查到表格前面,這樣很容易產生錯位。有兩個解決辦法,一是,轉換到latex後,手動修改圖片位置,當然這個比較痛苦;二是在圖片後面加入一個latex的分頁比較\pagebreak,讓後面的內容自動寫到新的一頁上,儘管這樣比較廢紙。
手动调整
LaTeX:figureSeries宏包让figure浮动环境支持自动换页
http://bbs.pinggu.org/thread-4487763-1-1.html
通常,我们在写论文插图的时候,都会使用到浮动环境figure,如果插图很多,比如十几个子图构成的图,往往非常麻烦,因为本身浮动环境是无法自动换页的,下面这一宏包可以让浮动环境也可以自动换页了,作者也给出了在IEEE模板里使用的实际样例,有兴趣的用户可以下载试用下。
选自:https://github.com/thomasWeise/figureSeries
atom编辑器latex常用插件
- language-latex
html+css(尝试中)
pandoc READEME.md -f markdown -t html >> temp.html
echo >> "</body></html>"
md转pdf脚本实现
#!/bin/sh
message1="请输入正确格式,如:./genpdf.sh <srcfile> <buildname>"
message2="例如文件:./genpdf.sh README.md readme"
message3="例如目录:./genpdf.sh anasinc/department/ depart"
if [ $# -eq 0 ] ##判断参数是否存在
then
echo $message1
echo $message2
echo $message3
exit ##不存在退出
fi
if [ x$1 = x ] ##判断参数1是否存在
then
echo $message1
echo $message2
echo $message3
exit ##不存在退出
fi
if [ x$2 = x ] ##判断参数2是否存在
then
echo $message1
echo $message2
echo $message3
exit ##不存在退出
fi
srcfile=$1
buildname=$2
currentdir=$(pwd)
if [ -d $1 ]
then
# 如果源文件参数是目录,则获取目录下所有.md文档
cd $1
srcfile=$(ls | sed "s:^:`pwd`/:")
fi
echo $srcfile
cd $currentdir
pandoc -N --template=.tpl/anas.tex --variable fontsize=12pt ${srcfile} --latex-engine=xelatex --toc -o build/${buildname}.pdf --highlight-style kate -V mainfont="思源黑体 CN" -V sansfont="思源黑体 CN" -V monofont="思源黑体 CN"
firefox build/${buildname}.pdf
latex模板文件定制
模板资源
https://github.com/jgm/pandoc/wiki/User-contributed-templates
latex基础用法
https://latex-project.org/guides/usrguide.pdf
使用fancy定制页眉页脚
http://www.ctex.org/documents/packages/layout/fancyhdr.htm
http://www.ctex.org/documents/packages/layout/fancyhdr.pdf
利用 fancyhdr 宏包提供的命令,可以方便的作到:
- 自定义页眉和页脚。
- 为页眉和页脚加上装饰性的横线。
- 页眉和页脚的宽度可以超过正文文本的宽度。
- 多行的页眉和页脚。
- 奇偶页使用不同格式的页眉和页脚。
- 每章的首页使用不同格式的页眉和页脚。
- 浮动对象页使用不同格式的页眉和页脚。
- 控制页眉和页脚的字体,包括字形,字族,大小写等。
目录与正文在同一页
在目录后$body$前,加入
\newpage
正文第一页与页眉重叠
最简单的就是正文/$body$前加入
% fix the no.2 page covered by header
\thispagestyle{empty}
\newpage
\itshape{\hspace{1em}}
\\[0.4em]
% end of fix the no.2 page covered by header
中文无法自动换行问题
上面问题在与中文行没有被换行,参考了一下Tzeng Yuxio同学的模板,中文的换行 通过\XeTeXlinebreaklocale “zh”实现。而在pandoc的缺省模板中是没有这个设置的。因此考虑修改缺省的latex模板。方法如下:
在模板的这个部分下面加上这一行\XeTeXlinebreaklocale “zh”
$if(mathfont)$
\setmathfont(Digits,Latin,Greek){$mathfont$}
$endif$
实用案例:添加水印
http://www.ctan.org/pkg/draftwatermark
ftp://ftp.u-aizu.ac.jp/pub/tex/CTAN/macros/latex/contrib/draftwatermark/draftwatermark.pdf
\usepackage[firstpage]{draftwatermark} %此处可选项为firstpage表只有第一页有,若为空则表示所有页面都有水印
\SetWatermarkText{此处为水印内容}%若要多行显示可以用
\SetWatermarkColor{red}
\SetWatermarkColor[rgb]{0,1,0}
\SetWatermarkText{\shortstack{水印第一行\\水印第二行}}
%此WatermarkText作用范围为所在页到下一个\SetWatermarkText设置的页
\SetWatermarkScale{0.3} %设定大小
\SetWatermarkLightness{0.88}%defaultis0.8
参考文章
作者:ryanemax
微信关注:ryanemax (刘雨飏)
本文出处:https://romantic-hoover-f991f1.netlify.com/study/markdown2pdf/
授权协议:
CC BY-SA 4.0