请解释 moderncv.cls 如何定义 \maketitle

请解释 moderncv.cls 如何定义 \maketitle

这是包裹 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}

这使得它做一些事情。

相关内容