因此,我正在 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&%
\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&%
\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}
所以这里的意思就是“可选” {}
。