如何定义 \pgfkeyssetexpandedvalue?

如何定义 \pgfkeyssetexpandedvalue?

注意:此问题如下我之前的问题关于\pgfkeyssetvalue

\pgfkeyssetvalue在文件中定义如下pgfkeys.code.tex

\newtoks\pgfkeys@temptoks
% [...] 
\long\def\pgfkeyssetvalue#1#2{%
  \pgfkeys@temptoks{#2}\expandafter\edef\csname pgfk@#1\endcsname{\the\pgfkeys@temptoks}%
}

如何定义\pgfkeyssetexpandedvalue\pgfkeyssetvalue但第二个参数被扩展?

由于第二个参数可以包含类似#1...的想法#9,我们不能使用\edef

附言:\pgfkeyssetexpandedvalue宏可以帮助修复这个错误揭示“示例:球面和笛卡尔网格”未编译为正确的图形

答案1

也许你需要这样的东西:

\long\def\pgfkeyssetexpandvalue#1#2{%
  \edef\tmp##1##2##3##4##5##6##7##8##9{#2}%
  \expandafter\def\csname pgfk@#1\expandafter\endcsname\expandafter
  {\tmp{####1}{####2}{####3}{####4}{####5}{####6}{####7}{####8}{####9}}%
}


%% test:
\pgfkeyssetexpandvalue{xxx}{aha#1+#3}

\catcode`@=11
\show\pgfk@xxx  %% \pgfk@xxx=macro: aha##1+##3.

\end

编辑:考虑到您的评论(您需要将所有哈希值加倍,而不仅仅是后跟数字的单个哈希值),您可以尝试以下技巧:

\newtoks\mytoks
\long\def\pgfkeyssetexpandvalue#1#2{%
   \mytoks={#2}%
   \scantokens\expandafter{\expandafter\mytoks\expandafter{\the\mytoks}}%
   \expandafter
      \edef\csname pgfk@#1\expandafter\endcsname\expandafter{\the\mytoks}%
}

%test
\pgfkeyssetexpandvalue{xxx}{abc#1+##3}

\catcode`@=11
\show\pgfk@xxx  % \pgfk@xxx=macro: abc##1+####3.

\bye

代码的第 4 行是这个技巧的核心:\mytoks使用时哈希值加倍\scantokens

相关内容