将标题和作者传递给类文件中的 fancyhdr

将标题和作者传递给类文件中的 fancyhdr

我正在编写一个课程文件,学生将在我的其中一门课程中使用它作为论文,但我无法将标题和作者自动传递给 fancyhdr。

以下是该类文件的精简版本:

\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{latex101}[]
\LoadClass{article}
\RequirePackage{fancyhdr}
\makeatletter
\let\runtitle\@title
\let\runauthor\@author
\makeatother
\AtBeginDocument{%
\lhead{\today}%
\chead{\runauthor}%
\rhead{\runtitle}%
\pagestyle{fancy}%
}
\endinput

当学生写论文时,他们会按如下方式设置他们的.tex 文件:

\documentclass{latex101}
\title{My assignment}
\author{First Last}
\date{Semester Year}
\begin{document}
\maketitle
% content
\end{document}

但是,这不会编译,并抛出错误“未给出标题。”如果我从标题中删除标题,文档会编译,但标题不会打印作者。

在指定 \title{} 和 \author{} 之后将标题调用添加到序言中可以按预期工作,但我希望在类文件中定义标题,以避免学生忘记在序言中定义标题的可能性。

非常感谢您的任何建议!

答案1

正在发生的情况是,在加载类时分配\let\runtitle\@title和正在完成,这太早了,因为作者只会在加载类后使用这些命令。\let\runauthor\@author

为了解决这个问题,你可以将任务放在\AtBeginDocument

\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{latex101}[]
\LoadClass{article}
\RequirePackage{fancyhdr}
\AtBeginDocument{%
\makeatletter
\let\runtitle\@title
\let\runauthor\@author
\makeatother
\lhead{\today}%
\chead{\runauthor}%
\rhead{\runtitle}%
\pagestyle{fancy}%
}
\endinput

但这仍然需要\title{My assignment}在之前给出\begin{document}。我的建议是进行修补\maketitle以避免重新定义\@author\@title

\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{latex101}[]
\LoadClass{article}
\RequirePackage{etoolbox}
\makeatletter
\tracingpatches
\patchcmd\maketitle
  {\global\let\@author\@empty
   \global\let\@date\@empty
   \global\let\@title\@empty}
  {}{}{}
\RequirePackage{fancyhdr}
\AtBeginDocument{%
\lhead{\today}%
\chead{\@author}%
\rhead{\@title}%
\pagestyle{fancy}%
}
\makeatother
\endinput

答案2

@Phelype Oleinik 的回答很好。我采取的方法来自另一篇文章(https://stackoverflow.com/questions/2522173/how-to-get-the-value-of-the-document-title-in-latex)。在类文件中我重新定义了title和author命令:

\def\title#1{\gdef\@title{#1}\gdef\runtitle{#1}}
\def\author#1{\gdef\@author{#1}\gdef\runauthor{#1}}

该类文件现在内容如下:

我正在编写一个课程文件,学生将在我的其中一门课程中使用它作为论文,但我无法将标题和作者自动传递给 fancyhdr。

以下是该类文件的精简版本:

\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{latex101}[]
\LoadClass{article}
\RequirePackage{fancyhdr}
\makeatletter
\let\runtitle\@title
\let\runauthor\@author
\makeatother
\AtBeginDocument{%
\lhead{\today}%
\chead{\runauthor}%
\rhead{\runtitle}%
\pagestyle{fancy}%
}
\endinput

相关内容