2017/8/29 20:26:03

原文地址

https://www.sharelatex.com/blog/2011/03/27/how-to-write-a-latex-class-file-and-design-your-own-cv.html

每个人都想要一个看起来专业的简历,内置的LaTeX模板也没有什么缺点。但是你要是想自己定制一个简历,就得像我一样。这意味着你需要根据自己的想法定制一个样式。众所周知,这挺难的。在这个系列的博文中,我希望能够指导你创造自己风格的类文件,并告诉你按照你的想法定制你自己的简历其实很简单。我们将把目光聚焦于简历样式,但是其中的方法确实通用的。

什么是类文件?

当你在你的LaTex文件里写\documentclass{article}的时候,你就引用了一个类文件article.cls。这个类文件,定义了所有像\section\title的命令,这些命令使你的文档变得结构化。这些命令如何影响格式和页面布局,也是由它控制的。

建立你自己的类文件

定制一个文档格式最方便的方法就是将所有的格式信息放在一个私人类文件中。这样能将文章的内容和格式清楚地分开,并能方便地进行复用。请建立一个cv.tex文件,并添加如下内容:

\documentclass{my_cv}

\begin{document}

\section{Education}
\subsection{University of Nowhere} \section{Work}
\subsection{ABC Limited.} \end{document}

这个将尝试加载类文件my_cv.cls,但现在它还不存在。在cv.tex的同一个目录下,建立文件my_cv.cls,添加如下内容:

\LoadClass{article}

如果现在你编译你的文档,你应该会看到一切都还是默认的文章样式。

那么现在发生了什么呢?类文件需要包含很多格式信息和内部设置,以使得LaTeX正常工作,但是我们并不想人工地输入所有的东西。相反地,我们的类文件可以基于article.cls。我们使用LoadClass来引用article.cls并且加载其中定义的所有的命令和格式 。需要注意的是,我们并没有使用通常的\documentclass命令来引用article.cls,因为\documentclass仅在你的LaTeX文档的开头使用。

告诉LaTeX你的类一些事情

所有的类文件在文件的起始部分,都应该包含与下面类似的两行。现在把这些添加到my_cv.cls的顶端吧。

\NeedsTeXFormat{LaTeX2e}
\ProvideClass{my_cv}[2011/03/06 My custom CV class]

命令\NeedsTeXFormat告诉编译器这个宏包是属于LaTeX的哪个版本的。当前LaTeX的版本是LaTeX2e,几乎所有的发行版本都是用这个。

命令\ProvidesClass告诉编译器你的宏包一些信息。第一个参数应该与这个类的文件名一致,描述了这个宏包的名称。第二个参数是可选的,这个将出现在日志或者其他地方。这个描述必须以上述格式的日期开始,这个日期应该是这个宏包最近修改的日期。这将在检查是否有新的版本的时候用到。例如,如果你使用\documentclass{my_cv}[2012/01/01]的时候,由于这个日期比宏包中的日期要晚,于是一个警告会被抛出,表明这个类已经过时了。

修改section标题

标准的文章的section的标题并不适合简历,因此我们使用一些更优雅的东西代替它们。为了达到这个目的,我们重新定义\section命令,来输出一个自定义的标题。

幸运的是,有一个很棒的的宏包,叫做titlesec,提供了一个简单的方法去自定义我们的标题风格。在你的类文件中添加如下语句

\RequirePackge{titlesec}

需要注意的是,我们应该使用\RequirePackage而不是通常的\usepackage命令,因为这是在一个类文件中。即使在其他宏包使用同样的命令,\RequirePackage确保每个宏包被加载一次。

titlesec宏包提供了titleformat命令,能让我们自定义我们的section标题。在my_cv.cls的末尾添加吐下内容以自定义标题的样式:

\titleformat{\section}         % Customise the \section command
{\Large\scshape\raggedright} % Make the \section headers large (\Large),
% small capitals (\scshape) and left aligned (\raggedright)
{}{0em} % Can be used to give a prefix to all sections, like 'Section ...'
{} % Can be used to insert code before the heading
[\titlerule] % Inserts a horizontal line after the heading

如果我们现在编译cv.tex,我们将看到一级标题更适合一个简历:

我们也能自定义\subsection标题:

\titleformat{\subsection}
{\large\scshape\raggedright}
{}{0em}
{}

二级标题现在也是同样的样式:

你应该尝试一些可行的格式选项进行选择:

  • \bf\it —— 标题加粗或斜体
  • \scshape —— 小型大写字母
  • \small\normalsize\large\Large\LARGE\huge\Huge —— 设置字体大小
  • \rmfamily\sffamily\ttfamily —— 相应地设置字体为 serifed, san serifed or typewriter

添加日期到section标题上

我们能定义一些新的命令,使得我们在section标题上添加日期。在你的类文件中添加如下内容:

\newcommand{\datedsection}[2]{%
\section[#1]{#1 \hfill #2}%
}
\newcommand{\datedsubsection}[2]{%
\subsection[#1]{#1 \hfill #2}%
}

这定义了两个新的命令\datedsection\datedsubsection,它们有两个参数:之前的section名字和在页面右侧的日期。\hfill命令告诉LaTeX尽可能多地填充空间以使得第二个参数(#2)位于页面的右侧。修改cv.tex来使用这些命令:

\documentclass{my_cv}

\begin{document}

\section{Education}
\datedsubsection{University of Nowhere}{2004--2008}
I attended the University of Nowhere from 2004 to 2008. \section{Work}
\datedsubsection{ABC Limited.}{2008--Now}
I have worked at ABC Limited from 2008 onwards. \end{document} ​

我们的简历现在包含了日期:

总结

以上就是我们指南第一部分的全部了,但是幸好覆盖了足够多的内容让你们开始制作有用的类文件。这个简历模板看起来已经比较合理,它并没有使用很多命令,但对于其他我们能够自定义的部分,我们仅是刚刚开始。在这个指南的下面几节,我将讲述宏包的参数传递,创造一个精致的标题和如何设置通用的布局选项。

感谢你的阅读!

如何写一个LaTeX类文件,并设计你自己的简历的更多相关文章

  1. Java基础-继承-编写一个Java应用程序,设计一个汽车类Vehicle,包含的属性有车轮个数 wheels和车重weight。小车类Car是Vehicle的子类,其中包含的属性有载人数 loader。卡车类Truck是Car类的子类,其中包含的属性有载重量payload。每个 类都有构造方法和输出相关数据的方法。最后,写一个测试类来测试这些类的功 能。

    #29.编写一个Java应用程序,设计一个汽车类Vehicle,包含的属性有车轮个数 wheels和车重weight.小车类Car是Vehicle的子类,其中包含的属性有载人数 loader.卡车类T ...

  2. [Vue]写一个简单的文件上传控件

    ​这篇将介绍如何写一个简单的基于Vue+Element的文件上传控件. 控件将具有 1. 上传队列的列表,显示文件名称,大小等信息,可以显示上传进度实时刷新 2. 取消上传 ​ 使用Element的u ...

  3. 缓存原理,自己写一个缓存类(c#版)

    .net中的MemoryCache是通过内部封装一个静态Dictionary 自己写一个缓存,来看看内部怎么实现的 public class CustomerCache : ICache { priv ...

  4. 29.编写一个Java应用程序,设计一个汽车类Vehicle,包含的属性有车轮个数 wheels和车重weight。小车类Car是Vehicle的子类,其中包含的属性有载人数 loader。卡车类Truck是Car类的子类,其中包含的属性有载重量payload。每个 类都有构造方法和输出相关数据的方法。最后,写一个测试类来测试这些类的功 能。

    //Vehicle类 package d922A; public class Vehicle { private int wheels; private double weight; Vehicle( ...

  5. 编写一个Java应用程序,设计一个汽车类Vehicle,包含的属性有车轮个数 wheels和车重weight。小车类Car是Vehicle的子类,其中包含的属性有载人数 loader。卡车类Truck是Car类的子类,其中包含的属性有载重量payload。每个 类都有构造方法和输出相关数据的方法。最后,写一个测试类来测试这些类的功 能。

    package car; public class Vehicle { //定义成员变量 private int wheels; private double weight; public int g ...

  6. 写一个操作 .ini文件的类

    class IniHelp { private string iniPath; [DllImport("kernel32")] private static extern long ...

  7. 用python写一个简单的文件上传

    用Pycharm创建一个django项目.目录如下: <!DOCTYPE html> <html lang="en"> <head> <m ...

  8. 根据python上下文管理,写一个在读文件内容前后自动打开关闭文件的程序

    利用上下文管理实现读f文件前后自动打开关闭文件#在本目录创建f文件,内容写monkey代码如下 import contextlib #导入模块1 @contextlib.contextmanager# ...

  9. 随便写一个c++类

    为了让代码更贴合实际项目需要,我们分别用xxx.h文件,xxx.cpp文件来包含类的定义,类的声明和类的调用部分,实验平台vs2010 mycoach.h文件 #pragma once #includ ...

随机推荐

  1. heatbeat-gui实现基于nfs的mysql高可用集群

    一.简述HA高可用集群 高可用集群就是当集群中的一个节点发生各种软硬件及人为故障时,集群中的其他节点能够自动接管故障节点的资源并向外提供服务.以实现减少业务中断时间,为用户提供更可靠,更高效的服务. ...

  2. Glibc-2.3.4编译

    $tar xf Glibc2.3.4.tar.bz2 $mkdir build_glibc $cd build_glibc ../glibc-2.3.4/configure --prefix=/too ...

  3. 关于localStorage

    localStorage 是 HTML5 本地存储的 API,使用键值对的方式进行存取数据,存取的数据只能是字符串.不同浏览器对该 API 支持情况有所差异,如使用方法.最大存储空间等. 使用方法 设 ...

  4. JavaScript清除字符串前后空格

    一.通过循环检查,然后提取非空格字符串 //去掉前后空白 function trim(s){ return trimRight(trimLeft(s)); } //去掉左边的空白 function t ...

  5. Win10配Theano环境和Keras框架

    网络上有各种各样的win7 64bit安装theano的方法,我也试过好多,各种各样的问题.因为之前没了解过MinGw等东西,所以安装起来比较费劲,经过不断的尝试,最终我按照以下过程安装成功. 其实过 ...

  6. spring mvc: json练习

    spring mvc: json练习 本例需要用到的json包: 如下: jackson-databind jackson-core jackson-annotations <!-- https ...

  7. spring mvc: 参数方法名称解析器(用参数来解析控制器下的方法)MultiActionController/ParameterMethodNameResolver/ControllerClassNameHandlerMapping

    spring mvc: 参数方法名称解析器(用参数来解析控制器下的方法)MultiActionController/ParameterMethodNameResolver/ControllerClas ...

  8. 设计模式--模板方法模式C++实现

    模板方法模式C++实现 1定义 定义一个操作的算法的框架,而将一些步骤延迟到子类中.使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤. 实现方案:将算法/逻辑框架放在抽象基类中,并定义好 ...

  9. OpenGL全景视频

    全景视频其实在实现上和一般的视频播放基本差不多,解码可以用ffmpeg,只是对解码后的图片在绘制的时候要绘制在一个球上(我这里是球,好像有说有的格式要绘制在四面体上的,美做深入研究),而不是画在一个表 ...

  10. Hibernate入门_增删改查

    一.Hibernate入门案例剖析:  ①创建实体类Student 并重写toString方法 public class Student { private Integer sid; private ...