부록

부록

페이지에 이미 조판된 항목 뒤에 채워진 모양을 그리고 싶다고 상상해 보세요. 일반적인 접근 방식은 \tikzmark단순히 좌표 remember pictureoverlay옵션을 기억하는 명령을 정의하고 나중에 해당 좌표를 사용하여 투명도를 사용하여 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]
  \fill[yellow, opacity=.3] (A) circle(2em);
\end{tikzpicture}
\end{document}

다음을 생성합니다.

결과

하지만 이제 내가 원한다고 가정해 보세요.단단한노란색. 분명한 아이디어는 pgfonlayer배경에 사용하고 그리는 것입니다. 그러나 배경/전경 개념은 분명히 tikz 환경 내부에만 존재합니다. 페이지의 주요 텍스트는 이미 조판되었으므로 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}

나쁜

할 수 있나요?

답변1

나에게 다음 사항을 알려준 Andrew Stacey에게 감사드립니다.새로 개선된tikzmkark. 나는 그것을 알지 못했습니다. 이 버전에서는 \tikzmark정의된 좌표를 사용할 수 있습니다.~ 전에그 정의의 요점. \tikzmark{foo}명명된 새 좌표를 사용하는 (pic cs:foo)것이 가능하며 페이지 어디에서나 사용할 수 있습니다.

\tikzmark의 서문에서 가져온 새로운 를 사용하여https://tex.stackexchange.com/a/50054/12571문제는 다음과 같이 해결될 수 있습니다.

\begin{document}
\noindent\begin{tikzpicture}[remember picture, overlay]
  \fill[yellow] (pic cs:A) circle(2em);
\end{tikzpicture}%
\tikzmark{A}\lipsum[11]
\end{document}

원하는 결과를 얻으려면:

좋은

부록

완전성을 위해 새로운 내용이 \tikzmark나타나는 서문을 포함한 전체 문서의 코드가 여기에 포함되어 있습니다.

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

메모: 이 자체 답변에 투표하려는 사람은 누구나 다음에 투표해야 합니다.https://tex.stackexchange.com/a/50054/12571대신에 :-)


업데이트

주석에서 Ulrike Fischer가 언급했듯이 tikzpicture배경을 장식된 단락에 너무 가깝게 그리는 을 배치하면 이전 단락에 부작용이 발생할 수 있습니다.

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

나쁜 :-(

그러나 너무 많은 것을 분리하면 별도의 페이지에 있는 것으로 끝날 위험이 tikzpicture있으므로 \tikzmark배경이 잘못된 페이지에 나타날 수 있습니다.

\tikzmark가장 좋은 해결책은 예를 들어 Ulrike가 주석에서 제안한 솔루션과 같이 필요한 그림을 "저장"하고 해당 출력을 배경으로 "활성화"하는 동시에 를 배치하는 일부 솔루션을 사용하는 것입니다 .

나는 또 다른 옵션을 탐색했는데, 그것은 훌륭한 기능을 사용하는 것입니다.배경 패키지~에 의해곤잘로 메디나(채팅에서 제안해준 Andrew에게 감사드립니다!) 이 패키지를 사용하여 문서의 어느 곳에 \BgThispage나 배경 그림을 설정하고 \tikzmark. 이 접근 방식을 사용하면새로 개선된tikzmark그리고 대신에오래된 미니멀리즘tikzmark사용할 수 있습니다.

적절한 좌표에서 도면을 얻으려면 옵션 placement및 에 적절한 값을 지정하는 것도 중요합니다 . scaleMWE가 있습니다:

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

그리고 3번(왜 3번?) 컴파일 후에 다음과 같은 결과를 얻습니다.

좋은!

관련 정보