Ich kann Ebenen wie folgt verwenden:
Some
\begin{tikzpicture}[baseline]
\node [anchor=base,inner sep=0pt] (X) at (0,0) {Highlighted};
\begin{pgfonlayer}{background layer}
\draw [fill=orange, fill opacity=0.9, baseline] (X.south west) rectangle (X.north east);
\end{pgfonlayer}
\end{tikzpicture} Text v1.
Dies erzeugt die gewünschte Ausgabe, die erste Zeile im Bild unten:
Dies ist jedoch ziemlich umständlich. Es ist viel einfacher, \MyTikzMark
einen Knoten zu erstellen, wenn er benötigt wird
Some \MyTikzMark{MyNode}{Highlighted} Text v2.
und dann später die Zeichnung erstellen, indem ich auf zugreife MyNode
. Mit diesem Modus gelingt es mir jedoch nicht, die Hervorhebung zu erreichen on background layer
und ich erhalte die zweite Linie im obigen Bild.
Überraschend ist außerdem, dass der Einsatz eines Brute-Force-Ansatzes, der die „umständliche“ Lösung nachzuahmen versucht, fehlschlägt:
\newcommand{\MyTikzMarkA}[2]{% Same behavior as \MyTikzMark.
\begin{tikzpicture}[baseline,remember picture]
\begin{pgfonlayer}{foreground layer}
\node[anchor=base,inner sep=0pt] (#1) {#2};%
\end{pgfonlayer}
\end{tikzpicture}%
}%
Code:
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{backgrounds}
\pgfdeclarelayer{background layer}
\pgfdeclarelayer{foreground layer}
\pgfsetlayers{background layer,main,foreground layer}
\newcommand{\MyTikzMark}[2]{%
\tikz[baseline,remember picture] \node[anchor=base,inner sep=0pt] (#1) {#2};%
}%
%\newcommand{\MyTikzMarkA}[2]{% Same behavior as above.
% \begin{tikzpicture}[baseline,remember picture]
% \begin{pgfonlayer}{foreground layer}
% \node[anchor=base,inner sep=0pt] (#1) {#2};%
% \end{pgfonlayer}
% \end{tikzpicture}%
%}%
\begin{document}
% This works!
Some
\begin{tikzpicture}[baseline]
\node [anchor=base,inner sep=0pt] (X) at (0,0) {Highlighted};
\begin{pgfonlayer}{background layer}
\draw [fill=orange, fill opacity=0.9, baseline] (X.south west) rectangle (X.north east);
\end{pgfonlayer}
\end{tikzpicture} Text v1.
%% But how to get this to work?
Some \MyTikzMark{MyNode}{Highlighted} Text v2.
\begin{tikzpicture}[remember picture, overlay]
\begin{pgfonlayer}{background layer}
\draw [fill=orange, fill opacity=0.9, baseline] (MyNode.south west) rectangle (MyNode.north east);
\end{pgfonlayer}
\end{tikzpicture}%
\end{document}
Antwort1
Sie könnten den Hintergrund einfach zuerst mit Tikzmark zeichnen. Sie müssen bei Seitenumbrüchen etwas vorsichtig sein (aber das wäre sowieso nötig). Es sind zwei Kompilierungen erforderlich.
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{tikzmark}
\newsavebox\mynode{}
\newcommand{\MyTikzMark}[2]{%
\savebox\mynode{#1}\raisebox{-\dp\mynode}{\tikzmark{#1begin}}\usebox\mynode\raisebox{\ht\mynode}{\tikzmark{#1end}}}
\begin{document}
\iftikzmark{MyNodebegin}
{\tikz[remember picture,overlay]\draw [fill=orange, fill opacity=0.9, baseline] (pic cs:MyNodebegin) rectangle (pic cs:MyNodeend);}
{}%
Some \MyTikzMark{MyNode}{Highlighted} Text v2.
\end{document}
Antwort2
Erste Ansatz
Vielleicht kannst du eine Kiste nutzen, um dich an den Inhalt zu erinnern und ihn wieder zurückzulegen.
Hier bin ich faul und richte spy
das Merkfeld ein. Da es nur ein Merkfeld gibt, können Sie nicht \tikzmark
zwei Wörter markieren und sie dann hervorheben. Dies ist jedoch möglich, wenn Sie bereit sind, die Felder selbst zu verwalten. Ersetzen Sie beispielsweise
\global\setbox\tikz@lib@spybox=\hbox{\copy\tikz@lib@spybox}%
von
\global\setbox\your@remembering@box=\hbox{\copy\tikz@lib@spybox}%
Code
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{spy}
\newcommand{\MyTikzMark}[2]{%
\tikz[baseline,remember picture,spy scope]\node[anchor=base,inner sep=0pt](#1){#2};%
}%
\begin{document}
\makeatletter
\tikzset{
spy scope/.append style={
execute at end scope={%
\global\setbox\tikz@lib@spybox=\hbox{\copy\tikz@lib@spybox}%
}
}
}
%% But how to get this to work?
Some \MyTikzMark{MyNode}{Highlighted} Text v2.
\begin{tikzpicture}[remember picture, overlay]
\draw [fill=orange, fill opacity=0.9] (MyNode.south west) rectangle (MyNode.north east);
\node at(MyNode.base){\copy\tikz@lib@spybox};
\end{tikzpicture}%
\end{document}
Zweiter Ansatz
Der Ansatz verwendet pGfpages (nicht pDfpages). Richten Sie zunächst zwei logische Seiten ein: die erste für Hervorhebungen und die zweite für den eigentlichen Inhalt. Wenn Sie etwas hervorheben möchten, fügen Sie den Hervorhebungscode zur ersten logischen Seite hinzu. (Sie können mehrere Wörter gleichzeitig hervorheben.) Das Paket erledigt den Rest.
Dieser Ansatz funktioniert nicht, wenn der eigentliche Inhalt mehr als eine Seite umfasst. Er funktioniert, wenn Sie Beamer verwenden.
\documentclass{article}
\usepackage{tikz}
\usepackage{pgfpages}
\pgfpagesdeclarelayout{one page but with background}{}{%
\pgfpagesphysicalpageoptions{ logical pages=2,%
physical width=\paperwidth, first logical shipout=2,%
physical height=\paperheight,last logical shipout=2,%
}
\pgfpageslogicalpageoptions1{center=\pgfqpoint{.5\paperwidth}{.5\paperheight}}
\pgfpageslogicalpageoptions2{center=\pgfqpoint{.5\paperwidth}{.5\paperheight}}
}
\pgfpagesuselayout{one page but with background}%
\newcommand{\MyTikzMark}[2]{%
\tikz[baseline,remember picture]\node[anchor=base,inner sep=0pt](#1){#2};%
}
\begin{document}
%% But how to get this to work?
Some \MyTikzMark{MyNode}{Highlighted} Text v2.
\pgfpagesshipoutlogicalpage1\vbox{
\tikz[remember picture, overlay]
\draw[fill=orange, fill opacity=0.9](MyNode.south west)rectangle(MyNode.north east);
}
\end{document}
Dritter Ansatz
Das ist verrückt. Im Grunde schreibt es alles, was Sie wissen möchten, in die AUX-Datei. Wenn die AUX-Datei enthalten ist (in der zweiten Kompilierung), wird vor dem Ziel-Tikzbild ein Hook hinzugefügt. Bevor also das Ziel-Tikzbild gezeichnet wird (in der dritten Kompilierung), zeichnet der Hook den Hintergrund für Sie.
Auch das ist verrückt. Es erfordert tatsächlich, dass der Zielknoten rechteckig ist. Obwohl diese Probleme nicht schwer zu lösen sind, werde ich die unvollkommene Antwort hier stehen lassen.
Die gute Nachricht ist: Es wird durch Seitenumbrüche nicht beeinflusst.
\documentclass{article}
\usepackage{tikz,lipsum}
\newcommand{\MyTikzMark}[2]{%
\dopicturebackground%
\tikz[baseline,remember picture]\node[anchor=base,inner sep=0pt](#1){#2};%
}
\makeatletter
\newcount\pgf@picture@serial@count@temp
% #1: associated node name
% #2: the background code you want to add
\def\addbackgroundto(#1)#2{%
\edef\pgf@tempnodename{#1}%
\edef\pgf@tempgfid{{\csname pgf@sh@pi@\pgf@tempnodename\endcsname}}%
\def\southwest{\string\southwest}%
\def\northeast{\string\northeast}%
\edef\pgf@tempnodeinfor{{%
\string\pgfutil@namedef{pgf@sh@ns@\pgf@tempnodename}{\csname pgf@sh@ns@\pgf@tempnodename\endcsname}%
\string\pgfutil@namedef{pgf@sh@np@\pgf@tempnodename}{\csname pgf@sh@np@\pgf@tempnodename\endcsname}%
\string\pgfutil@namedef{pgf@sh@nt@\pgf@tempnodename}{\csname pgf@sh@nt@\pgf@tempnodename\endcsname}%
\string\pgfutil@namedef{pgf@sh@pi@\pgf@tempnodename}{\csname pgf@sh@pi@\pgf@tempnodename\endcsname}%
\string\pgfutil@namedef{pgf@sh@ma@\pgf@tempnodename}{\csname pgf@sh@ma@\pgf@tempnodename\endcsname}%
}}%
\expandafter\pgfsys@addnodebackground\expandafter\pgf@tempgfid\pgf@tempnodeinfor{\tikz[remember picture,overlay]{#2}}%
}
% #1: pgfid of the desination
% #2: all node information
% #3: the background code you want to add
\def\pgfsys@addnodebackground#1#2#3{%
\pgfutil@writetoaux{\string\pgfsysaddpicturebackground#1{#2\detokenize{#3}}}%
}
% #1: pgfid of the destination
% #2: all node information
% and the background code you want to add
\def\pgfsysaddpicturebackground#1#2{%
\expandafter\gdef\csname picturebackground#1\endcsname{#2}%
}
\def\dopicturebackground{%
\global\pgf@picture@serial@count@temp=\pgf@picture@serial@count\relax%
\pgf@picture@serial@count=10000\relax%
\csname picturebackgroundpgfid\the\numexpr\pgf@picture@serial@count@temp+1\endcsname%
\global\pgf@picture@serial@count=\pgf@picture@serial@count@temp\relax%
}
\begin{document}
%% But how to get this to work?
Some \MyTikzMark{My Node}{Highlighted} Text v2.
\clearpage
second page
\addbackgroundto(My Node){
\draw[fill=orange, fill opacity=0.9](My Node.south west)rectangle(My Node.north east);
}
\end{document}