Moderncv 包为可选参数提供了错误:为什么?

Moderncv 包为可选参数提供了错误:为什么?

因此,我正在 Arch Linux 上使用 TeXLive 编写简历moderncv。请注意,我使用的是 Emacs,其中扩展的代码片段为cventry我提供了以下建议:\cventry{year}{job}{employer}{city}{description}。请注意,缺少 grade 参数,但是这个应该不是问题,因为文档说:

\cventry{years}{degree/job title}{institution/employer}
{localization}{optional: grade/...}
{optional: comment/job description}

“其中最后三个参数是可选的”(我不知道为什么在示例中只有最后两个被标记为可选的,但这是一件小事)。

现在,我有这个 MWE:

\documentclass[a4paper,12pt]{moderncv}
\usepackage{parskip}
\usepackage[scale=0.85]{geometry}
\recomputelengths{}

\firstname{Alessandro}
\familyname{Bertulli}
\address{via @@@@@@@ @@}{@@@@@ @@@@@@@@@@}
\mobile{@@@@@@@@@@}
\email{@@@@@@@.@@@@@@@@@@@.com}

\nopagenumbers{}
\moderncvstyle{casual}
\moderncvcolor{blue}

\begin{document}
%\makecvtitle{}
\section{Educazione}
\label{sec:educazione}
\cventry{2015}{Scuola superiore}{L.S.S. ``Elio Vittorini''}{Milano}{voto: @@}
\cventry{2019}{Laurea Triennale in Ingengeria Informatica}{Politecnico di Milano}{}{voto: @@}
\closesection{}
% \cvlanguage{English}{Advanced}{B2 Cambridge level}
\end{document}

请注意,参数数量低于手册中指定的数量。编译时,我收到类似以下内容的错误:

BAD BOX: Underfull \hbox (badness 10000) in paragraph at lines 17--17

--- TeX said ---

--- HELP ---
Check your output for extra vertical space.  If you find some, it was
probably caused by a problem with a \\ or \newline command---for
example, two \\ commands in succession. This warning can also be
caused by using the sloppypar environment or \sloppy declaration, or
by inserting a \linebreak command.

如果我输入正确数量的参数,错误就会消失。

  • 这是我的 LaTeX 发行版的错误吗?
  • 参数的数量是否真的是必需的,而“可选”一词仅仅意味着它们可以留空({})但可以存在?(如果是,我将向提供该代码片段的 Emacs 包发出错误请求)

答案1

传统上,LaTeX 命令可以有两种类型的参数:

  • 强制的在花括号内给出的参数以及必须在场
  • 选修的可以在方括号内给出并且可以完全省略的参数。

TeX 语法允许我们定义参数行为不同的命令(一些 LaTeX 软件包确实如此)。但从广义上讲,这就是区别。

如果使用 LaTeX 的经典界面定义命令\newcommand,则只有第一个参数是可选的,所有其他参数都是必需的。

较新的\DeclareDocumentCommand和朋友允许更自由的语法选择。但即使在那里,常规可选参数也放在方括号中,常规强制参数则放在花括号中。

带有强制参数的命令通常以强制 TeX“查找”强制参数(如果未提供)的方式实现。这意味着如果缺少强制参数,TeX 可能会收集命令后面的几个内容,并假装这些是缺少的参数。这可能会产生意想不到的后果。


最初,moderncv.cls(第 510-512 页)定义\cventry为虚拟命令

% makes a typical resume job / education entry
% usage: \cventry[spacing]{years}{degree/job title}{institution/employer}{localization}{optionnal: grade/...}{optional: comment/job description}
\newcommand*{\cventry}[7][.25em]{}

然后根据所选样式重新定义。这些重新定义有所不同,但结构相似。moderncvbodyi.sty,第 110-118 页举个例子,

\renewcommand*{\cventry}[7][.25em]{%
  \cvitem[#1]{#2}{%
    {\bfseries#3}%
    \ifthenelse{\equal{#4}{}}{}{, {\slshape#4}}%
    \ifthenelse{\equal{#5}{}}{}{, #5}%
    \ifthenelse{\equal{#6}{}}{}{, #6}%
    \strut%
    \ifx&#7&%
    \else{\newline{}\begin{minipage}[t]{\linewidth}\small#7\end{minipage}}\fi}}

从语法上讲,这清楚地定义了一个命令,该命令具有一个可选参数(第一个参数,如果需要,可以用方括号给出)和六个强制参数(用花括号给出)。有一些代码可以处理某些强制参数为空的情况。

这意味着\cventry必须始终提供六个参数,这通常意味着您需要六对花括号。这六个中的最后三个可以留空,但花括号不能省略 - 如果省略,TeX 会尝试将以下内容作为参数,这有时可能会导致非常奇怪的错误。

所以\cventry{2015}{Scuola superiore}{L.S.S. ``Elio Vittorini''}{Milano}{voto: @@}不行,必须

\cventry{2015}{Scuola superiore}{L.S.S. ``Elio Vittorini''}{Milano}{voto: @@}{}

文档中的措辞非常不幸,甚至完全具有误导性,因为传统上可选参数是在方括号中给出的,可以完全省略,而不是在花括号中给出的,可以留空。

如果你愿意,你可以提出这个问题https://github.com/moderncv/moderncv/issues以确保文档更加准确。您可能还想向提供代码片段的 Emacs 包提出问题,因为需要提供参数。

答案2

如果你看一下命令的定义

\renewcommand*{\cventry}[7][.25em]{%
    \cvitem[#1]{#2}{%
        {\bfseries#3}%
        \ifthenelse{\equal{#4}{}}{}{, {\slshape#4}}%
        \ifthenelse{\equal{#5}{}}{}{, #5}%
        \ifthenelse{\equal{#6}{}}{}{, #6}%
        \strut%
        \ifx&#7&%
        \else{\newline{}\begin{minipage}[t]{\linewidth}\small#7\end{minipage}}\fi}}

您将看到它需要找到 7 个参数,其中只有一个,即第一个,可选(默认值为 .25em),并在 #4、#5 和 #6 中测试是否为空。

在代码中你会发现

% makes a typical resume job / education entry
% usage: \cventry[spacing]{years}{degree/job title}{institution/employer}{localization}{optionnal: grade/...}{optional: comment/job description}

所以这里的意思就是“可选” {}

相关内容