我见过诸如 之类的包选项,geometry
它允许用户指定具有特定值的选项。例如,\usepackage[margin=1in]{geometry}
将用于1in
左右边距。这可以在我自己的自定义类中实现吗?假设我想在类中指定边距,例如\documentclass[margin=1in]{myclass}
。我该怎么做?我知道如何传递常规选项,例如option
,但不知道如何传递具有值的选项,例如option=value
。
答案1
对于旧版本,提供此功能的软件包可用,但在当前版本中它是内置的,请参阅 ltnews35。
myc.cls
\NeedsTeXFormat{LaTeX2e}[2022-06-01]
\ProvidesClass{myc}[2022-06-17]
\RequirePackage{xcolor}
\DeclareKeys{
color.code = \colorlet{foocol}{#1},
val.store = \fooval
}
\SetKeys{
color =black,
val=0
}
\ProcessKeyOptions
\setlength\textwidth{6cm}
\setlength\textheight{8cm}
\renewcommand\normalsize{\fontsize{10}{12}\selectfont}
file.tex
\documentclass[color=red,val=42]{myc}
\begin{document}
\textcolor{foocol}{one} $x=\fooval$
\end{document}
答案2
mycls.cls
\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{mycls}[2022-06-17]
\LoadClass{article}
\RequirePackage{l3keys2e}
\ExplSyntaxOn
\keys_define:nn{test}
{
name.tl_set:N = \l_name_tl,
age.int_set:N = \l_age_int,
}
\ProcessKeysOptions{test}
\def\myinfo{my~name~is~\tl_use:N \l_name_tl,and~i~am~\int_use:N \l_age_int ~years~old.}
\ExplSyntaxOff
main.tex
\documentclass[name = {ljguo},age = 12]{mycls}
\begin{document}
\myinfo
\end{document}
答案3
以下使用expkv-opt
(并使用expkv-def
前端定义键)。
myc.cls
\ProvidesClass{myc}[2022-06-18]
\RequirePackage{xcolor}
\RequirePackage{expkv-opt,expkv-def}
\ekvdefinekeys{myc}
{%
code color = \colorlet{foocol}{#1}
,initial color = black
,store val = \fooval
,initial val = 0
,store size = \foosize
,initial size = 10
}
\ekvoProcessGlobalOptions{myc}
\ekvoProcessLocalOptions{myc}
\renewcommand\normalsize
{%
\fontsize{\foosize}{\strip@pt\dimexpr1.2\dimexpr\foosize pt\relax\relax}%
\selectfont
}
\newcommand*\myctest
{\rule{.4pt}{7pt}Options were: \textcolor{foocol}{\fooval}\rule{.4pt}{7pt}}
file.tex
\documentclass[color=red, val=42, size=14]{myc}
\begin{document}
\myctest
\end{document}
结果: