我正在根据自己的需求定制论文文档类。我正在尝试更新\maketitle
修改标题页的命令,但面临两个问题:
我希望为标题页中的徽标定义一个新命令。如果没有用户定义的参数,则应将一个名为“logo.pdf”的默认值传递给命令
\includegraphics
以加载默认徽标。\newcommand{\logo}[1][logo.pdf]{\includegraphics[width=40mm]{#1}}
它是否正确?
我的类文件似乎有问题,因为我一直收到错误
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
一些观点:
\makeatletter
并且\makeatother
类和样式文件中不要求提供。如果您提供,则没有问题。- 参见
\@logo
上面的定义。如果你没有\logo
在 TeX 文件中提供命令,它将被用作默认值,否则\logo
命令将\@logo
使用你在 TeX 文件中提供的新文件重新定义。 \@logo
诸如、\@college
、\@degree
等命令\@university
未在内部定义\maketitle
,这导致了错误。我已在各自的宏中添加了这些命令。- 诸如
\it
、、\bf
等命令\sl
现在已经过时,我们需要使用\itshape
、、\bfseries
等\slshape
。
否则,这是一个很好的开始!
答案2
是的,但可能有更好的方法。为什么?好吧,你创建了
\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
(无论它是什么)。\@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
。您可以自行选择。