Erste Ansatz

Erste Ansatz

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:

Bildbeschreibung hier eingeben

Dies ist jedoch ziemlich umständlich. Es ist viel einfacher, \MyTikzMarkeinen 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 layerund 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}

Bildbeschreibung hier eingeben

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 spydas Merkfeld ein. Da es nur ein Merkfeld gibt, können Sie nicht \tikzmarkzwei 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}

verwandte Informationen