我正在尝试制作一个类文件来帮助我起草俱乐部章程,但我遇到了问题\includegraphics
。我希望能够使用\logo
命令(参见类文件)定义俱乐部徽标,并可以选择将选项传递给\includegraphics
,但它不起作用。
类文件:
\ProvidesClass{bylaws_min}[2012/10/27 version 0.01 "alpha" Bylaws]
\NeedsTeXFormat{LaTeX2e}
\RequirePackage[margin=1in]{geometry}% Sets page margins
\RequirePackage{graphicx}% Allows adding images to documents
\newcommand{\logo}[2][\@empty]{\def\@logoopts{#1}\def\@logoimage{#2}}
\renewcommand{\maketitle}{%
\begin{center}
\ifx\@empty\@logoopts\includegraphics{\@logoimage}\else\includegraphics[\@logoopts]{\@logoimage}\fi
\end{center}%
}
文档文件:
\documentclass{bylaws_min}
\logo[scale=2]{imagefile.jpg}
\begin{document}
\maketitle
\end{document}
我已经尝试了两者\logo[scale=2]{imagefile.jpg}
(或除 之外的其他选项scale=2
),或者只是\logo{imagefile.jpg}
,并且我得到了这个错误的变化:
Package keyval Error: scale=2 undefined.
See the keyval package documentation for explanation.
Type H <return> for immediate help.
...
1.7 \maketitle
我已经研究了一段时间,似乎有两个问题。首先,\ifx
从不将\@logoopts
其视为\@empty
(换句话说,比较总是失败,并且语句总是发生)。其次,如果我像在中\else
一样明确创建图像,则一切都会正常,但如果我尝试将选项传递给它,则会失败。但将图像文件名传递给它总是有效的。\includegrahpics[scale=2]{imagefile.jpg}
\maketitle
\@logoopts
\@logoimage
答案1
不需要\@empty
作为默认参数。这只会增加额外的工作量。
\newcommand{\logo}[2][]{\def\@logoopts{#1}\def\@logoimage{#2}}
选项解析器需要明确的键值设置:
\expandafter\includegraphics\expandafter[\@logoopts]{\@logoimage}%
如果我没记错的话,那么\@logoimage
会被扩展一次graphics
。否则,它也必须被扩展才能解析文件名。
\expandafter\expandafter\expandafter\includegraphics
\expandafter\expandafter\expandafter[\expandafter\@logoopts\expandafter]%
\expandafter{\@logoimage}%
答案2
由于选项和图像文件必须是可扩展的,我们可以避免出现连锁反应\expandafter
。
\newcommand{\logo}[2][]{\def\@logoopts{#1}\def\@logoimage{#2}}
% Default setting, in case Ben User calls \maketitle without first calling \logo:
\logo{nofile}
\DeclareGraphicsExtensions{jpg}
\renewcommand{\maketitle}{%
\begin{center}%
\begingroup
\edef\x{\endgroup\noexpand\includegraphics[\@logoopts]{\@logoimage}}\x
\end{center}%
}