我正在寻找为其他包提供附加选项的可能性。
我已经尝试过了\PassOptionsToPackage
。
我的想法是我可以使用类似的东西\documentclass[hyperref={bookmarksnumbered=true}]{asjgdhoia}
。
cls 文件:
\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{asjgdhoia}[2012/02/10 Mini class for testing proposal]
\RequirePackage{ifthen}
\newboolean{isDraft}
\setboolean{isDraft}{false}
\DeclareOption{hyperref}{\PassOptionsToPackage{\CurrentOption}{hyperref}}
\DeclareOption*{\PassOptionsToClass{\CurrentOption}{scrartcl}}
\ProcessOptions\relax
\LoadClass[fontsize=11pt,twoside=false,paper=a4,numbers=noenddot,captions=tableheading]{scrartcl}
\usepackage[pdfdisplaydoctitle=true,%
pdfstartview={Fit},%
bookmarksopen,%
colorlinks=true,%
linkcolor=black,%
urlcolor=black,%
citecolor=black]%
{hyperref}
tex 文件:
\documentclass{asjgdhoia}
\begin{document}
\section{Test}
{
\raggedright
Finally there is a simple solution using \textsc{\textbf{XMLResource.OPTION\_RECORD\_UNKNOWN\_FEATURE}} option. And the
text must go on \ldots.
\par
And another example the show must go on, but we have too less text (\textbf{createUnspecifiedNodeWarningMarker} and
\textbf{createUnspecifiedNodeErrorMarker}, sdjklashjksa \textbf{createUnspecifiedLinkWarningMarker} and
\textbf{createUnspecifiedLinkErrorMarker}).
}
\end{document}
答案1
你想设置一个所谓的核心价值语法。LaTeX 默认不支持该语法。您必须使用 keyval 包。
问题每个 keyval 包的大列表列出所有 keyval 包。
使用示例可以在这里找到:
我相信您还会发现更多相关问题。
我不想提供一个例子,因为你应该用你最喜欢的 keyval 包问一个单独的问题。
顺便说一下,documentclass 的选项将被传递给每个加载的包:
\RequirePackage{filecontents}
\begin{filecontents*}{asjgdhoia.cls}
\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{asjgdhoia}[2012/02/10 Mini class for testing proposal]
\RequirePackage{ifthen}
\newboolean{isDraft}
\setboolean{isDraft}{false}
%\DeclareOption{hyperref}{\PassOptionsToPackage{#1}{hyperref}}
\DeclareOption*{\PassOptionsToClass{\CurrentOption}{scrartcl}}
\ProcessOptions\relax
\LoadClass[fontsize=11pt,twoside=false,paper=a4,numbers=noenddot,captions=tableheading]{scrartcl}
\usepackage[pdfdisplaydoctitle=true,%
pdfstartview={Fit},%
bookmarksopen,%
% colorlinks=true,%
linkcolor=black,%
urlcolor=black,%
citecolor=black]%
{hyperref}
\end{filecontents*}
\documentclass[colorlinks=true]{asjgdhoia}
\begin{document}
\section{Test}\label{foo}
\ref{foo}
\end{document}
答案2
带花括号的全局选项:
\documentclass[hyperref={bookmarksnumbered=true}]{asjgdhoia}
如果该类加载了 KOMA-Script 类,则将无法工作,因为 KOMA-Script 在处理选项时存在限制/错误。
但可以支持以下语法:
\documentclass[hyperref=bookmarksnumbered=true]{asjgdhoia}
包kvoptions
处理类和包的键值选项,包kvsetkeys
定义一个不会被多个等号混淆的键值解析器。第一个等号将键与值分开。
班级asjgdhoia
:
\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{asjgdhoia}[2012/02/10 Mini class for testing proposal]
\RequirePackage{ifthen}
\newboolean{isDraft}
\setboolean{isDraft}{false}
\RequirePackage{kvoptions}
\RequirePackage{kvsetkeys}
\SetupKeyvalOptions{
family=asjgdhoia,
prefix=asjgdhoia@,
setkeys=\kvsetkeys,
}
% hyperref options:
\define@key{asjgdhoia}{hyperref}{%
\PassOptionsToPackage{#1}{hyperref}%
}
% bookmark options:
\def\asjgdhoia@bookmark{% default setting
open,%
numbered%
}
\define@key{asjgdhoia}{bookmark}{%
\g@addto@macro\asjgdhoia@bookmark{,#1}%
}
\DeclareLocalOptions{bookmark}
\DeclareDefaultOption{%
\PassOptionsToClass{\CurrentOption}{scrartcl}%
}
\ProcessKeyvalOptions*
\PassOptionsToPackage{paper=a4}{typearea}
\LoadClass[
fontsize=11pt,
twoside=false,
numbers=noenddot,
captions=tableheading
]{scrartcl}
\usepackage[
pdfdisplaydoctitle=true,%
pdfstartview={Fit},%
]{hyperref}[2011/02/05]
\usepackage{bookmark}
\expandafter\bookmarksetup\expandafter{\asjgdhoia@bookmark}
\endinput
评论:
- 有一个新的
hyperref
选择hidelinks
。 - 添加了包
bookmark
(更多功能,更少甚至不需要 LaTeX 重新运行)。 option 的处理
bookmark
展示了 的方法的替代方法\PassOptionsToPackage
。如果 options 被多次调用,则选项将像 option 中一样连接起来hyperref
。如果 option 应该覆盖先前的选项设置,则bookmark
可以按如下方式定义 option:\DeclareStringOption{bookmark}
选项
paper=a4
已传递给包typearea
。
答案3
关于使用相同选项名称的包的问题,在这种情况下没有问题。如果你使用键值包,您只需谨慎使用\ProcessOptionsX*
,特别是在类文件中。请参阅文档第 19 页键值以包为例。以下是其中的一段引文:
在类文件中使用
\ProcessOptionsX*
可能会比较棘手,因为该类也可能被用作另一个使用 的包或类的基础\LoadClass
。在这种情况下,根据文档类的选项系统,使用 加载的类的行为\LoadClass
可能会与使用 加载的情况有所不同\documentclass
。但是,由于从技术上讲可以创建两个协作的类,因此键值\ProcessOptionsX*
包允许在类文件中使用 。请注意,使用 LaTeX 的
\ProcessOptions
或\ProcessOptions*
,类文件无法复制文档类选项。如果您想验证您的类是否已加载\documentclass
或\LoadClass
,您可以使用\XKV@documentclass
包含当前文档类的宏。
有许多键值解析器(请参阅以下列表一大串键值包),下面我对其中的一些提出一些看法。
键值
对于键值包,您可能需要注意以下几点:
这键值包有许多有趣的功能,例如使用指针、预设和后设置密钥、家族过滤以及rm
根据需要多次设置(剩余密钥)。它在计算资源利用率方面也很高效。要定义和设置密钥,它的运行时间比鍵盤,并且它定义的宏比鍵盤。
但是,像每个软件包一样,它也有一些缺点(如果这个词在这里用得合适的话)。它的一些缺点包括:
之前无法加载
\documentclass
,但你可以加载键盘阅读器包之前\documentclass
。键盘阅读器包重新定义了一些内部内容键值并提供前端键值。这不是一个严重的缺点,但是键值包不能接受带有参数字符的默认值。也许 David Carlisle 最初的键值系统想法排除了此功能的需要。例如,以下 (A) 失败。
它会删除键值中最多三层的外部括号。如果保留括号对您来说很重要,那么您需要用额外的括号填充键值。
它的堆栈管理系统还有改进的空间。为了允许
\setkeys
无限重入(Oberdiek 测试),它在\setkeys
调用 之前保存了 的当前“状态向量”\setkeys
。这样做的方式是键值效率不高:每次调用时,都要进行两次构建堆栈的迭代(一次用于推送堆栈,一次用于弹出堆栈)\setkeys
。键盘阅读器包仅使用一次迭代来向下和向上移动堆栈。\CurrentOption
状态向量中缺少宏键值的\setkeys
。当 嵌套时,这可能会导致问题\setkeys
。在这方面,我有过不愉快的经历。该软件包的 v2.6b 版本(2012/10/14)更正了这一遗漏。不同于鍵盤, 这键值软件包没有提供 (a) 在设置键时扩展键的值、(b) 在运行时更新现有键的回调、(c) 样式/观察者键、(d) 多参数回调、(e) 系列过滤 - 尽管它有通过 rm 键进行键过滤的功能。这些功能由版本 1.1 (2012/08/01) 的斯基瓦尔包裹。
它
selective sanitization
为应对 babel 而部署的 Uwe Kern 方案还有改进空间。它比search-replace
清理方案更昂贵。的发展键值自 2008 年起已停止使用。版本 v2.6b(2012/10/14)修正了一些错误,但没有提供新功能。
代碼(A):
\define@key[KV]{fam}{key1}[\def\x##1{*##1*}]{}
\setkeys[KV]{fam}{key1}
代碼 (B):
\setkeys[KV]{fam}{key2=\dimexpr\usevalue{key1}*5\relax}
鍵盤
对于鍵盤包,您可能需要注意以下几点:
系统
handler
鍵盤是一个很棒的景点,但您需要一些经验才能有效地使用它。由于此功能和 pgf/tikz 图形包,鍵盤尽管其计算开销相对较高,但仍然很受欢迎。如果巴别塔加载了某些选项,密钥解析鍵盤可能会失败,除非你加载密钥包裹。
鍵盤包本身不处理包或类选项。对于选项处理,您需要普格福普特包裹。
这是个人观点。我发现使用 key 和 family 过滤不太方便鍵盤比键值和斯基瓦尔包。将会很有趣鍵盤' 处理程序机制实现键值软件包或具有类似语法的支持软件包。这是由版本 1.1(2012/08/01)的斯基瓦尔包。使用斯基瓦尔包中,您只需调用处理程序即可过滤出键、系列或路径
.ignore
。例如,\directkeys{ % Start off on two separate paths: .paths = {KV1/fam1,KV2/fam2}, .initialize keys after define, .define keys = { .exec code = \def\iden#1{#1}, % Define 1 ordinary key. Only the keyname field is mandatory, but % we have filled all the fields here: .ord/key1/default1/\def\codeA##1{#1*##1}, % Define 2 choice keys with the same attributes. Choice keys can have % default value, state pattern or binding set, code for valid value, and % code for illegal value. Only the keyname field is mandatory. .choice/{key2,key3}/justified/{ center.do=\def\curralign##1{\hfil##1\hfil}, right.do=\def\curralign##1{\hfill##1}, left.do=\def\curralign##1{##1\hfill}, justified.do=\let\curralign\iden }/\def\codeB##1{#1**##1}/ \let\curralign\iden \typeout{Value of key `\skvcurrentkey' is invalid; `justified' assumed} , % The starred (*) form of choice key will always use the lowercase of the % user input to match the singleton: .choice*/key4/{A/X}/{ A/X.do=\def\currcolor{blue}, A/Y.do=\def\currcolor{green}, B/X.do=\def\currcolor{red}, B/Y.do=\def\currcolor{magenta} }/\def\val{Value of key4: #1} }, .exec code = \def\acenter{center}, % In Java speak, keya and keyb are subjects of the observer key1. % The observer can subscribe to attributes of the subject. In the % following example, the observer (key1) asks to be notified of the value % of the subject: .style = {keya,keyb}/key1=#1, % Don't set key1 and key2 on path KV1/fam1: .ignore path = KV1/fam1, % Ignore key3 and key4 on all active paths: .ignore keys = {key3,key4}, .set keys = { % Check the logfile for a warning about the invalid value of key2: key1=value1, key2=value2, key3=.expand once{\acenter} }, .restore keys = {key3,key4}, .restore path = KV1/fam1 }