注意:此问题如下我之前的问题关于\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
。