在包选项中使用未扩展的宏

在包选项中使用未扩展的宏

当我尝试将尚未定义的宏放入我的包选项中时(即使我使用 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{...}该选项仅由键值解析器解析,因此不会预先扩展参数。

相关内容