用Pandoc+Latex制作红头文件

2020-12-21 16:16:50 浏览数 (1)

红头文件情节,缘于一个叫「群里有事」的微信小程序。

随着公司小伙伴增多,原来的管理也很不规范,有时候有些事情说了,却总是执行不下去。虽然有Tower、钉钉之类的系统,但有时候有些通用性的工作总不能每个人都指定一个任务吧。所以,决定把红头文件用起来,一是为了好玩,另外红头文件看起来也醒目,毕竟喜庆、正式一些。

做为程序员,当然还是希望公司所有的文档都Commit到Git里,使用Markdown这样的文档格式,可是如何转换成红头文件呢?好在笔者有一些Latex的基础,写个模板应该还是可以做到的。

Pandoc是一个很好的文档工具,我一直在用它。关于Pandoc,可以看我的另一篇文章。。。

下面,我们就来说一下生成红头文件的一些关键的地方。

首先,要有个Latex模板。模板的导言部分在此我们就先略过了。正文部分是从下面内容开始的:

首先开始一个Latex文档,设置首页不显示页码,其它页显示页码。

代码语言:javascript复制
begin{document}
thispagestyle{empty}
pagenumbering{arabic}

居中显示大字红色标题,其中com是一个变量,即公司的名称。然后纵向空1个字的距离,居中显示发文序号。

代码语言:javascript复制
centerline{color{red}Hugetextbf{$com$}}
vspace{1em}
centerline{$seq$}

画两条红线。

代码语言:javascript复制
vspace{4pt}
{color{red}hrule height 1pt}
vspace{1pt}
{color{red}hrule height 0.3pt}

居中显示标题,由topic变量指定。然后空行,设置首行缩进为0,显示文件发往的单位,由to变量指定,后面都是首行缩进2个字符。

代码语言:javascript复制
section{$topic$}
bigskip
setlength{parindent}{0em}
{$to$:}
setlength{parindent}{2em}

下面是正文。

代码语言:javascript复制
$body$

空行,然后,hfill会靠右显示公司名称和日期。

代码语言:javascript复制
bigskip
bigskip

hfill{$com$}
par
hfill{$date$}

盖公章,先上移5行的距离,然后贴上一张透明的公章图片。

代码语言:javascript复制
vspace*{-5baselineskip}
hfill{includegraphics[width=10em]{xytxcf.png}}

文件底部信息,设置首先缩进为0,然后 vfill 会保证填充页面完间到页面底部。显示主题词,主题词可以有多个,用数组表示,所以用 for 循环显示,主题词间空一个字( quad )。如果(if)有密级,则显示保密级别。

hrule 画横线,显示抄送单位。再画横线,显示发文单位和日期。结束。

代码语言:javascript复制
setlength{parindent}{0em}
vfill

textbf{主题词:$for(keywords)$ $keywords$quad $endfor$}
$if(secret)$hfill{textbf{$secret$}}$endif$
vspace{5pt}
hrule
noindent{抄quad 送: $cc$}
vspace{5pt}
hrule
$com$
hfill{$date$}
vspace{5pt}
hrule

end{document}

嗯,Latex的语法看起来比较奇怪,但是看惯了,也好像不是很复杂不是?

如果事情就这个简单就好了,上述模板做好后,想起来,我们公司不仅人多了,公司也多了,嗯,我们有好几个公司需要这套公文系统,也就是说,至少需要一个变量引用不同的公章图片。但为了引用图片在每篇公文中引入一个变量,又有些多余,于是,我们进行了如下尝试,将图片换成如下内容:

代码语言:javascript复制
begin{tikzpicture}
color{red}
% circle
draw[line width=.8mm,color=red] (2.5,0) circle (2cm);% main text
draw[-latex,white,postaction={decorate},decoration={  
text along path,reverse path,  
text={$com$},text align=center,text color=red}]
(4,0) arc [start angle=0,end angle=180,radius=1.5];draw[-latex,white,postaction={decorate},decoration={  
text along path,  
text={专用章},text align=center, text color=red}]
(1,-1) -- (4,-1);Star[fill=red,draw]{2.5}{0}{.4}% fill star with random dots
foreach i in {1,...,100}
 fill [color=white] (2.3 rnd*0.5, rnd*0.5 - 0.2) circle (.25pt);% fill circle with random dots
foreach i in {1,...,500}
 fill [color=white] (2.5,0)   (rnd*360: 1.95   rnd * 0.1) circle (.25pt);
end{tikzpicture}

其中,tikzpicture 用于在Latex里直接画图,嗯,这个功能很强大,但是很复杂……

做公章,首先要画一个圈,圆心在 (2.5, 0) 半径为2厘米。

main text 部分,画一个孤路径,半径为1.5,在这个路径上写字,就有了公司名称。

「专用章」部分,是一个直线的路径。

Star 用于画五角星,它实际上是一个宏,就是用极坐标找到10个点用线段连起来并填充,理解起来有些复杂,不多说了,宏代码如下。

代码语言:javascript复制
newcommandStar[4][]{
path[#1] (#2,#3)   (18:#4) --  (54:#4*0.4)
  --  (90 :#4) --  (126:#4*0.4)       
  --  (162:#4) --  (198:#4*0.4)       
  --  (234:#4) --  (270:#4*0.4)       
  --  (306:#4) --  (344:#4*0.4) -- cycle;}

OK,真正的公章,印在纸上,颜色是不均匀的,因此,我们又随机在红圈和五角星上fill上了一些白点,使公章看起来更真实一些。

细心的读者应该能从下面两幅图看到一些细节。

有了模板,还得有内容。内容用Markdown格式,首先是一个YAML格式的变量表。上面模板文件里看到的变量,在下面都能找到:

代码语言:javascript复制
---
topic: 关于下雪的通知
seq: 总办发〔2018〕0号
to: 各单位cc: 所有人
keywords:  
  - 下雪  
  - 保暖
date: 2018年1月27日
com: 烟台小樱桃网络科技有限公司
secret: 秘密
---

正文部分,标准的Markdown,不多说了。

代码语言:javascript复制
近期由于下雪,请大家注意保暖。
近期由于下雪,请大家注意安全。本文为测试发文,望周知。

## 一、措施

不开车。
在家里不出来。

## 二、方法

不上班。
不吃饭。

好了,有了redtitle.textest.md后,我们就可以用Pandoc生成PDF了:

代码语言:javascript复制
pandoc -s --template redtitle.tex --pdf-engine=xelatex -o test.pdf test.md

注意,我们使用xelatex引擎以更好地支持中文,另外,在导言区使用了华文黑体和仿宋,因为是Mac自带的字体使用起来方便一些。

代码语言:javascript复制
usepackage{fontspec}
newfontfamilyzhfont[BoldFont=STHeiti,ItalicFont=STKaiti]{STFangsong}
newfontfamilyzhpunctfont{STFangsong}

祝开心。

点击「阅读原文」可以查看完整的Latex模板文件。

「阅读原文」链接失效的可以复制此链接使用:https://gist.github.com/seven1240/2b18d53b7d3452a29020d4760a82f1f0

如果想经常收到红头文件,欢迎加入信悦通和小樱桃,发简历到 jobs@x-y-t.cn ,我们需要文武双全的工程师,上能敲代码,下能写文章!

0 人点赞