我正在尝试为我创建或收集的大多数样式设置一组模板。现在,我正在使用一堆带有的 LaTeX 文件并\input{}
使用设置变量\def
。我希望实现的是让模板设置根据发送的变量执行一系列步骤。例如。
我的主文档的前几行会有类似的内容。
\def\doctype{letter} % this could also be a book, article, beamer presentation, etc.
\input{template-setup}
根据 ,doctype
我想让我的模板设置选择正确的文档类。我知道xstring
或xifthen
包,但由于我想使用 变量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
您可以定义保存不同值(,等)的宏letter
,book
然后使用进行\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>}
,然后包含该类所需的设置。