첫 번째 접근 방식

첫 번째 접근 방식

레이어를 다음과 같이 사용할 수 있습니다.

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.

원하는 출력을 생성합니다. 아래 이미지의 첫 번째 줄은 다음과 같습니다.

여기에 이미지 설명을 입력하세요

그러나 이는 상당히 번거로운 일이다. \MyTikzMark필요할 때 노드를 생성하는 데 사용하는 것이 훨씬 쉽습니다.

Some \MyTikzMark{MyNode}{Highlighted} Text v2.

그런 다음 나중에 MyNode. 그러나 이 모드에서는 강조 표시를 할 수 없으며 on background layer위 이미지의 두 번째 줄로 끝납니다.

더 놀라운 점은 "번거로운" 솔루션을 모방하려는 무차별 접근 방식을 사용하면 실패한다는 것입니다.

\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}%
}%

암호:

\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}

답변1

tikzmark를 사용하여 먼저 배경을 그릴 수 있습니다. 페이지 나누기에는 약간 주의가 필요합니다(그러나 어쨌든 이것이 필요합니다). 두 개의 컴파일이 필요합니다.

\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}

여기에 이미지 설명을 입력하세요

답변2

첫 번째 접근 방식

아마도 상자를 사용하여 내용을 기억하고 다시 넣을 수 있습니다.

여기서 나는 게으르고 spy기억 상자를 설정하는 데 사용합니다. 기억 상자가 하나뿐이므로 \tikzmark두 단어를 강조 표시할 수 없습니다. 하지만 이는 스스로 상자를 관리하려는 의지가 있다면 가능합니다. 예를 들어 교체

      \global\setbox\tikz@lib@spybox=\hbox{\copy\tikz@lib@spybox}%

~에 의해

      \global\setbox\your@remembering@box=\hbox{\copy\tikz@lib@spybox}%

암호

\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}

두 번째 접근 방식

접근 방식은 p를 사용합니다.gfpages(p가 아님f페이지). 먼저 두 개의 논리적 페이지를 설정합니다. 첫 번째는 하이라이트용이고 두 번째는 실제 콘텐츠용입니다. 무언가를 강조표시하고 싶을 때마다 첫 번째 논리 페이지에 강조표시 코드를 추가하세요. (한 번에 여러 단어를 강조 표시할 수 있습니다.) 패키지가 나머지 작업을 수행합니다.

실제 콘텐츠가 두 페이지 이상인 경우에는 이 접근 방식이 작동하지 않습니다. 비머를 사용하는 경우 작동합니다.

\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}

세 번째 접근 방식

이건 미친 짓이야. 기본적으로 알고 싶은 모든 것을 aux 파일에 기록합니다. aux 파일이 (두 번째 편집에) 포함되면 대상 tikzpicture 앞에 후크가 추가됩니다. 따라서 대상 tikz그림이 그려지기 전에(세 번째 편집에서) 후크가 배경을 그립니다.

다시 말하지만 이건 미친 짓이다. 실제로 대상 노드가 직사각형이어야 합니다. 극복하기 어렵지는 않지만 여기에 불완전한 대답을 남겨 두겠습니다.

좋은 소식은 페이지 나누기의 영향을 받지 않는다는 것입니다.

\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}

관련 정보