Есть ли общий способ передать <key list>
содержащееся внутри макроса в \pgfkeys
команду, чтобы обработать его обычным способом? В простых примерах \expandafter
помогает, но я не знаю, как поступить в более сложных ситуациях. В частности, как мне поступить, если я хочу передать \pgfkeys
некоторые клавиши явно, а некоторые через макрос?
\documentclass[varwidth,border=1mm]{standalone}
\usepackage{pgf}
\def\x{g/a=1,g/b=2}
\def\y{a=3,b=4}
\pgfkeys{%
/g/.is family, /g,
a/.code={(a is #1)},
b/.code={(b is #1)},
c/.code={(c is #1)}
}
\begin{document}
%\pgfkeys{\x} % CLEARLY FAILING
\expandafter\pgfkeys\expandafter{\x} \\
%\pgfkeys{\x,g/c=7} % CLEARLY FAILING
\expandafter\pgfkeys\expandafter{\x,g/c=7} \\
%\pgfkeys{g,c=5,\y} % CLEARLY FAILING
%\pgfqkeys{/g}{c=5,\y} % CLEARLY FAILING
\pgfkeys{g,c=5,a=3,b=4} \\ % <-- What I'd like to get from
\pgfqkeys{/g}{c=5,a=3,b=4} % <-- the previous two lines
\end{document}
Я наткнулся на этот аспект, применив то, что описано в86.6.3 Обработчики необработанных ключейраздел руководства pgf
, попытка повторной обработки с \pgfkeys
отфильтрованными ключами, сохраненными в \remainingoptions
макросе.
решение1
Вы можете обработать клавиши из макроса с помощью \pgfkeysalsofrom
:
\documentclass[varwidth,border=1mm]{standalone}
\usepackage{pgf}
\def\x{g/a=1,g/b=2}
\def\y{a=3,b=4}
\pgfkeys{%
/g/.is family, /g,
a/.code={(a is #1)},
b/.code={(b is #1)},
c/.code={(c is #1)}
}
\begin{document}
\pgfkeysalsofrom{\x}
\end{document}
Но вам не следует пытаться смешивать макросы и обычные клавиши в одном \pgfkeys-argument. Это нехороший стиль программирования, если вам это нужно. Обычно вы получаете макросы со списком клавиш из какой-то фильтрации, и тогда код должен иметь достаточный контроль над обработкой, чтобы избежать такого смешения.
решение2
Что-то вроде этого?
\documentclass[varwidth,border=1mm]{standalone}
\usepackage{pgf}
\def\x{g/a=1,g/b=2}
\def\y{a=3,b=4}
\pgfkeys{%
/g/.is family, /g,
a/.code={(a is #1)},
b/.code={(b is #1)},
c/.code={(c is #1)}
}
\begin{document}
%\pgfkeys{\x} % CLEARLY FAILING
%\expandafter\pgfkeys\expandafter{\x} \\
%\pgfkeys{\x,g/c=7} % CLEARLY FAILING
\edef\temp{\noexpand\pgfkeys\expandafter{\x,g/c=7}}\temp \\
%\pgfkeys{g,c=5,\y} % CLEARLY FAILING
%\pgfqkeys{/g}{c=5,\y} % CLEARLY FAILING
\pgfkeys{g,c=5,a=3,b=4} \\ % <-- What I'd like to get from
\pgfqkeys{/g}{c=5,a=3,b=4} % <-- the previous two lines
\end{document}
Или
\documentclass[varwidth,border=1mm]{standalone}
\usepackage{pgf}
\def\x{g/a=1,g/b=2}
\def\y{a=3,b=4}
\pgfkeys{%
/g/.is family, /g,
a/.code={(a is #1)},
b/.code={(b is #1)},
c/.code={(c is #1)}
}
\begin{document}
%\pgfkeys{\x} % CLEARLY FAILING
%\expandafter\pgfkeys\expandafter{\x} \\
%\pgfkeys{\x,g/c=7} % CLEARLY FAILING
\edef\temp{\noexpand\pgfkeys\expandafter{\x,g/c=7}}\temp \\
\edef\temp{\noexpand\pgfkeys{g,c=5,\y} }\temp
%\pgfqkeys{/g}{c=5,\y} % CLEARLY FAILING
%\pgfkeys{g,c=5,a=3,b=4} \\ % <-- What I'd like to get from
%\pgfqkeys{/g}{c=5,a=3,b=4} % <-- the previous two lines
\end{document}