我正在制作一个“作业”类文件。我的课程的一个元素无法正常工作。我希望能够在 latex 文件中输入作业编号,使用\assigntitle{4}
并在页面顶部打印居中的作业编号 4。我在类文件中使用\newcommand
和\renewcommand
来实现这一点。唉,这部分不起作用。我只从定义中获得了预定义的输出\newcommand
,而不是从 latex 文件中获得我的值输入。我认为这是因为范围问题,但我不知道如何解决这个问题。我试过使用,\global\def\
但没有用。我想\renewcommand
不能使用这种类型的\def
。如果我错了,请通知我。
我已经从完整文件中删除了多余的代码(是的,我只尝试了这段代码),如下所示。
\ProvidesClass{Assignment}
\NeedsTeXFormat{LaTeX2e}
\DeclareOption*{\PassOptionsToClass{\CurrentOption}{article}}
\ProcessOptions
\LoadClass[11pt,letterpaper]{article}
\newcommand{\@assignment}{Assignment \#}
\newcommand{\assigntitle}[1]{\renewcommand{\@assignment}{Assignment \#{#1}}}
\AtBeginDocument{%
\centering \huge \upshape \@assignment \\
\normalsize \normalfont \@date
\bigskip
}
\endinput
例子.tex
\documentclass[english]{Assignment}
\begin{document}
\assigntitle{4}
\end{document}
答案1
对于此实现,我建议\assigntitle
不仅使用它来更新一些内部宏,而且还使用它来设置实际标题:
\newcommand{\assigntitle}[1]{%
\begin{center}
\huge \upshape Assignment \# #1 \\
\normalsize \normalfont \@date
\end{center}
}
如果你想要设置除 之外的日期\today
,你可以使用
\date{January 1, 2001}
\assigntitle{4}
答案2
基本问题是\@assignment
在文档主体的开头就使用了\AtBeginDocument
,因此\assigntitle{4}
之后使用 等\begin{document}
是无效的,因为重新定义的\@assignment
从未使用过。
\centering
不应出现在组之外,因此使用\begingroup...\endgroup
。
我建议使用页面样式标题(例如fancyhdr
),而不是更新,也使用计数器。
Assignment.cls
\ProvidesClass{Assignment}
\NeedsTeXFormat{LaTeX2e}
\DeclareOption*{\PassOptionsToClass{\CurrentOption}{article}}
\ProcessOptions
\LoadClass[11pt,letterpaper]{article}
\newcommand{\@assignment}{Assignment \#}
\newcommand{\assigntitle}[1]{\edef\@assignment{Assignment \#{#1}}}
\AtBeginDocument{%
\begingroup
\centering
\huge \upshape \@assignment
\medskip
\normalsize \normalfont \@date
\bigskip
\endgroup
}
\endinput
driver.tex
\documentclass{Assignment}
\assigntitle{4}
\begin{document}
\end{document}
答案3
这是一个“先有鸡还是先有蛋”的问题:对于此代码,你必须声明\assigntitle{4}
前 \begin{document}
。
另一种可能更好的策略是\maketitle
:
\ProvidesClass{Assignment}
\NeedsTeXFormat{LaTeX2e}
\DeclareOption*{\PassOptionsToClass{\CurrentOption}{article}}
\ProcessOptions
\LoadClass[11pt,letterpaper]{article}
\newcommand{\@assignment}{Assignment \#}
\newcommand{\assigntitle}[1]{\renewcommand{\@assignment}{Assignment \#{#1}}}
\renewcommand\maketitle{%
\begingroup % <----- don't forget this one
\centering \huge \upshape \@assignment \\
\normalsize \normalfont \@date
\bigskip
\endgroup % <----- matching \begingroup
}
\endinput
现在您的示例文档可以采用以下两种形式中的任意一种
\documentclass{Assignment}
\assigntitle{4}
\begin{document}
\maketitle
\end{document}
或者
\documentclass{Assignment}
\begin{document}
\assigntitle{4}
\maketitle
\end{document}
您可以\date{July 28, 2016}
在 之前的任何位置添加\maketitle
。
如果您不想继续整个文档,则我添加的\begingroup
和标记是必需的。\endgroup
\centering
如果仍然需要\maketitle
,请对生成标题的命令使用不同的名称。
请注意,不建议使用排版材料\AtBeginDocument
,因为用户在声明类后可能会添加的几个包使用该钩子执行其业务,因此它们会采取行动后页眉已排版。