Detect LaTeX class name
I'm working on a LaTeX package which might need to do some things differently depending on the class that's being used. I'm wondering if there's a way to 开发者_运维百科auto-detect or test the document class.
One could certainly look up the class files and test for the existence of a specific macro defined by that class, but is there a smarter way? I looked at the definition of the \ProvidesClass
macro and can't see if it saves the class name anywhere except \@currname
. I believe \@currname
is just the name of the current package or class being read.
Basically I want to execute
\author{\longauthorname}
in the article
class but
\author[\shortauthorname]{\longauthorname}
in the beamer
class.
After refining my question I'll show how I answered it. Along the lines of what dmckee was saying. Just test for the functionality.
\ifcsname beamer@author\endcsname
\author[\shortauthorname]{\longauthorname}
\else
\author{\longauthorname}
\fi
\ifcsame
is available on all e-TeX builds and is documented (along with other ways to check if a command is defined) here.
You can't check for the actual signature of the \author
macro (i.e., does it take an optional argument?) but you can check for some of the auxiliary macros defined to implement optional arguments. \beamer@author
is one of those in the beamer
class.
IMHO, you should not check the name of your class (or version). You should check the functionality.
For example, class article
has \@titlepagefalse
and
class book
has \@titlepagetrue
.
Write
\if@titlepage yes \else no \fi
and recognize the presence of title page.
There is an easy test for the loaded document class: \@ifclassloaded{beamer}{<true>}{<false>}
Short example:
%\documentclass{article}
\documentclass{beamer}
\newcommand{\longauthorname}{foo}
\newcommand{\shortauthorname}{bar}
\makeatletter
\@ifclassloaded{beamer}{%
\author[\shortauthorname]{\longauthorname}
}{
\author{\longauthorname}
}
\makeatother
\begin{document}
test
\end{document}
精彩评论