正在使用哪种文档类别?

正在使用哪种文档类别?

有没有办法以编程方式确定哪个文档类别有效?

我希望能够编写根据当前正在使用的文档类别而表现不同的条件宏。

答案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

相关内容