我正在尝试学习如何编写 latex 类,并使用我的简历作为示例。我试图尽可能地将样式与内容分开,因此我尝试定义数据字段,例如\name
\address
\university
,类似于我在中看到的字段\maketitle
。其中每个字段中的一些字段是可选的。我有一个工作示例,但由于这是我第一次尝试编写 latex 类,我想问一下我如何应该定义类的元数据。
我迄今为止的尝试是这样的(地址的第二行可选):
\RequirePackage{xkeyval} % for keyval
\newif\ifAddressLineTwo\AddressLineTwofalse
\newcommand{\@address@firstline}{}
\newcommand{\@address@secondline}{}
\newcommand{\@address@town}{}
\newcommand{\@address@postcode}{}
\define@key{address}{first_line}[none]{%
\renewcommand{\@address@firstline}{#1}%
}
\define@key{address}{second_line}[none]{%
\AddressLineTwotrue
\renewcommand{\@address@secondline}{#1}%
}
\define@key{address}{town}[none]{%
\renewcommand{\@address@town}{#1}%
}
\define@key{address}{postcode}[none]{%
\renewcommand{\@address@postcode}{#1}%
}
\newcommand\address[2][]{%
\setkeys{address}{#2}%
}
\newcommand{\makeCV}{%
\@address@firstline\\%
\ifAddressLineTwo
\@address@secondline\\%
\fi
\@address@town\\%
\@address@postcode%
}
这对我来说没问题,我可以打字
\address
{
first_line= my road
%second_line=my county,
town=my city,
postcode=my post code
}
\makeCV
但类看起来有点冗长?特别是,必须定义所有这些\newcommand{...}{}
和各种\newif
,这似乎有点冗长。
我的问题是我应该如何正确地完成这项任务?
答案1
你可以使用键盘命令包裹。
但我不会太担心编码的冗长,而是担心你向潜在用户呈现的作者界面,它很冗长。根据我与用户打交道的经验,他们更喜欢(环境)和简单的命令。我会保留这些key-val
对,主要用于切换,例如是否包含照片。当然,地址行不属于命令的键值部分。如下所示的界面,
\usepackage[foto=none]{sCV}
\begin{CV}
\AddaAddressLine{}
\AddAddressLine{}
\AddWorkexperience{}
\Addacademic{}
\AddFoto{}
\end{CV}
编码和使用会更加容易。使用环境还可以使跨多个页面的编码更加容易。
答案2
我直接写了这个,没有尝试,所以要小心:NPK 对于新包最好使用例如包名称的字母。mcv makeCV。\define@boolkey
你不需要\newif
。\ifNPK@mcv@LineTwo
会自动创建。\presetkeys
是给出默认值, \setkeys[NPK]{mcv}{#1}
是应用宏中的选项。没有尝试,也许我会犯一些错别字 :(
现在我更喜欢使用pgfkeys
如果你想要同样的东西,这是可能的,但也许它更冗长
\define@boolkey [NPK] {mcv} {LineTwo}[true]{}
\define@cmdkey [NPK] {mcv} {firstline}{}
\define@cmdkey [NPK] {mcv} {secondline}{}
\define@cmdkey [NPK] {mcv} {town}{}
\define@cmdkey [NPK] {mcv} {postcode}{}
\presetkeys [NPK] {mcv} {LineTwo = false,
firstline = {},
secondline = {},
town = {},% Paris
postcode = {}}{} % 75005
\newcommand{\makeCV}[1][]{%
\setkeys[NPK]{mcv}{#1}
\cmdNPK@mcv@firstline\\%
\ifNPK@mcv@LineTwo
\cmdNPK@mcv@secondline\\%
\fi
\cmdNPK@mcv@town\\%
\cmdNPK@mcv@postcode%
}