pgfkeys Konflikt mit Nodepart?

Sep 29 2020

Das folgende Beispiel wird nicht mit der Ausgabe kompiliert.

ARGS=id=I
id = I
FOOY: I
! Undefined control sequence.
<recently read> \myFooId

l.26 \node[] (Foo) at (0,0) {\FOOX{id=I}
                                      };
?

Es wird beim Entfernen \nodepart{second}aus dem FOOYMakro kompiliert .

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

Was kann ich im FOOXMakro ändern , damit es "wie erwartet" funktioniert?

Antworten

2 Skillmon Sep 29 2020 at 00:46

Das Folgende funktioniert und enthält einige Verbesserungen:

  • Verwenden Sie einen Ordner für Ihre Schlüssel, damit Sie nicht versehentlich die Ordner anderer überschreiben (oder ein Konflikt wird weniger wahrscheinlich).

  • Definieren Sie die Schlüssel einmal in der Präambel (sowie das Makro, in dem der Schlüssel gespeichert wird).

  • Knotenteile bilden eine Gruppe. Wenn Sie also einen Schlüssel in einem Teil lokal festlegen, wird sein Wert im nächsten Teil zurückgesetzt. Daher wird im Folgenden nicht verwendet, .store insondern stattdessen .codeein Schlüssel definiert, der global agiert.

  • Wenn Sie verwenden \nodepart, die aktuelle Knotenform jedoch nicht mehrere Teile (oder den von Ihnen ausgewählten Teilnamen) unterstützt, wird der Inhalt nicht verwendet.

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