pgfkeys オプションを上書きする設定

pgfkeys オプションを上書きする設定

\MyMacro次の 3 つのことを指定するカスタム マクロがありますpgfkeys

  1. text=出力される
  2. color=テキストの
  3. punctuation=最後に配置する。

マクロを定義\SetUpMyMacroAdjustedOptionsして指定できるようにしたいオーバーライドオプションの呼び出し\MyMacro

例えば、

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

をお願いします。

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

これは、

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

つまり、オプションcolor=magentapunctuation={!}from は\SetUpMyMacroAdjustedOptions指定されたオプションをオーバーライドし、それらのオプションのデフォルト設定をオーバーライドします。

私の試みは以下ほとんどオーバーライドがpuncutaion=適用されるとは動作しますが、color=適用されません。さらに、オプションは の後続の呼び出し間でリセットされないようです\MyMacro

\MyMacro呼び出す

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

ここで、#1はユーザー指定のオプションであり、adjust MyMacro optionsの呼び出しによって設定されます\SetUpMyMacroAdjustedOptions。ここでの私の想定は、キーの最後の設定が以前の設定をオーバーライドし、 内の設定はすべてadjust MyMacro optionsデフォルト設定とユーザー指定の設定をオーバーライドするということです。

以下の MWE は次のようになります。

ここに画像の説明を入力してください

一方、私は次のようなコードを生成することを望んでいます:

ここに画像の説明を入力してください

注記:

  • このマクロには、オーバーライドしたいオプションが非常に多くあるので、特別な操作をする必要がないことを願っています。それぞれ特定のオプション。

コード:

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

答え1

あなたは変わりたいadjust MyMacro optionsと思っていると思います。

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

ここに画像の説明を入力してください

関連情報