pgfkeys 与 nodepart 冲突?

pgfkeys 与 nodepart 冲突?

以下示例无法通过输出进行编译。

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}

相关内容