前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >用Pandoc+Latex制作红头文件

用Pandoc+Latex制作红头文件

作者头像
Seven Du
发布2020-12-21 16:16:50
3.3K0
发布2020-12-21 16:16:50
举报

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

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

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

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

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

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

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

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

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

代码语言:javascript
复制
\centerline{\color{red}\Huge\textbf{$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*{-5\baselineskip}
\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
复制
\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格式的变量表。上面模板文件里看到的变量,在下面都能找到:

代码语言: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}
\newfontfamily\zhfont[BoldFont=STHeiti,ItalicFont=STKaiti]{STFangsong}
\newfontfamily\zhpunctfont{STFangsong}

祝开心。

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

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

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-01-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 FreeSWITCH中文社区 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云开发 CloudBase
云开发(Tencent CloudBase,TCB)是腾讯云提供的云原生一体化开发环境和工具平台,为200万+企业和开发者提供高可用、自动弹性扩缩的后端云服务,可用于云端一体化开发多种端应用(小程序、公众号、Web 应用等),避免了应用开发过程中繁琐的服务器搭建及运维,开发者可以专注于业务逻辑的实现,开发门槛更低,效率更高。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档