我正在开发一个包来keyreader
定义它的选项,但我无法将字体设置为选项。
\begin{filecontents}{myfonts.sty}
\ProvidesPackage{myfonts}
\usepackage{keyreader}
\krddefinekeys[TW]{fam}[my]{%
cmd/font/\sffamily/;
}
\krdProcessOptions*[TW]<fam>\relax
\end{filecontents}
\documentclass{article}
% works
\newcommand{\mymacro}{xx}% [L1]
% doesn’t work
\newcommand{\mymacro}{\ttfamily}% [L2]
\usepackage[font=\mymacro]{myfonts}% [L1,2]
% doesn’t work
\usepackage[font=\ttfamily]{myfonts}% [L3]
% works
%\krdsetkeys[TW]{fam}{font=\ttfamily}% [L4]
\begin{document}
\myfont Test
\end{document}
我可以使用 [L4] 更改字体\setkeys
,但不能作为包选项 [L3] 更改。通常,将宏作为值传递是可行的 [L1],但如果这些宏是字体开关或包含字体开关则不行 [L2]。我该如何解决这个问题?
如果我尝试将字体设置为选项,pdflatex
则会挂起。在实际包中,我收到 TeX 容量超出错误。
顺便说一句:如果我在所有宏中\krdProcessOptions
省略前缀,则会出现错误……[TW]
答案1
xkvltxp
如果要使用命令作为值,则需要加载。有关详细信息,请参阅 xkeyval 的文档。如果让您显示 的含义,您可以看到区别\myfont
:
\usepackage{xkvltxp}
\usepackage[font=\ttfamily]{myfonts}% [L3]
\show\myfont
但我会避免定义需要命令作为值的包选项。最好将这些键移到稍后发出的设置命令中。
答案2
一种可能的 LaTeX3 实现,还展示了如何设置默认值。选项应该不带反斜杠传递,以避免 Ulrike 已经提到的问题。感谢 Marco Daniel 和 Joseph Wright 指出\ProcessKeysOptions
。
软件包 myfonts.sty
\RequirePackage{expl3,l3keys2e}
\ProvidesExplPackage {myfonts} {2012/03/05} {1}{}
\keys_define:nn { myfonts }
{
font .code:n = \cs_set_eq:Nc \myfont { #1 },
font .default:n = sffamily,
}
\keys_set:nn { myfonts } { font }
\ProcessKeysOptions{myfonts}
示例文档
\documentclass{article}
\usepackage[font=ttfamily]{myfonts}
\begin{document}
\myfont Test
\end{document}
答案3
问题:\krdProcessOptions
如果我在所有宏中省略前缀 [TW],则会出现错误。
答案:升级您的版本密钥读取器包最新版本可从以下网址获取:http://texcatalogue.sarovar.org/entries/keyreader.html。
问题:通常,将宏作为值传递是可行的 [L1],但如果这些宏是字体开关或包含字体开关则不行 [L2]。我该如何解决这个问题?
答案:Ulrike Fischer 是对的。你可以坚持陳文包裹但是期权包也有效。两者陳文和期权可以之前加载\documentclass
。
\begin{filecontents}{testpackage.sty}
\ProvidesPackage{testpackage}
\usepackage{keyreader}
\krddefinekeys{fam}[my]{%
cmd/font/\sffamily/;
}
\krdProcessOptions*<fam>\relax
\end{filecontents}
\documentclass{article}
\usepackage{catoptions}
\usepackage{xcolor}
% works:
\newcommand{\mymacro}{\ttfamily\color{red}}
\usepackage[font=\mymacro]{testpackage}
% works:
%\usepackage[font=\ttfamily]{testpackage}
% works:
%\krdsetkeys{fam}{font=\ttfamily}
\begin{document}
{\myfont Test} document.
\end{document}