这是包裹 https://github.com/mliu7/latex-moderncv
我正在尝试学习如何制作包和类,但这个包的某些内容让我感到困惑。
380 号线
\newcommand*{\makecvtitle}{}
这没有意义,因为没有参数,但是在 TeX 文档中如果你输入\makecvtitle
它会创建一个带有名称地址和其他信息的可爱标题。
请解释一下允许此命令制作简历标题的黑魔法。
答案1
你会发现里面有很多这样的空定义moderncv.cls
;不只是为了标题。
结构moderncv
\newcommand
当你加载类时,它会(通过)定义某些基本构造
\documentclass[..]{moderncv}
然后,根据你想要的风格选择,你可以调用
\moderncvstyle{<style>}
上述定义为
\newcommand*{\moderncvstyle}[1]{
\RequirePackage{moderncvstyle#1}}
因此,通过调用\moderncvstyle{casual}
,moderncv
加载“包”moderncvstylecasual.sty
, 哪个重新定义 \moderncv
根据自己的风格
\renewcommand{\makecvtitle}{...}
这是一编写类的方法:类设置一些基本构造,然后通过加载与类相关的包来扩展这些构造;\newcommand
然后几乎立即通过更改初始构造\renewcommand
。
这种方法有什么好处吗?有。它允许用户调用类没有加载扩展(或包)但仍使用基本基础。现在您可以使用标准方法修改构造:\renewcommand{\makecvtitle}{...}
。
有什么缺点吗?见上文... :-| 我猜这取决于最终用户。你不会知道该如何使用\newcommand{\makecvtitle}{...}
,\renewcommand{\makecvtitle}{...}
直到你遇到问题。
如果你想定义自己的样式,一种规避这种情况的方法是使用类似 TeX 的语法(同样,从最终用户的角度来看);即
\def\makecvtitle{...}
\makecvtitle
因为无论其是否存在,这都会覆盖其定义。
答案2
这只是一个默认值(不执行任何操作),它会根据所使用的选项重新定义,例如
moderncv/moderncvstylebanking.sty
做
\renewcommand*{\makecvtitle}{%
% recompute lengths (in case we are switching from letter to resume, or vice versa)
\recomputecvlengths%
\maketitle%
% optional quote
\ifthenelse{\isundefined{\@quote}}%
{}%
{{\centering\begin{minipage}{\quotewidth}\centering\quotestyle{\@quote}\end{minipage}\\[2.5em]}}%
\par}% to avoid weird spacing bug at the first section if no blank line is left after \maketitle}
这使得它做一些事情。