Opções de substituição de pgfkeys de configuração

Opções de substituição de pgfkeys de configuração

Eu tenho uma macro personalizada \MyMacroque pgfkeysespecifica três coisas:

  1. A text=saída
  2. O color=do texto
  3. O punctuation=para colocar no final.

Eu gostaria de definir a macro \SetUpMyMacroAdjustedOptionspara poder especificarsobreporopções para opróximoinvocação de \MyMacro.

Então, por exemplo com

\SetUpMyMacroAdjustedOptions{color=magenta, punctuation={.}}

Gostaria

\MyText{text={xxx}, color=brown, puncutation={:}}

ser tratado como se isso fosse invocado como

\MyText{text={xxx}, color=magenta, punctuation={.}}}

Ou seja, as opções color=magentae punctuation={!}from \SetUpMyMacroAdjustedOptionssubstituem quaisquer opções especificadas e substituem qualquer configuração padrão dessas opções.

Minha tentativa abaixoquasefunciona porque a substituição puncutaion=é aplicada, mas color=não. Além disso, as opções não parecem ser redefinidas entre invocações subsequentes de \MyMacro.

\MyMacroinvoca

\pgfkeys{/MyMacro/.cd, default MyMacro options,#1,adjust MyMacro options}%

onde #1estão as opções especificadas pelo usuário e adjust MyMacro optionssão definidas por meio de uma chamada para \SetUpMyMacroAdjustedOptions. Minha suposição aqui é que a última configuração da chave substitui qualquer configuração anterior, de modo que qualquer coisa adjust MyMacro optionssubstituiria qualquer configuração padrão e qualquer configuração especificada pelo usuário.

O MWE abaixo produz:

insira a descrição da imagem aqui

enquanto desejo que o código produza:

insira a descrição da imagem aqui

Observação:

  • Esta macro em particular tem um grande número de opções que posso querer substituir, então espero não precisar fazer algo específico paracadaopção específica.

Código:

\documentclass{article}
\usepackage{tikz}

\pgfkeys{ 
    %% https://tex.stackexchange.com/a/34318/4301
    /MyMacro/.is family,
    /MyMacro,
    %% Numerous other keys can be set here.
    default MyMacro options/.style={ 
        text={},
        color=blue,
        punctuation={.},
    },
    adjust MyMacro options/.style={},
    text/.store in = \Text,
    color/.store in = \Color,
    punctuation/.store in = \Punctuation,
}
\newcommand{\SetUpMyMacroAdjustedOptions}[1]{%
    \pgfkeys{ 
        /MyMacro,
        default MyMacro options/.style/.expand once={ 
            #1,%
        }
    }
}%


\newcommand{\MyMacro}[1]{%
    \pgfkeys{/MyMacro/.cd, default MyMacro options,#1,adjust MyMacro options}%
    \textcolor{\Color}{\Text}\Punctuation%
    \SetUpMyMacroAdjustedOptions{}% Reset for next use
}%

\begin{document}
    \MyMacro{%
        text={This should be in red and end with a period},
        color=red,
    }%
    
    %% ----------------------------------------------------------------
    %% For the next use of this, I want to fix SOME options independent
    %% of how the next invocation of \MyMacro sets them.
    \SetUpMyMacroAdjustedOptions{%
        color=magenta,
        punctuation={!},
    }%
    %% ----------------------------------------------------------------
    
    \MyMacro{%
        text={This should be magenta and end with an exclamation},
        color=brown,
    }%
    
    \MyMacro{%  Back to default case
        text={This should be in blue and end with a period},
    }%
\end{document}

Responder1

Você quer mudar adjust MyMacro options, eu acho.

\documentclass{article}
\usepackage{tikz}

\pgfkeys{ 
    %% https://tex.stackexchange.com/a/34318/4301
    /MyMacro/.is family,
    /MyMacro,
    %% Numerous other keys can be set here.
    default MyMacro options/.style={/MyMacro/.cd,
        text={},
        color=blue,
        punctuation={.},
    },
    adjust MyMacro options/.style={},
    text/.store in = \Text,
    color/.store in = \Color,
    punctuation/.store in = \Punctuation,
}
\newcommand{\SetUpMyMacroAdjustedOptions}[1]{%
    \pgfkeys{ 
        /MyMacro/adjust MyMacro options/.style={
        /MyMacro/.cd,#1,%
        }
    }
}%


\newcommand{\MyMacro}[1]{%
    \pgfkeys{/MyMacro/.cd, default MyMacro options,#1,adjust MyMacro options}%
    \textcolor{\Color}{\Text}\Punctuation%
    \SetUpMyMacroAdjustedOptions{}% Reset for next use
}%

\begin{document}
    \MyMacro{%
        text={This should be in red and end with a period},
        color=red,
    }%

    %% ----------------------------------------------------------------
    %% For the next use of this, I want to fix SOME options independent
    %% of how the next invocation of \MyMacro sets them.
    \SetUpMyMacroAdjustedOptions{%
        color=magenta,
        punctuation={!},
    }%
    %% ----------------------------------------------------------------

    \MyMacro{%
        text={This should be magenta and end with an exclamation},
        color=brown,
    }%

    \MyMacro{%  Back to default case
        text={This should be in blue and end with a period},
    }%
\end{document}

insira a descrição da imagem aqui

informação relacionada