TikZ-Spy mit relativen Koordinatenangaben

Mal angenommen, die Wirkung eines Bildverarbeitungs-Tools soll anhand eines Beispielbilds demonstriert werden. Die Aufmerksamkeit des Lesers soll dabei auf bestimmte Bereiche des Bilds gelenkt werden:

Ein solcher Effekt ist in Latex mithilfe der TikZ-Bibliothek Spy mit relativ wenig Aufwand realisierbar.[1] Ein funktionierendes Minimalbeispiel habe ich auf FramaGit hochgeladen.

Weil man sicherstellen muss, dass die beiden Ausschnitte an der jeweils identischen Stelle in den beiden Bildern extrahiert werden, wird man allerdings einige Mühe haben, diese relativen Positionsangaben zu implementieren - etwa so:

\spy on (\picax+0.45\picaw,\picay+0.65\picah)
     in node at (\picax-0.05\picaw, \picay+0.95\picah);

Mithilfe der Latex-Befehle \newlength{...} bzw. \setlength{...} müssen also alle Informationen über Position und Größe der Bilder in zahlreichen Variablen erst explizit definiert werden. Wenn zusätzlich die Verankerung der Position im zweiten Bild nicht unten links, sondern unten rechts ist, erfordert das zusätzliche Anpassungen:

\spy on (\picbx-\picbw+0.45\picbw,\picby+0.65\picbh)
     in node at (\picbx+0.05\picbw, \picby+0.95\picbh);

Wenn mehr als ein solcher Vergleich in dem jeweiligen Latex-Dokument vorkommt, wird es schnell unübersichtlich angesichts der ganzen Variablen für die Positionen und Abmessungen der Bilder. Deshalb habe ich mir ein Makro definiert, das diese Buchhaltung überflüssig macht. Wenn das erste Bild im TikZ-Knoten nd1 und das zweite Bild im TikZ-Knoten nd2 abgelegt ist, bewirkt der folgende Code das gleiche wie die obigen Code-Beispiele:

\RelativeSpy{nd1-spy1}{nd1}{(0.45,0.65)}{(-0.05,0.95)}
\RelativeSpy{nd2-spy1}{nd2}{(0.45,0.65)}{(1.05,0.95)}

Die Koordinatenangaben beziehen sich also auf ein relatives Koordinatensystem, das (unabhängig von der gewählten Verankerung!) an der linken unteren Ecke des Bildknotens ausgerichtet ist. Die rechte obere Ecke des Bilds landet durch Skalierung jeweils an der relativen Koordinatenposition (1,1).

Die Definition des Makros eingebettet in ein vollständig funktionsfähiges Minimalbeispiel gibt's wieder auf FramaGit. Hier noch die allgemeinen Hinweise zur Verwendung des Makros:

\RelativeSpy{<spy-id>}{<node-id>}{<roi-coords>}{<spy-coords>}
%   <spy-id> : Eindeutiger Bezeichner für diesen Spy.
%   <node-id> : Der Knoten, aus dem extrahiert wird.
%   <roi-coords> : Relative Koordinatenangaben zur "region of interest".
%   <spy-coords> : Relative Koordinatenangaben für den vergrößerten Ausschnitt.

Generell ist die Verwendung von relativen Koordinatenangaben an dieser Stelle von Vorteil, wenn man zu einem späteren Zeitpunkt aufgrund von Layoutänderungen die Größen und Positionierungen der eingebundenen Grafiken anpassen möchte. Die konventionelle Verwendung des Befehls \spy macht in einer solchen Situation viele mühsame Anpassungen notwendig, die man sich mit dem Makro sparen kann.

  1. In der PGF-Manual gibt es einen Abschnitt über Spy: ftp://ftp.mpi-sb.mp...ase/doc/pgfmanual.pdf
21. Mai 2017