
최근에 키-값 인터페이스와 핸들러 인터페이스 사용의 차이점에 대한 많은 게시물을 읽었습니다 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