我正在编写一个基于的简单类article
,它加载一些常用的包并设置一些默认值。文档字体应该是一个key=value
选项\documentclass{myarticle}
。例如,font=charter
和font=utopia
分别font=libertine
将字体设置为Charter、Utopia 和 Linux Libertine。Charter 应该是默认值(直接传递font
是不可能的)。我在使用kvoptions
包进行设置时遇到了问题。如果我理解正确的话,我应该使用\DeclareStringOption[charter]{font}[]
设置charter
为未指定默认值的默认值font=
,但我不确定在哪里声明其他选项。在文档中我看到了函数\SetupKeyvalOptions{}
,但我不明白familiy
、prefix
和setkeys
的意思。文档对此并不清楚(至少对于以前从未做过这种事的人来说不清楚)。
我想把设置字体所需的行放在某种if
else
语句中。我看过这个ifthen
包,但我不知道如何将它与结合起来kvoptions
。此外,它似乎ifthen
需要嵌套不同的语句(对吗?),这很快就会变得混乱,因为我有更多的字体选项。
以下是我现在所拥有的myarticle.cls
:
\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{myarticle}[2020/07/28 Custom article class]
\LoadClass{article}
\RequirePackage{kvoptions}
\SetupKeyvalOptions{
family = font,
prefix = font@
}
\DeclareStringOption[charter]{font}
\ProcessKeyvalOptions*
\iffont@charter
\RequirePackage[charter]{mathdesign}
\else\iffont@utopia
\RequirePackage[adobe-utopia]{mathdesign}
\else
\RequirePackage{libertine,libertinust1math}
\fi
和main.tex
:
\documentclass[font=utopia]{myarticle}
\usepackage[utf8]{inputenc}
\begin{document}
Content...
\end{document}
问题是我不知道如何评估 if 语句中的选项。您只能评估真/假语句吗?
PS:我也有点困惑\iffam
PS. 我对看到的命令这里\if
(第 112 页)。和之间的组合如何起作用fam
?
编辑:
我已改为myarticle.cls
:
\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{myarticle}[2020/07/28 Custom article class]
\LoadClass{article}
\RequirePackage{kvoptions}
\RequirePackage{etoolbox}
\SetupKeyvalOptions{family = opt, prefix = opt@}
\DeclareStringOption[charter]{font}
\ifdefstring{\opt@font}{charter}{\RequirePackage[charter]{mathdesign}}{}
\ifdefstring{\opt@font}{utopia}{\RequirePackage[utopia]{mathdesign}}{}
\ifdefstring{\opt@font}{libertine}{\RequirePackage{libertine,libertinust1math}}{}
\ifdefstring{\opt@font}{lmodern}{\RequirePackage{lmodern}}{}
\ProcessKeyvalOptions{opt}
现在更改默认设置\DeclareStringOption
会更改文档字体,但设置另一个选项则\documentclass
没有效果。
编辑2:\ProcessKeyvalOptions{opt}
直接移至下方\DeclareStringOption[charter]{font}
解决了我的问题。不过,我还是想知道这是否是一种“好”的方法。