*Im Folgenden verwende ich das Bild [`Mycena_interrupta.jpg`][1], das am 11. Mai 2010 von Wikipedia-Nutzer [JJ Harrison][2] hochgeladen wurde. Es ist lizensiert unter der [Creative Commons][3] [Attribution-Share Alike 3.0 Unported][4].*
[`PRODPIC-1461.jpg`][1], das ich auf [www.tvfilmprops.co.uk][2] gefunden habe.*
Mithilfe der TikZ-Optionen `shift`, `x` und `y` lassen sich Koordinaten verwenden, die in einem lokalen Koordinatensystem existieren, das mit dem eingefügtem Bild skaliert wird. So lässt sich mit dem Code
\begin{tikzpicture}
\node[anchor=south west,inner sep=0] (image) (Bild) at (0,0)
{\includegraphics[width=0.9\textwidth]{Mycena_interrupta.jpg}};
\begin{scope}[x={(image.south east)},y={(image.north west)}]
{\includegraphics{Bild.jpg}};
\begin{scope}[x=(Bild.south east),y=(Bild.north west)]
\draw[red,ultra thick,rounded corners] (0.62,0.65) (0.5,0.25) rectangle (0.78,0.75);
(0.75,0.25);
\end{scope}
\end{tikzpicture}
bereits sehr einfach auf dem Bild zeichnen. Dadurch, dass man den Südwest-Anchor auf den Koordinatenursprung setzt kann man nun einfach den Südost-Anchor sowie den Northwest-Anchor als Koordinaten für die *x*- und die *y*-Vektoren verwenden.
Die Koordinate `(0, 0)` ist dann in der unteren linken Ecke des Bildes, die Koordinate `(1, 1)` in der oberen rechten Ecke des Bildes. Die Mitte des Bildes liegt bei `(0.5, 0,5)`. Dies funktioniert auch, wenn das Bild rotiert wird.
### Nodescope
Um das Ganze etwas komfortabler zu machen habe ich im Code unten die Umgebung `nodescope` so wie das Coordinate System `nodescope` hinzugefügt.
Die Umgebung `nodescope` versteht vier Argumente:
1. optional: Optionen für die Node, die für das Bild verwendet wird;
2. optional: Optionen für die optionalen Optionen von `\incudegraphics`;
3. obligatorisch: Pfad/Dateinamen zum Bild;
4. optional: Optionen für das integrierte Scope.
Mit dem `nodescope cs:` können bereits inkludierte Bilder referenziert werden. Das Argument besteht hier im Prinzip aus zwei Teilen:
1. Der erste Teil referenziert den Namen des Nodes mit dem geladenen Bild (ja, das geht im Prinzip mit jeder Node).
2. Der zweite Teil nach dem `:` ist eine normale TikZ-Koordinate, die theoretisch die gleiche Koordinate ergeben soll, als wenn es direkt in der `nodescope`-Umgebung verwendet wurde.
Es darf jeweils kein Leerzeichen *vor* den Doppelpunkten vorkommen!
Die Transformationen von PGF sind etwas trickreich. Ich hoffe, das funktioniert auch für jede erdenkliche Transformation.
### Hinweise
Die vordefinierten Optionen für `every nodescope node` sind mit Bedacht gewählt. Das Setzen von `outer sep` und `inner sep` auf Null führt dazu, dass nur und wirklich nur das Bild als Referenz für die Koordinaten verwendet wird (und das TikZ-Picture auch nicht größer wird als das Bild selbst). Möchte man einen Rahmen um das Bild malen und dazu direkt den Node mit dem Bild verwenden, führt das ebenfalls zu einer leichten Änderung an den Koordinaten (wie man an dem Gitter erkennen kann).
Die `overlay`-Option in `every nodescope grid node` führt dazu, dass die Nodes zur Beschriftung des Gitters das TikZ-Picture nicht weiter beeinflussen. Das Gitter, das mit der `nodescope grid`-Option aktiviert werden kann, ist im Prinzip eh nur als eine `draft`-Option gedacht.
Man kann sich selbstverständlich weitere Optionen vorstellen, die
- das Gitter beeinflussen (mehr Linien, andere Einteilung);
- die Skalierung der Koordinaten einschränkt oder aufhebt (man kann bereits jetzt `(0.5, 2cm)` verwenden, was eine Koordinate entspricht die `2cm` „über“ (also Richtung `north`-Anchor) dem `south`-Anchor liegt; das kann man auch mit `([y=1cm] 0.5, 2)` erreichen; genauso ist mit `([y={(0pt,1cm)}] 0.5, 1)` der Original-TikZ-Vektor für die *y*-Richtung ausgewählt);
- eine `renodescope`-Option, die quasi ein `scope` option für das `nodescope cs:` wäre.
## Code
\documentclass[tikz,convert=false,border=15pt]{standalone}
\documentclass[
tikz,
border=15pt,
% convert={outext=.png,density=300,size=600},
convert=false,
]{standalone}
\makeatletter
\newif\ifpgf@nodescope@grid
\tikzset{
nodescope grid/.is if=pgf@nodescope@grid,
every nodescope grid node/.style={
shape=rectangle,
font=\small\ttfamily,
inner sep=+0pt,
outer sep=+1pt,
fill=white,
overlay},
every nodescope node/.style={
shape=rectangle,
inner sep=+0pt,
outer sep=+0pt,
draw=none,
fill=none}}
\def\tikz@nodescope@env{%
\pgfutil@ifnextchar[\tikz@@nodescope@env{\tikz@@@nodescope@env{}[]}}
\def\tikz@@nodescope@env[#1]{%
\pgfutil@ifnextchar[{\tikz@@@nodescope@env{#1}}{\tikz@@@nodescope@env{#1}[]}}
\def\tikz@@@nodescope@env#1[#2]#3{%
\pgfutil@ifnextchar[{\tikz@@@@nodescope@env{#1}{#2}{#3}}{\tikz@@@@nodescope@env{#1}{#2}{#3}[]}}
\def\tikz@@@@nodescope@env#1#2#3[#4]{%
\tikz@scope@env[#4]
\node[every nodescope node/.try, #1, alias=tikz@last@nodescope]{\includegraphics[#2]{#3}};%
\pgftransformresetnontranslations
\pgftransformshift{\pgfpointanchor{tikz@last@nodescope}{south west}}%
\pgfsetxvec{\pgfpointdiff{\pgfpointanchor{tikz@last@nodescope}{south west}}{\pgfpointanchor{tikz@last@nodescope}{south east}}}%
\pgfsetyvec{\pgfpointdiff{\pgfpointanchor{tikz@last@nodescope}{south west}}{\pgfpointanchor{tikz@last@nodescope}{north west}}}%
\ifpgf@nodescope@grid
\draw[help lines,xstep=.1,ystep=.1] (0,0) grid (1,1);
\foreach \x in {0,1,...,10}{
\node[every nodescope grid node/.try, left, rotate=90] at (\x/10,0) {\ifnum\x=10\relax1.0\else0.\x\fi};
\node[every nodescope grid node/.try, left] at (0,\x/10) {\ifnum\x=10\relax1.0\else0.\x\fi};
}
\fi
}
\tikzaddtikzonlycommandshortcutlet\tikz@orignodescope\nodescope
\tikzaddtikzonlycommandshortcutlet\tikz@origendnodescope\endnodescope
\tikzaddtikzonlycommandshortcutlet\tikz@origstartnodescope\startnodescope
\tikzaddtikzonlycommandshortcutlet\tikz@origstopnodescope\stopnodescope
\tikzaddtikzonlycommandshortcutlet\nodescope\tikz@nodescope@env
\tikzaddtikzonlycommandshortcutlet\endnodescope\endscope
\tikzaddtikzonlycommandshortcutlet\startnodescope\nodescope
\tikzaddtikzonlycommandshortcutlet\stopnodescope\endnodescope
\pgfutil@g@addto@macro\tikz@uninstallcommands{%
\let\nodescope\tikz@orignodescope
\let\endnodescope\tikz@origendnodescope
\let\startnodescope\tikz@origstartnodescope
\let\stopnodescope\tikz@origstopnodescope
}
\tikzdeclarecoordinatesystem{nodescope}{%
\edef\pgf@temp{#1}%
\expandafter\pgfutil@ifnextchar\expandafter x\expandafter\tikz@nodescope@split\expandafter\tikz@nodescope@split\pgf@temp\pgf@stop
}
\def\tikz@nodescope@split#1:#2\pgf@stop{%
\begingroup
\edef\pgf@temp{#1}%
\pgftransformresetnontranslations
\pgfsetxvec{\pgfpointdiff{\pgfpointanchor{#1}{south west}}{\pgfpointanchor{#1}{south east}}}%
\pgfsetyvec{\pgfpointdiff{\pgfpointanchor{#1}{south west}}{\pgfpointanchor{#1}{north west}}}%
\tikz@scan@one@point\tikz@nodescope@shift(#2)\relax
\endgroup
}
\def\tikz@nodescope@shift#1{%
\pgf@process{\pgfpointadd{#1}{\pgfpointanchor{Fung}{south \pgf@process{\pgfpointadd{#1}{\pgfpointanchor{\pgf@temp}{south west}}}%
}
\makeatother
\begin{document}
\begin{tikzpicture}
\node[anchor=south west,inner sep=0] (image) at (0,0) {\includegraphics[width=0.9\textwidth]{Mycena_interrupta.jpg}};
\begin{scope}[x={(image.south east)},y={(image.north west)}]
\draw[red,ultra thick,rounded corners] (0.62,0.65) rectangle (0.78,0.75);
\end{scope}
\end{tikzpicture}
\begin{tikzpicture}
\begin{nodescope}[draw=blue, \begin{tikzpicture}\sffamily
\begin{nodescope}[draw, line width=2mm, rounded corners, inner sep=+.5\pgflinewidth, outer sep=+.5\pgflinewidth, name=Fung]
[width=.9\textwidth]{Mycena_interrupta.jpg}
name=alterPC]
[width=.9\textwidth]{PRODPIC-1461.jpg}
[nodescope grid]
\draw[red,ultra thick,rounded corners] (0.61,0.64) \tikzset{
nodes={fill=white,rounded corners, fill opacity=.5, text opacity=1},
every path/.append style={ultra thick, rounded corners}}
\draw[red, rotate around={-15:(0.265,0.3)}] (0.03, 0.15) rectangle (0.77,0.74) coordinate (Fung-top right);
node[rotate=-15] {Tastatur} (0.5,0.45);
\end{nodescope}
\draw[thick,green] (Fung-top right) to[out=90, in=90] \node[white] at (nodescope cs: Fung: 0.2,0.6);
alterPC: 0.7, 0.8) {Lampe};
\end{tikzpicture}
\end{document}
## Resultat
![alt text][5]
![alt text][6]
text][3]
[1]: http://texwelt.de/wissen/upfiles/de_1-0.png
http://www.tvfilmprops.co.uk/userdata/PRODPIC-1461.jpg
[2]: http://commons.wikimedia.org/wiki/User:JJ_Harrison
http://www.tvfilmprops.co.uk/det/1461/Eighties-Office-Desk-Setup-Computer-and-Phone/
[3]: http://en.wikipedia.org/wiki/en:Creative_Commons
[4]: http://creativecommons.org/licenses/by-sa/3.0/deed.en
[5]: http://texwelt.de/wissen/upfiles/de_1-0_2.png
[6]: http://texwelt.de/wissen/upfiles/de_1-1_1.pnghttp://texwelt.de/wissen/upfiles/de_1-0_3.png