\newcommand 中的默认值和更新 \maketitle

\newcommand 中的默认值和更新 \maketitle

我正在根据自己的需求定制论文文档类。我正在尝试更新\maketitle修改标题页的命令,但面临两个问题:

  1. 我希望为标题页中的徽标定义一个新命令。如果没有用户定义的参数,则应将一个名为“logo.pdf”的默认值传递给命令\includegraphics以加载默认徽标。

    \newcommand{\logo}[1][logo.pdf]{\includegraphics[width=40mm]{#1}}
    

    它是否正确?

  2. 我的类文件似乎有问题,因为我一直收到错误Undefined control sequence in \maketitle。以下是我的文档类:

mythesis.cls

\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{mythesis}[2013/07/25 v1.0 My thesis class]
\LoadClass[a4paper]{report}

\RequirePackage{graphicx} % needed for logo and pictures

\newcommand{\logo}[1][logo.pdf]{\includegraphics[width=40mm]{#1}}
\newcommand{\college}[1][My School]{{#1}}
\newcommand{\degree}[1][My degree]{{#1}}
\newcommand{\university}[1][My university]{{#1}}

\newenvironment{alwayssingle}{%
       \@restonecolfalse
       \if@twocolumn\@restonecoltrue\onecolumn
       \else\if@openright\cleardoublepage\else\clearpage\fi
       \fi}%
       {\if@restonecol\twocolumn
       \else\newpage\thispagestyle{empty}\fi}

\makeatletter
\renewcommand\maketitle{
\begin{alwayssingle}
    \begin{center}
        {\Huge {\bfseries {\@title}} \par}
        {\large \vspace*{10mm} {\@logo \par} \vspace*{15mm}}
        {{\Large \bf \@author} \par}
        {\large \vspace*{1ex} {{\@college} \par}
        {\large \@university \par}
        {\Large \it {\@degree} \par}
        \vspace*{2ex}
        {\today}}
    \end{center}
\null\vfill
\end{alwayssingle}
}
\makeatother

thesis.tex

\documentclass[12pt]{mythesis}

\begin{document}
\title{My research}
\author{My name}
\logo{logo_new.pdf}
\maketitle
\end{document}

任何帮助都将不胜感激。PS:我是新手,特别是在文档类创建方面。

答案1

您的两个问题都在下面提供的编辑类文件中得到解决:

\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{mythesis}[2013/07/25 v1.0 My thesis class]
\LoadClass[a4paper]{report}

\RequirePackage{graphicx} % needed for logo and pictures

\let\@college\@empty
\let\@degree\@empty
\let\@university\@empty
\def\@logo{\includegraphics[width=40mm]{logo.pdf}}
\newcommand{\logo}[1]{\gdef\@logo{\includegraphics[width=40mm]{#1}}}
\newcommand{\college}[1][My School]{\gdef\@college{#1}}
\newcommand{\degree}[1][My degree]{\gdef\@degree{#1}}
\newcommand{\university}[1][My university]{\gdef\@university{#1}}

\newenvironment{alwayssingle}{%
       \@restonecolfalse
       \if@twocolumn\@restonecoltrue\onecolumn
       \else\if@openright\cleardoublepage\else\clearpage\fi
       \fi}%
       {\if@restonecol\twocolumn
       \else\newpage\thispagestyle{empty}\fi}

\renewcommand\maketitle{
\begin{alwayssingle}
    \begin{center}
        {\Huge\bfseries\@title\par}
        {\vspace*{10mm}\par\@logo\par\vspace*{15mm}}
        {\Large\bfseries\@author\par}
        {\ifx\@college\@empty\else\large\vspace*{1ex}\par\@college\par\fi}
        {\ifx\@university\@empty\else\large\@university\par\fi}
        {\ifx\@degree\@empty\else\Large\itshape\@degree\par\fi}
        \vspace*{2ex}
        {\today}
    \end{center}
\null\vfill
\end{alwayssingle}
}
\endinput

一些观点:

  1. \makeatletter并且\makeatother类和样式文件中不要求提供。如果您提供,则没有问题。
  2. 参见\@logo上面的定义。如果你没有\logo 在 TeX 文件中提供命令,它将被用作默认值,否则\logo命令将\@logo使用你在 TeX 文件中提供的新文件重新定义。
  3. \@logo诸如、\@college\@degree等命令\@university未在内部定义\maketitle,这导致了错误。我已在各自的宏中添加了这些命令。
  4. 诸如\it、、\bf等命令\sl现在已经过时,我们需要使用\itshape、、\bfseries\slshape

否则,这是一个很好的开始!

答案2

  1. 是的,但可能有更好的方法。为什么?好吧,你创建了\logo[<logo>]一个可选参数,但你永远不会调用\logo 没有一个参数,以便它采用默认值。也就是说,它应该logo.pdf默认采用默认值,而不执行任何其他操作。也许使用

    \makeatletter
    \newcommand{\logo}[1]{\def\@logoname{#1}}\logo{logo.pdf}
    \def\@logo{\includegraphics[width=40mm]{\@logoname}}
    \makeatother
    

    会有所帮助。这将创建 ,\logo{<logo>}它将它的参数存储在 中\@logoname。然后立即将默认值设置为logo.pdf,随后将其定义\@logo\@logoname(无论它是什么)。

  2. \@college与上面类似,您需要定义未知宏、\@university和函数的方式\@degree。也许您可以对这些做类似的事情:

    \makeatletter
    \newcommand{\college}[1]{\def\@collegename{#1}}\college{My college}
    \def\@college{\@collegename}
    \newcommand{\university}[1]{\def\@universityname{#1}}\university{My university}
    \def\@university{\@universityname}
    \newcommand{\degree}[1]{\def\@degreename{#1}}\degree{My degree}
    \def\@degree{\@degreename}
    \makeatother
    

    在这种情况下,使用\@college作为别名\@collegename有点多余,因此您可以\@collegename在构造中直接使用\maketitle。您可以自行选择。

相关内容