
Stellen Sie sich vor, ich möchte eine gefüllte Form hinter etwas zeichnen, das bereits auf der Seite gesetzt ist. Der übliche Ansatz besteht darin, einen \tikzmark
Befehl zu definieren, der sich einfach eine Koordinate remember picture
mit overlay
Optionen merkt, und diese Koordinate später zu verwenden, um Tikz-Material mit Transparenz zu zeichnen.
Zum Beispiel:
\documentclass{article}
\usepackage{tikz}
\usepackage{lipsum}
\usetikzlibrary{backgrounds}
\def\tikzmark#1{\tikz[remember picture,overlay]\coordinate(#1);}
\begin{document}
\noindent\tikzmark{A}\lipsum[11]
\begin{tikzpicture}[remember picture, overlay]
\fill[yellow, opacity=.3] (A) circle(2em);
\end{tikzpicture}
\end{document}
Das Ergebnis:
Aber nehmen wir nun an, ich möchte einesolideGelb. Die naheliegende Idee ist, es zu verwenden pgfonlayer
und auf dem Hintergrund zu zeichnen. Das Konzept von Hintergrund/Vordergrund existiert jedoch anscheinend nur in Tikz-Umgebungen. Da der Haupttext auf der Seite bereits gesetzt wurde, befindet er sich hinter dem Hintergrund von Tikz:
\documentclass{article}
\usepackage{tikz}
\usepackage{lipsum}
\usetikzlibrary{backgrounds}
\def\tikzmark#1{\tikz[remember picture,overlay]\coordinate(#1);}
\begin{document}
\noindent\tikzmark{A}\lipsum[11]
\begin{tikzpicture}[remember picture, overlay]
\begin{pgfonlayer}{background}
\fill[yellow] (A) circle(2em);
\end{pgfonlayer}
\end{tikzpicture}
\end{document}
Ist das möglich?
Antwort1
Vielen Dank an Andrew Stacey für den Hinweis auf dieNeu verbesserttikzmkark
. Das war mir nicht bewusst. Diese Version von \tikzmark
ermöglicht die Verwendung der definierten KoordinatenVorder Punkt seiner Definition. Die Verwendung \tikzmark{foo}
einer neuen Koordinate mit dem Namen (pic cs:foo)
ist verfügbar und kann überall auf der Seite verwendet werden.
Unter Verwendung der neuen \tikzmark
, aus der Präambel vonhttps://tex.stackexchange.com/a/50054/12571das Problem kann folgendermaßen gelöst werden:
\begin{document}
\noindent\begin{tikzpicture}[remember picture, overlay]
\fill[yellow] (pic cs:A) circle(2em);
\end{tikzpicture}%
\tikzmark{A}\lipsum[11]
\end{document}
Mit dem gewünschten Ergebnis:
Anhang
Der Vollständigkeit halber ist hier der Code des gesamten Dokuments, einschließlich der Präambel, in der das Neue \tikzmark
erscheint, eingefügt:
\documentclass{article}
\usepackage{tikz}
\usepackage{lipsum}
\makeatletter
\tikzset{%
remember picture with id/.style={%
remember picture,
overlay,
save picture id=#1,
},
save picture id/.code={%
\edef\pgf@temp{#1}%
\immediate\write\pgfutil@auxout{%
\noexpand\savepointas{\pgf@temp}{\pgfpictureid}}%
},
if picture id/.code args={#1#2#3}{%
\@ifundefined{save@pt@#1}{%
\pgfkeysalso{#3}%
}{
\pgfkeysalso{#2}%
}
}
}
\def\savepointas#1#2{%
\expandafter\gdef\csname save@pt@#1\endcsname{#2}%
}
\def\tmk@labeldef#1,#2\@nil{%
\def\tmk@label{#1}%
\def\tmk@def{#2}%
}
\tikzdeclarecoordinatesystem{pic}{%
\pgfutil@in@,{#1}%
\ifpgfutil@in@%
\tmk@labeldef#1\@nil
\else
\tmk@labeldef#1,(0pt,0pt)\@nil
\fi
\@ifundefined{save@pt@\tmk@label}{%
\tikz@scan@one@point\pgfutil@firstofone\tmk@def
}{%
\pgfsys@getposition{\csname save@pt@\tmk@label\endcsname}\save@orig@pic%
\pgfsys@getposition{\pgfpictureid}\save@this@pic%
\pgf@process{\pgfpointorigin\save@this@pic}%
\pgf@xa=\pgf@x
\pgf@ya=\pgf@y
\pgf@process{\pgfpointorigin\save@orig@pic}%
\advance\pgf@x by -\pgf@xa
\advance\pgf@y by -\pgf@ya
}%
}
\newcommand\tikzmark[2][]{%
\tikz[remember picture with id=#2] #1;}
\makeatother
\begin{document}
\noindent\begin{tikzpicture}[remember picture, overlay]
\fill[yellow] (pic cs:A) circle(2em);
\end{tikzpicture}%
\tikzmark{A}\lipsum[11]
\end{document}
NOTIZ: Wer geneigt ist, für diese Selbstantwort zu stimmen, sollte stimmen fürhttps://tex.stackexchange.com/a/50054/12571stattdessen :-)
Aktualisieren
Wie Ulrike Fischer in einem Kommentar bemerkte, tikzpicture
kann es Nebenwirkungen auf den vorhergehenden Absatz haben, wenn das Element, das den Hintergrund zeichnet, zu nahe an den dekorierten Absatz gesetzt wird:
\begin{document}
\lipsum[5] % <------ Added a previous paragraph
\medskip
\noindent\begin{tikzpicture}[remember picture, overlay]
\fill[yellow] (pic cs:A) circle(2em);
\end{tikzpicture}%
\tikzmark{A}\lipsum[11]
\end{document}
Wenn wir die beiden jedoch zu weit voneinander trennen, besteht tikzpicture
die \tikzmark
Gefahr, dass diese auf separaten Seiten landen und der Hintergrund somit auf der falschen Seite erscheint.
Die beste Lösung besteht dann darin, eine Lösung zu verwenden, die das gewünschte Bild „speichert“ und seine Ausgabe als Hintergrund „aktiviert“, während wir das platzieren \tikzmark
, wie beispielsweise die von Ulrike im Kommentar vorgeschlagene Lösung.
Ich habe eine andere Möglichkeit erkundet, nämlich die Verwendung des wunderbarenHintergrundpaketvonGonzalo Medina(danke an Andrew für den Vorschlag im Chat!). Mit diesem Paket können wir das Hintergrundbild an beliebiger Stelle im Dokument einrichten und es \BgThispage
gleichzeitig mit „aktivieren“, wenn wir das platzieren \tikzmark
. Mit diesem Ansatz ist es nicht erforderlich, dasNeu verbesserttikzmark
und stattdessen diealt minimalistischtikzmark
kann verwendet werden.
placement
Es ist auch wichtig, den Optionen und entsprechende Werte zuzuweisen scale
, um die Zeichnung an den entsprechenden Koordinaten zu erhalten. Hier ist das MWE:
\documentclass{article}
\usepackage{tikz}
\usepackage[pages=some]{background}
\usepackage{lipsum}
\def\tikzmark#1{\tikz[remember picture, overlay]\coordinate(#1);}
\begin{document}
\backgroundsetup{scale=1,placement=bottom,contents={%
\noindent\begin{tikzpicture}[remember picture,overlay]
\fill[yellow] (A) circle(2em);
\end{tikzpicture}%
}}
\lipsum[5]
\medskip
\noindent\tikzmark{A}\BgThispage\lipsum[11]
\end{document}
Und nach drei (warum drei?) Kompilierungen bekomme ich: