学习
实践
活动
工具
TVP
写文章
专栏首页FreeSWITCH中文社区用Pandoc+Latex制作红头文件

用Pandoc+Latex制作红头文件

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

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

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

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

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

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

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

\begin{document}
\thispagestyle{empty}
\pagenumbering{arabic}

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

\centerline{\color{red}\Huge\textbf{$com$}}
\vspace{1em}
\centerline{$seq$}

画两条红线。

\vspace{4pt}
{\color{red}\hrule height 1pt}
\vspace{1pt}
{\color{red}\hrule height 0.3pt}

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

\section{$topic$}
\bigskip
\setlength{\parindent}{0em}
{$to$:}
\setlength{\parindent}{2em}

下面是正文。

$body$

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

\bigskip
\bigskip

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

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

\vspace*{-5\baselineskip}
\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的语法看起来比较奇怪,但是看惯了,也好像不是很复杂不是?

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

\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个点用线段连起来并填充,理解起来有些复杂,不多说了,宏代码如下。

\newcommand\Star[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格式的变量表。上面模板文件里看到的变量,在下面都能找到:

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

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

近期由于下雪,请大家注意保暖。
近期由于下雪,请大家注意安全。本文为测试发文,望周知。

## 一、措施

不开车。
在家里不出来。

## 二、方法

不上班。
不吃饭。

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

pandoc -s --template redtitle.tex --pdf-engine=xelatex -o test.pdf test.md

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

\usepackage{fontspec}
\newfontfamily\zhfont[BoldFont=STHeiti,ItalicFont=STKaiti]{STFangsong}
\newfontfamily\zhpunctfont{STFangsong}

祝开心。

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

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

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

文章分享自微信公众号:
FreeSWITCH中文社区

本文参与 腾讯云自媒体分享计划 ,欢迎热爱写作的你一起参与!

作者:Seven
原始发表时间:2018-01-29
如有侵权,请联系 cloudcommunity@tencent.com 删除。
登录 后参与评论
0 条评论

相关文章

  • 用Matplotlib制作动画

    动画是呈现各种现象的有趣方式。在描述像过去几年的股票价格、过去十年的气候变化、季节性和趋势等时间序列数据时,与静态图相比,动画更能说明问题。因为,从动画中,我们...

    昱良
  • 用Python制作登录界面

    PyQt5是一种高级的语言,下面只有几行代码就能显示一个小窗口。底层已经实现了窗口的基本功能。

    Java架构师必看
  • 用JavaScript制作页面特效

    setTimeout和setInterval两者区别:setTimeout是定时程序,在什么时间做什么事情,setInterval是表示间隔一定时间反复执行某操...

    全栈程序员站长
  • 用Python制作恋爱日志

    最近一直在学习Python,就想到编写一个程序每天早上自动给女朋友发送微信,内容是我俩相恋时间,每日一句以及一句早安。

    stormwen
  • 用Python制作迷宫GIF

    问:我是一个Python迷,并且对迷宫的生成和迷宫解决的办法非常感兴趣。我很羡慕别人能够做出生成迷宫的动画。我如何能够用Python自己做一个迷宫动画,然后把我...

    小小科
  • 用Excel制作条形码

    条形码 (barcode)是将宽度不等的多个黑条和空白,按照一定的编码规则排列,用以表达一组信息的图形标识符。在商场中的商品上都有条形码,用扫码器或者扫码软件对...

    一朵灼灼华
  • 用wepy制作简易签名板

    zhaoolee
  • 用Sphinx快速制作文档

    简介 Sphinx 是一种文档工具,它可以令人轻松的撰写出清晰且优美的文档, 由 Georg Brandl 在BSD 许可证下开发. 新版的Python文档就是...

    木制robot
  • 用GitHub Actions制作Docker镜像

    为了确保GitHub上的项目可以顺利制作成镜像并推送到hub.docker.com,您需要做好以下准备:

    程序员欣宸
  • 用GitHub Actions制作Docker镜像

    为了确保GitHub上的项目可以顺利制作成镜像并推送到hub.docker.com,您需要做好以下准备:

    程序员欣宸
  • 用 Wolfram 语言制作圣诞动画

    WolframChina
  • 用Python快速制作海报级地图

    基于Python中诸如matplotlib等功能丰富、自由度极高的绘图库,我们可以完成各种极富艺术感的可视化作品,关于这一点我在系列文章在模仿中精进数据可视化中...

    Python大数据分析
  • 玩坏了,用 Python 制作 GUI 钢琴~

    作为 Python 区技术博主,第一想法当然是能否用 Python 也做一个,既好玩也能用于教学,经过一番研究总算折腾出来一个简易版?

    刘早起
  • 利用nginx快速制作接口用例

    whileideath
  • 用Markdown制作幻灯片:Marp

    ​ 在 Microsoft PowerPoint 里面,我们需要调整幻灯片的格式,操作起来些许麻烦。幻灯片通常是辅助演讲者的一个工具,这也是说,幻灯片不需...

    常青AAS
  • 制作OpenStack用的CentOS 6.5镜像

    在CentOS 6.5操作系统环境下制作一个CentOS 6.5的KVM镜像,安装cloud-init,能自动扩展根分区。

    星哥玩云
  • 用 Cocos Creator 制作平台跳跃游戏

    平台跳跃类游戏如《超级马里奥》《Celeste蔚蓝》等,非常考验玩家的操作和判断,有着非常本真的游戏乐趣。这类游戏乍一看,挺容易做的,但是要做好却不太容易。今天...

    一枚小工
  • 用python制作疫情动态图

    之前发了一个国外疫情发展视频,有朋友问怎么制作的,今天就写一下制作过程,非常简单,如果你学会了,以后只要获取了数据就可以制作各种类似的动图。

    星星在线
  • 用 Python 制作飞机大战小游戏

    这次用Python中的pygame模块来完成一个飞机大战的小游戏;基本思路是通过方向键来控制飞机的左右移动射击飞船。先来看下最后的效果

    龙哥

扫码关注腾讯云开发者

领取腾讯云代金券