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. 2017 ACM/ICPC Asia Regional Shenyang Online array array array

    2017-09-15 21:05:41 writer:pprp 给出一个序列问能否去掉k的数之后使得整个序列不是递增也不是递减的 先求出LIS,然后倒序求出最长递减子序列长度,然后判断去k的数后长度是 ...

  2. zpar使用方法之Chinese Word Segmentation

    第一步在这里: http://people.sutd.edu.sg/~yue_zhang/doc/doc/qs.html 你可以找到这句话, 所以在命令行中分别敲入 make zpar make zp ...

  3. 修饰器Decorator

    类的修饰 许多面向对象的语言都有修饰器(Decorator)函数,用来修改类的行为.目前,有一个提案将这项功能,引入了 ECMAScript. @testable class MyTestableCl ...

  4. SSM整合报错org.springframework.beans.factory.UnsatisfiedDependencyException

    我解决的办法是把.m2仓库所有文件删除,重新maven project就可以了. 但是在做这一步之前,报错如下: ①org.springframework.beans.factory.Unsatisf ...

  5. 在Web API 2 中实现带JSON的Patch请求

    译文:http://www.cnblogs.com/kexxxfeng/p/the-patch-verb-in-web-api-2-with-json.html 原文:https://carly.io ...

  6. 转载:Chrome 控制台不完全指南

    Chrome的开发者工具已经强大到没朋友的地步了,特别是其功能丰富界面友好的console,使用得当可以有如下功效: 更高「逼格」更快「开发调试」更强「进阶级的Frontender」 Bug无处遁形「 ...

  7. C++ substr 和 substring

    功能相似,但参数不同 substr(start,length); substring(start,end);

  8. Android------第一次启动出现白屏或者黑屏

    APP开发中,第一次运行启动app时,会出现一会儿的黑屏或者白屏才进入Activity的界面显示. 当打开一个Activity时,如果这个Activity所属Application还没有在运行, 系统 ...

  9. SpringIOC源码分析总结

    大致的加载过程: spring ioc容器的加载,大体上经过以下几个过程: 资源文件定位.解析.注册.实例化 1.资源文件定位:主要发生在ApplicationContext中,由于applicati ...

  10. 初识async函数

    为什么会出现async函数 首先从大的方面来说,出现async函数时为了解决JS编程中的异步操作,再往具体说就是为了对以往异步编程方法的一种改进,也有人说仅仅只是Generator 函数的语法糖,这个 ...