使用字符串条件确定文档类别

使用字符串条件确定文档类别

我正在尝试为我创建或收集的大多数样式设置一组模板。现在,我正在使用一堆带有的 LaTeX 文件并\input{}使用设置变量\def。我希望实现的是让模板设置根据发送的变量执行一系列步骤。例如。

我的主文档的前几行会有类似的内容。

\def\doctype{letter} % this could also be a book, article, beamer presentation, etc.
\input{template-setup}

根据 ,doctype我想让我的模板设置选择正确的文档类。我知道xstringxifthen包,但由于我想使用 变量doctype来选择正确的文档类,这是不可能的(因为您不能使用 之前的包\documentclass)。有人能帮帮我吗?

答案1

我将使用一个通用类文件,该文件可以加载特定类作为选项,并为所有不同的类创建布尔类型测试。以下只是第一次尝试。它可以通过键值等进行增强。

编辑1:添加命令\ClassList来提供您自己的班级列表。

%%%% generalclass.cls %%%%

\NeedsTeXFormat{LaTeX2e}[1995/12/01]
\ProvidesClass{generalclass}[2012/04/19 v0.1 General class (DNJ ELS)]

\RequirePackage{etoolbox}

\newcommand*\DeclareClassList[2]{%
    \def\@clsopt@select{#1}%-------------------- default class
    \edef\@clsopt@list{\zap@space#2 \@empty}%--- list of classes
    \@for\@clsopt@item:=\@clsopt@list\do{%
        \newbool{@clsopt@test@\@clsopt@item}%
        \csedef{@clsopt@def@\@clsopt@item}{%
            \def\noexpand\@clsopt@select{\@clsopt@item}}}
    \edef\@currclass@opt{\@ptionlist{\@currname.\@currext}}%
    \@for\CurrentOption:=\@currclass@opt\do{%--- Go through documents options
        \ifcsdef{@clsopt@def@\CurrentOption}{%
            \csuse{@clsopt@def@\CurrentOption}%
            \csdef{ds@\CurrentOption}{}%
            \@use@ption}{}}}

\newcommand*\ThisClass{}
\newcommand\SetClassOption{%
    \edef\@clsopt@temp{%
        \noexpand\booltrue{@clsopt@test@\@clsopt@select}%
        \def\noexpand\ThisClass{\@clsopt@select}}%
    \@clsopt@temp}

\newcommand\IfClass[3]{%
    \ifbool{@clsopt@test@#1}{#2}{#3}}

%----------------------------------------------------------------------
\providecommand*\ClassDefault{article}                   % Edit 1
\providecommand*\ClassList{article,report,book,letter}   % Edit 1
\DeclareClassList{\ClassDefault}{\ClassList}             % Edit 1 
\SetClassOption

\DeclareOption*{\PassOptionsToClass{\CurrentOption}{\ThisClass}}
\ProcessOptions\relax
\LoadClass{\ThisClass}
\endinput

然后可以按如下方式使用它:

\newcommand*\DocType{memoir}
\newcommand*\FontSize{10pt}
\newcommand*\PaperSize{a4paper}

%---- [ Put this in template for \input{} ] -------------
\newcommand*\ClassList{article,report,book,letter,memoir}
\documentclass[\DocType,\FontSize, \PaperSize]{generalclass}
%% Usage
%\IfClass{article}{..<true>..}{..<false..}
%\IfClass{report}{..<true>..}{..<false..}
%\IfClass{book}{..<true>..}{..<false..}
%\IfClass{letter}{..<true>..}{..<false..}
%\IfClass{memoir}{..<true>..}{..<false..}
%---- [ End template ] ----------------------------------

\begin{document}
    This class is: \ThisClass \par
    This is \IfClass{article}{an}{not an} article class document\par
    This is \IfClass{report}{a}{not a} report class document\par
    This is \IfClass{book}{a}{not a} book class document\par
    This is \IfClass{letter}{a}{not a} letter class document\par
    This is \IfClass{memoir}{a}{not a} memoir class document\par
\end{document}

答案2

您可以定义保存不同值(,等)的宏letterbook然后使用进行\doctype比较\ifx\firstmacro\secondmacro <equal> \else <not equal> \fi

\def\doctype{letter} % this could also be a book, article, beamer presentation, etc.
% ..
\def\doctypeletter{letter}
\def\doctypebook{book}
% ...

\ifx\doctype\doctypeletter
  % doctype is 'letter'
\else
\ifx\doctype\doctypebook
  % doctype is 'book'
\fi
\fi

请注意,也可以(但并不总是推荐)使用\RequirePackage而不是 来在类之前加载包\usepackage


您还可以创建自己的类文件,使用其加载真实的类\LoadClassWithOptions{<real class>},然后包含该类所需的设置。

相关内容