当我尝试将尚未定义的宏放入我的包选项中时(即使我使用 noexpand),文档也无法编译(即使我不使用宏!)。知道它是否是根本性的吗?(我尝试使用 kvoptions,也尝试使用常规系统)理想情况下,我想避免这种情况,\noexpand
但现在任何解决方案都很有趣!
梅威瑟:
测试.tex:
\documentclass{article}
\usepackage[conf={I would like to use not (yet) defined macro here}]{teststy}
% Uncommenting the following line produces errors:
% \usepackage[conf={The value is: \noexpand\number\noexpand\value{counterAllProofEnd}}]{teststy}
\begin{document}
\section{Options}
\show\pratendOptconf
\newcounter{counterAllProofEnd}
\pratendOptconf %% Should display "The value is: 0"
\stepcounter{counterAllProofEnd}
\pratendOptconf %% Should display 1 "The value is: 1"
\end{document}
测试sty.sty:
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{teststy}[2019/05/06 A test]
\RequirePackage{kvoptions}
%% https://tex.stackexchange.com/questions/109747/put-all-package-options-into-one-command
%% Forward the options list to the command \pratendOptdefconf
%% in order to use:
%% \usepackage[conf={normal}]{proofAtTheEnd}
\SetupKeyvalOptions{
family=pratendOpt,
prefix=pratendOpt,
}
\DeclareStringOption{conf}
\DeclareLocalOptions{conf}% \pratendOptdefconf contains the proof
\ProcessKeyvalOptions*
% \DeclareOption*{\PackageWarning{proofAtTheEnd}{Unknown}}
% \ProcessOptions\relax
\endinput
答案1
目前(尽管可能有计划改变这一点),选项参数在传递给包之前,以及在被包使用的 kvoptions 代码访问之前,已经由标准选项处理代码进行了规范化。
基本上,这意味着代码通过\edef
并且空白被删除。
这意味着只有对包等使用“经典”的无值选项才是真正安全的。[dvips]
在[fleqn]
某些情况下,您可以使 key=value 选项起作用,但前提是它们在 edef 中是安全的。
这就是为什么例如hyperref
允许在包选项列表中使用 kvoptions 但提供(并建议)单独指定选项,通过\hypersetup{...}
该选项仅由键值解析器解析,因此不会预先扩展参数。