红头文件情节,缘于一个叫「群里有事」的微信小程序。
随着公司小伙伴增多,原来的管理也很不规范,有时候有些事情说了,却总是执行不下去。虽然有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
会靠右显示公司名称和日期。
bigskip
bigskip
hfill{$com$}
par
hfill{$date$}
盖公章,先上移5行的距离,然后贴上一张透明的公章图片。
代码语言:javascript复制vspace*{-5baselineskip}
hfill{includegraphics[width=10em]{xytxcf.png}}
文件底部信息,设置首先缩进为0
,然后 vfill
会保证填充页面完间到页面底部。显示主题词,主题词可以有多个,用数组表示,所以用 for
循环显示,主题词间空一个字( quad
)。如果(if
)有密级,则显示保密级别。
hrule
画横线,显示抄送单位。再画横线,显示发文单位和日期。结束。
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个点用线段连起来并填充,理解起来有些复杂,不多说了,宏代码如下。
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.tex
和test.md
后,我们就可以用Pandoc生成PDF了:
pandoc -s --template redtitle.tex --pdf-engine=xelatex -o test.pdf test.md
注意,我们使用xelatex
引擎以更好地支持中文,另外,在导言区使用了华文黑体和仿宋,因为是Mac自带的字体使用起来方便一些。
usepackage{fontspec}
newfontfamilyzhfont[BoldFont=STHeiti,ItalicFont=STKaiti]{STFangsong}
newfontfamilyzhpunctfont{STFangsong}
祝开心。
点击「阅读原文」可以查看完整的Latex模板文件。
「阅读原文」链接失效的可以复制此链接使用:https://gist.github.com/seven1240/2b18d53b7d3452a29020d4760a82f1f0
如果想经常收到红头文件,欢迎加入信悦通和小樱桃,发简历到 jobs@x-y-t.cn ,我们需要文武双全的工程师,上能敲代码,下能写文章!