# Was tut `\the`?
Es gibt verschiedene Arten von Tokens in TeX. Da sind einmal die Control Sequences die man über `\def` definiert. Dann gibt es noch die Register, wir beschränken uns hier auf Register vom Typ `dimen`. Ein solches Register alloziert man mittels `\newdimen`.
Sei der Token `\getxy` eine Control Sequence. Um TeX dazu zu bringen ihn zu expandieren, also seinen Replacement Text einzusetzen schreibt man im Dokument einfach
<pre>
\def\getxy{...}
\getxy
</pre>
Bei Registern sieht das anders aus. Man kann nicht das Register an sich expandieren sondern nur seinen Wert setzen oder auslesen. Sei dazu `\xother` ein Register vom Typ `dimen`. Wir setzen den Wert mittels
<pre>
\newdimen\xother
\xother=5pt
\xother1cm
</pre>
Das Gleichheitszeichen ist optional hilft aber der Lesbarkeit. Um nun den Wert des Registers zu erhalten benötigen wir eine Control Sequence die auf den Inhalt des Registers expandiert. Genau das tut `\the`.
<pre>
\the\xother
</pre>
Es dürfte offensichtlich sein, warum
<pre>
\xother
</pre>
den Fehler `! Missing number, treated as zero.` hervorruft.
# Warum tut in TikZ beides?
Seien zwei Punkte definiert als
<pre>
\def\x{55pt}
\def\y{86pt}
\newdimen\xother
\newdimen\yother
\xother=55pt
\yother=86pt
</pre>
Dies ist offensichtlich beides mal der gleiche Punkt. In TikZ kann ich nun Nodes an die Punkte setzen mittels
<pre>
\node at (\x,\y) {...};
\node at (\xother,\yother) {...};
</pre>
Die Koordinaten werden gelesen mit etwas das so ähnlich ist wie
<pre>
\pgf@x=#1
\pgf@y=#2
</pre>
wobei `\pgf@x` und `\pgf@y` Register vom Typ `dimen` sind und `#1` und `#2` die x- und y-Koordinate des Punktes sind. Im Fall von `\xother` und `\yother` haben wir bereits zwei `dimen`-Register und die Zuweisung funktioniert ohne Probleme. Im Fall von `\x` und `\y` muss einmal expandiert werden aber dann stehen auch zwei Längen da, viz. der Replacement Text `55pt` und `86pt`, respektive.
# Dein Code ohne `\the`
Ich habe übrigens keine Ahnung was Du mit high-level und low-level meinst.
\documentclass{article}
\pagestyle{empty}
\usepackage{tikz}
\makeatletter
\newcommand{\getxy}[3]{% 1: point, 2: x-dimen, 3: y-dimen
\tikz@scan@one@point\pgfutil@firstofone#1\relax
\edef#2{\the\pgf@x}%
\edef#3{\the\pgf@y}%
}
\makeatother
\newcommand{\getxyother}[3]{% 1: point, 2: x-dimen, 3: y-dimen
\coordinate (temp) at #1;
\pgfextractx{\dimen0}{\pgfpointanchor{temp}{center}}
\edef#2{\the\dimen0}
\pgfextracty{\dimen0}{\pgfpointanchor{temp}{center}}
\edef#3{\the\dimen0}
}
\begin{document}
\begin{tikzpicture}
\coordinate (temp) at (3,2);
\getxy{(temp)}{\x}{\y};
\getxyother{(temp)}{\xother}{\yother};
\draw (\x,\y) -- (\yother,\xother);
\node[green] at (\x,\y) {\x\ : \y};
\node[red] at (\yother,\xother) {\yother\ : \xother};
\end{tikzpicture}
\end{document}
> ![alt text][1]
# Dein Code in Plain TeX
\nopagenumbers
\input tikz
\catcode`\@=11
\def\getxy#1#2#3{% 1: point, 2: x-dimen, 3: y-dimen
\tikz@scan@one@point\pgfutil@firstofone#1\relax
\edef#2{\the\pgf@x}%
\edef#3{\the\pgf@y}%
}
\catcode`\@=12
\def\getxyother#1#2#3{% 1: point, 2: x-dimen, 3: y-dimen
\coordinate (temp) at #1;
\pgfextractx{\dimen0}{\pgfpointanchor{temp}{center}}
\edef#2{\the\dimen0}
\pgfextracty{\dimen0}{\pgfpointanchor{temp}{center}}
\edef#3{\the\dimen0}
}
\tikzpicture
\coordinate (temp) at (3,2);
\getxy{(temp)}{\x}{\y};
\getxyother{(temp)}{\xother}{\yother};
\draw (\x,\y) -- (\yother,\xother);
\node[green] at (\x,\y) {\x\ : \y};
\node[red] at (\yother,\xother) {\yother\ : \xother};
\endtikzpicture
\bye
[1]: http://texwelt.de/wissen/upfiles/u_163.png