对于 suftesi 书中的文章,maketitle 未定义

对于 suftesi 书中的文章,maketitle 未定义

我已经开始使用 suftesi 来编写包含多篇文章的书,并尝试使用第 5 节中的最小示例:

\documentclass[structure=collection]{suftesi}
%process with pdflatex 

\begin{document}    
    \input{articleTest}
\end{document}

以及从手册中复制的一篇文章:

\begin{article}
\author{Author}
\title{Title of the paper}
% The abstract is optional.
% \begin{abstract}
% The abstract
% \end{abstract}
\maketitle
Text of the paper
\end{article}

这会产生 pdflatex 错误

Undefined control sequence. \maketitle

必须改变什么?

答案1

我认为实际上不是\maketitle未定义的,你的编辑器可能没有很好地解析错误消息。我得到的完整错误是

! Undefined control sequence.
\@maketitle ...{title.\thearticle }\Hy@raisedlink 
                                                  {\hyper@anchorstart {\@cur...
l.20 \maketitle

? 

因此,导致错误的宏是\Hy@raisedlink(错误消息中换行符之前的最后一个宏),它在suftesi的定义中使用\maketitle。该宏由包定义hyperref,因此添加

\usepackage{hyperref}

解决了问题。(至少在我的系统上。)

\顺便说一下,我之前添加了缺失的内容begin{article},我认为那是一个复制粘贴错误。

\documentclass[structure=collection]{suftesi}
%process with pdflatex 
\usepackage{hyperref} % <-- add this

\begin{document}    
\begin{article}
\author{Author}
\title{Title of the paper}
% The abstract is optional.
% \begin{abstract}
% The abstract
% \end{abstract}
\maketitle
Text of the paper
\end{article}
\end{document}

答案2

我想说这是一个错误suftesi,可以通过进一步检查来解决:

\begin{filecontents}{\jobname-test.tex}
\begin{article}
\author{Author}
\title{Title of the paper}
% The abstract is optional.
% \begin{abstract}
% The abstract
% \end{abstract}
\maketitle
Text of the paper
\end{article}
\end{filecontents}

\documentclass[structure=collection]{suftesi}
%process with pdflatex

\usepackage{etoolbox}

\makeatletter
\AtBeginDocument{%
  \patchcmd{\@maketitle}
   {%
    \xdef\@currentHref{title.\thearticle}%
    \Hy@raisedlink{\hyper@anchorstart{\@currentHref}\hyper@anchorend}%
   }
   {%
    \@ifundefined{Hy@raisedlink}{\let\texorpdfstring\@firstoftwo}{%
      \xdef\@currentHref{title.\thearticle}%
      \Hy@raisedlink{\hyper@anchorstart{\@currentHref}\hyper@anchorend}%
    }%
   }
   {}{}%
}
\makeatother

\begin{document}

\input{\jobname-test}

\end{document}

filecontents环境仅用于使示例自成一体。

如果\Hy@raisedlink没有定义,我们可以假设hyperref还没有被加载(\@ifundefined当所有的包都已经被加载时才会执行);在这种情况下我们定义返回它的第一个参数;否则,执行\texorpdfstring与当前相同的代码。suftesi

相关内容