我正在编写一个课程文件,学生将在我的其中一门课程中使用它作为论文,但我无法将标题和作者自动传递给 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