Использование макросов в команде \pgfkeys

Использование макросов в команде \pgfkeys

Есть ли общий способ передать <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}

введите описание изображения здесь

Связанный контент