Anhang

Anhang

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 \tikzmarkBefehl zu definieren, der sich einfach eine Koordinate remember picturemit overlayOptionen 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:

Ergebnis

Aber nehmen wir nun an, ich möchte einesolideGelb. Die naheliegende Idee ist, es zu verwenden pgfonlayerund 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}

Schlecht

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 \tikzmarkermö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:

Gut

Anhang

Der Vollständigkeit halber ist hier der Code des gesamten Dokuments, einschließlich der Präambel, in der das Neue \tikzmarkerscheint, 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, tikzpicturekann 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}

Schlecht :-(

Wenn wir die beiden jedoch zu weit voneinander trennen, besteht tikzpicturedie \tikzmarkGefahr, 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 \BgThispagegleichzeitig mit „aktivieren“, wenn wir das platzieren \tikzmark. Mit diesem Ansatz ist es nicht erforderlich, dasNeu verbesserttikzmarkund stattdessen diealt minimalistischtikzmarkkann verwendet werden.

placementEs 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:

Gut!

verwandte Informationen