以下示例无法通过输出进行编译。
ARGS=id=I
id = I
FOOY: I
! Undefined control sequence.
<recently read> \myFooId
l.26 \node[] (Foo) at (0,0) {\FOOX{id=I}
};
?
\nodepart{second}
从宏中删除时确实会进行编译FOOY
。
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{shapes.multipart}
\begin{document}
\newcommand{\FOOX}[1]{%
\pgfkeys{
id/.store in = \myFooId,
}
\pgfkeys{#1}%
\ifdefined\myFooId\else\def\myFooId{}\fi%
\typeout{ARGS=#1}%
\typeout{id = \myFooId}%
\FOOY{\myFooId}
\let\myFooId\undefined%
}
\newcommand{\FOOY}[1]{%
\typeout{FOOY: #1}%
A\nodepart{second}#1
}%
\begin{tikzpicture}
\node[] (Foo) at (0,0) {\FOOX{id=I}};
\end{tikzpicture}
\end{document}
我可以在FOOX
宏中进行哪些更改以使其“按预期”工作?
答案1
以下工作包括一些改进:
使用文件夹保存你的密钥,这样你就不会意外覆盖其他人的密钥(或者发生冲突的可能性会降低)
在序言中定义一次键(以及将存储键的宏)
节点部分形成一个组,因此如果您在一个部分中本地设置一个键,则它的值将在下一部分中恢复,因此下面不使用
.store in
而是.code
定义一个全局起作用的键。如果您使用
\nodepart
但当前节点形状不支持多个部分(或您选择的部分名称),则不会使用内容。
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{shapes.multipart}
\pgfkeys{
/FOOX/.cd,
id/.code = \xdef\myFooId{\unexpanded{#1}},
}
\newcommand*\myFooId{}
\begin{document}
\newcommand{\FOOX}[1]{%
\gdef\myFooId{}%
\pgfqkeys{/FOOX}{#1}%
\typeout{ARGS=#1}%
\typeout{id = \myFooId}%
\FOOY{\myFooId}
}
\newcommand{\FOOY}[1]{%
\typeout{FOOY: #1}%
A\nodepart{second}#1
}%
\begin{tikzpicture}
\node[] (Foo) at (0,0) {\FOOX{id=I}};
\end{tikzpicture}
\end{document}