pgfkeys에 키-값 인터페이스를 사용하면 오류가 발생합니다.

pgfkeys에 키-값 인터페이스를 사용하면 오류가 발생합니다.

최근에 키-값 인터페이스와 핸들러 인터페이스 사용의 차이점에 대한 많은 게시물을 읽었습니다 pgfkeys. 제가 이해한 바에 따르면, 동일한 값을 두 가지 방법으로 저장하고 검색할 수 있습니다. 예를 들어:

\documentclass{article}
\usepackage{tikz}
\pgfkeys{
    /testa/.initial,
    /testb/.store in=\testbvalue,
}
\begin{document}
    \def\foo{bar}
    \pgfkeys{/testa=\foo,/testb=\foo}
    \pgfkeysvalueof{/testa}

    \testbvalue

    \pgfkeysgetvalue{/testa}\testavalue     
    \meaning\testavalue

    \meaning\testbvalue

\end{document}

\pgfkeysvalueof{/testa}여기서는 및 를 통해 동일한 값을 검색할 수 있습니다 \testbvalue. 실제로 \testavalue및 의 의미는 \testbvalue동일합니다(놀랍지 않습니다). 그런데 왜 다음 코드가 작동합니까?

\documentclass{article}
\usepackage{tikz}
\usepackage{etoolbox}
\usepackage{overpic}

\pgfkeys{
    /icon/.cd,
    width/.initial,
    overlay/.store in=\iconoverlay,
    set defaults/.unknown/.code={\pgfkeys{/icon/\pgfkeyscurrentname/.default=#1}}
}
\newcommand\icondefaults[1]{%
    \pgfkeys{/icon/set defaults/.cd, #1}%
}
\newcommand\ifkeyempty[3]{%
    \pgfkeysgetvalue{#1}{\keyvalue}%
    \ifempty{\keyvalue}{#2}{#3}%
}
\newcommand\ifempty[3]{%
    \def\novalue{\pgfkeysnovalue}%
    \def\empty{}%
    \ifboolexpr{test {\ifdefequal{#1}{\empty}} or test {\ifdefequal{#1}{\novalue}}}{#2}{#3}%
}
\newcommand{\icon}[2][]{%
    {%
        \pgfkeys{/icon/.cd,width,overlay,#1}% Reset to default values
        \def\options{}%
        \ifkeyempty{/icon/width}{}{\edef\options{width=\pgfkeysvalueof{/icon/width},\options}}%
        \ifempty{\iconoverlay}{%
            \edef\graphic{\noexpand\includegraphics[\options]{#2}}%
        }{%
            \edef\overlay{\noexpand\begin{overpic}[\options]{#2}}%
            \def\graphic{\overlay\put(0,0){\iconoverlay}\end{overpic}}%
        }%
        \graphic%
    }%
}%

\begin{document}

\icondefaults{width=6cm}
\icon{example-image} % Image gets default width 6cm
\icon[width=2cm,overlay={\icon{example-image-overlay}}]{example-image} % Image gets width 2cm, while the overlaid image gets default width 6cm
\icon{example-image} % Image gets default width 6cm

\end{document}

코드의 다음 섹션은 작동하지 않습니다. 유일한 차이점은 /.store in키에 사용되지 않으므로 키 값에 액세스하는 데 사용된다는 것입니다 overlay. \pgfkeysvalueof오류가 발생합니다 TeX capacity exceeded.

\documentclass{article}
\usepackage{tikz}
\usepackage{etoolbox}
\usepackage{overpic}

\pgfkeys{
    /icon/.cd,
    width/.initial,
    overlay/.initial,
    set defaults/.unknown/.code={\pgfkeys{/icon/\pgfkeyscurrentname/.default=#1}}
}
\newcommand\icondefaults[1]{%
    \pgfkeys{/icon/set defaults/.cd, #1}%
}
\newcommand\ifkeyempty[3]{%
    \pgfkeysgetvalue{#1}{\keyvalue}%
    \ifempty{\keyvalue}{#2}{#3}%
}
\newcommand\ifempty[3]{%
    \def\novalue{\pgfkeysnovalue}%
    \def\empty{}%
    \ifboolexpr{test {\ifdefequal{#1}{\empty}} or test {\ifdefequal{#1}{\novalue}}}{#2}{#3}%
}
\newcommand{\icon}[2][]{%
    {%
        \pgfkeys{/icon/.cd,width,overlay,#1}% Reset to default values
        \def\options{}%
        \ifkeyempty{/icon/width}{}{\edef\options{width=\pgfkeysvalueof{/icon/width},\options}}%
        \ifkeyempty{/icon/overlay}{%
            \edef\graphic{\noexpand\includegraphics[\options]{#2}}%
        }{%
            \edef\overlay{\noexpand\begin{overpic}[\options]{#2}}%
            \def\graphic{\overlay\put(0,0){\pgfkeysvalueof{/icon/overlay}}\end{overpic}}%
        }%
        \graphic%
    }%
}%

\begin{document}

\icondefaults{width=6cm}
\icon{example-image} % Image gets default width 6cm
\icon[width=2cm,overlay={\icon{example-image-overlay}}]{example-image} % Image gets width 2cm, while the overlaid image gets default width 6cm
\icon{example-image} % Image gets default width 6cm

\end{document}

누구든지 이 동작을 설명할 수 있나요? 두 경우 모두 동일한 값이 서로 다른 방식으로 저장되고 검색된다는 내 이해가 잘못 되었습니까?

답변1

그것들은 동일하지 않습니다. /.store in핸들러는 단순히 \def작업을 수행하고 값을 보유하지 않습니다. 그러나 키를 설정하면 해당 범위에 설정된 값을 검색할 수 있습니다. 이것이 두 번째 경우에 키를 설정해야 하는 이유입니다.

이것이 기본 동작에 대한 설정이 두 재귀 수준 모두에서 로컬로 사용 가능하기 때문에 첫 번째 방법이 작동하는 이유입니다. 그러나 두 번째는 키 값을 변경하지 않습니다.

이를 위해서는 해당 라인에서 오버레이 키를 명시적으로 아무것도 설정하지 않아야 합니다.

\pgfkeys{/icon/.cd,width,overlay=,#1}% Notice the equal sign for the overlay key

관련 정보