我想根据是否传递了特定的课程选项来有条件地执行某些操作(例如输入文件)。例如,我想为课程添加一个“讲师”选项,用于输入讲师笔记文件。例如:
\documentclass[instructor]{book}
\begin{document}
\if@instructor
\input{instructor-notes}
\fi
Rest of stuff
\end{document}
我可以在序言中加入一些代码来根据讲师选项是否传递给班级来设置某些东西(可能是 ifthen 布尔值?)吗?
我这样做的目的是让某人可以轻松地更改文件以包含书中的讲师部分。如果我上面尝试做的事情是一种丑陋的方式,我很想听听一种更优雅的方式!
答案1
套餐和课程选项通常只对特定课程或套餐有意义。书籍课程没有讲师选项。如果你要根据书籍制作自己的课程,那么就很简单了。它应该是这样的
\newif\if@instructor
\@instructorfalse
\DeclareOption{instructor}{\@instructortrue}
\ProcessOptions\relax
然后您可以\if@instructor
在文档中使用(尽管您需要\makeatletter
先使用,因此最好省略@
)。
如果你没有创建自己的课程,那么最简单的方法就是
\newif\if@instructor
\@instructortrue % or \@instructorfalse depending on which you want
在你的序言中。
答案2
另外,班级选项会传递给包,因此如果您不想修改类,但想模拟您描述的情况,您可以编写一个新包,例如instructor.sty
,并让它使用该选项执行某些操作instructor
。(您会收到一条警告,提示该类不知道如何处理该instructor
选项。)
如果您的目标是让最终用户尽可能轻松地完成此操作,我会在包中创建许多命令,instructor.sty
如果给出选项,则执行一件事instructor
,否则执行其他操作,而不是\if ... \fi
在文档中放置大量命令。因此,例如,您可以有一个命令\instructorinput{filename}
,如果给出选项,则输入文件名instructor
,否则不执行任何操作。例如:
\ProvidesPackage{instructor}
\DeclareOption{instructor}{
\renewcommand{\instructorinput}[1]{\input{#1}}
}
\newcommand{\instructorinput}[1]{}
\ProcessOptions
不过,我应该说,就代码而言,TH 的答案可能是最简单的方法。
(还,如何取消定义已处理的类选项?是一个稍微相关的问题,可能包含一些有帮助的信息)