Usando macros en el comando \pgfkeys

Usando macros en el comando \pgfkeys

¿Existe una forma general de pasar un <key list>contenido dentro de una macro al \pgfkeyscomando para procesarlo de la forma habitual? En ejemplos sencillos, \expandafterayuda pero no sé muy bien cómo ir en situaciones más complicadas. En particular, ¿qué debo hacer si quiero pasar \pgfkeysalgunas claves explícitamente y otras a través de una macro?

\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}

Me topé con este aspecto aplicando lo descrito en el86.6.3 Controladores de claves no procesadassección del pgfmanual, intentando procesar nuevamente con \pgfkeyslas claves filtradas guardadas en la \remainingoptionsmacro.

Respuesta1

Puedes procesar las claves desde una macro con \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}

Pero no deberías intentar mezclar macros y claves normales en un argumento \pgfkeys. Ese no es un buen estilo de programación si lo necesitas. Normalmente obtienes macros con una lista de claves de algún filtrado y el código debe tener suficiente control sobre el procesamiento para evitar tal combinación.

Respuesta2

¿Algo como esto?

\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}

ingrese la descripción de la imagen aquí

O

\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}

ingrese la descripción de la imagen aquí

información relacionada