有没有办法以编程方式确定哪个文档类别有效?
我希望能够编写根据当前正在使用的文档类别而表现不同的条件宏。
答案1
您需要 LaTeX 核函数\@ifclassloaded
:
\makeatletter%
\@ifclassloaded{<someclass>}%
{<true code>}%
{<false coode>}%
\makeatother%
答案2
如果您的包执行,\@getclass
则当前类名将被存储在其中\@currentclass
,然后您可以根据需要进行测试或打印(这可能比使用\@ifclassloaded
需要提前提供类名的方法更通用)。您可以\@getclass
像这样定义
\def\@getcl@ss#1.cls#2\relax{\def\@currentclass{#1}}
\def\@getclass{\expandafter\@getcl@ss\@filelist\relax}
并使用如下方式:
\@getclass
\typeout{this document uses \@currentclass\space class}
答案3
实际上,类加载时会使用与包相同的内部宏(两者正式名称均为“带选项的文件”),而 LaTeX 不会将类文件名存储在特定宏中。因此,您无法直接测试使用了哪个类,只能测试是否使用了特定类\@ifclassloaded{<class>}{<true>}{<false>}
(之前已在回答中提到)。
还请记住,一个类可以通过使用\LoadClass
或加载另一个类来基于另一个类\LoadClassWithOptions
。在这种情况下,\@ifclassloaded
两者都适用。但是据我所知,标准类不基于任何其他类。
答案4
我想到了以下场景,虽然在实践中不可取,但在理论上却很有趣。David Carlisle 的解决方案在这种情况下仍然有效,但并没有说明全部情况。
% Class file:
\ProvidesClass{testclass}[2012/02/05 v0.1 A test article class (AM)]
\NeedsTeXFormat{LaTeX2e}[2011/06/27]
\RequirePackage{catoptions}
\XDeclareOption*{%
\ClassWarning{testclass}{Unknown option '\CurrentOption' ignored}%
}
\XProcessOptions*\relax
\endinput
% Document file:
\LoadClass[11pt]{article}
\documentclass{testclass}
\begin{document}
x
\end{document}
David Carlisle 的解决方案
\def\@getcl@ss#1.cls#2\relax{\def\@currentclass{#1}}
\def\@getclass{\expandafter\@getcl@ss\@filelist\relax}
\@getclass
\typeout{This document uses class: \@currentclass}
给出“article”作为类,而实际上用户需要的可能是“testclass”。所以我的方法是找到所有有效的类,然后可以采取进一步的行动:
\robust@def*\@getdocumentclass{%
\undefcs\currentclass
\docommalist*\@filelist{%
\filename@parse{##1}%
\ifxFT\filename@ext\@clsextension{}{%
\ifcsndefFT{opt@\filename@area\filename@base.\filename@ext}{}{%
\edef\currentclass{%
\csliststack,\currentclass
\filename@area\filename@base.\filename@ext
}%
}%
}%
}%
\ifdefTF\currentclass{%
\typeout{This document uses class(es) in this order: \currentclass}%
}{%
\@latex@info{Package '\@currname.\@currext' loaded before
\string\documentclass}%
}%
}
\robust@def*\getdocumentclass{%
\ifxTF\@filelist\relax{}{%
\ifxTF\@filelist\@gobble{}{%
\ifcsemptyTF\@filelist{}\@getdocumentclass
}%
}%
}
这可以简单地称为
\getdocumentclass