使用 keyreader 将字体设置为包选项

使用 keyreader 将字体设置为包选项

我正在开发一个包来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} 

相关内容