
페이지에 이미 조판된 항목 뒤에 채워진 모양을 그리고 싶다고 상상해 보세요. 일반적인 접근 방식은 \tikzmark
단순히 좌표 remember picture
와 overlay
옵션을 기억하는 명령을 정의하고 나중에 해당 좌표를 사용하여 투명도를 사용하여 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
및 에 적절한 값을 지정하는 것도 중요합니다 . scale
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}
그리고 3번(왜 3번?) 컴파일 후에 다음과 같은 결과를 얻습니다.