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
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
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
.
Es dürfte offensichtlich sein, warum
den Fehler ! Missing number, treated as zero.
hervorruft.
Warum tut in TikZ beides?
Seien zwei Punkte definiert als
Open in writeLaTeX\def\x{55pt}
\def\y{86pt}
\newdimen\xother
\newdimen\yother
\xother=55pt
\yother=86pt
Dies ist offensichtlich beides mal der gleiche Punkt. In TikZ kann ich nun Nodes an die Punkte setzen mittels
Die Koordinaten werden gelesen mit etwas das so ähnlich ist wie
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.
Open in writeLaTeX\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}
Dein Code in Plain TeX
Open in writeLaTeX\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
beantwortet
10 Aug '14, 14:55
Henri
15.7k●13●39●43
Akzeptiert-Rate:
46%