类文件中的 \newcommand 和 \renewcommand 难度

类文件中的 \newcommand 和 \renewcommand 难度

我正在制作一个“作业”类文件。我的课程的一个元素无法正常工作。我希望能够在 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,因为用户在声明类后可能会添加的几个包使用该钩子执行其业务,因此它们会采取行动页眉已排版。

相关内容