付録

付録

ページにすでにタイプセットされているものの背後に塗りつぶされた図形を描画したいとします。通常のアプローチは、とオプション\tikzmarkを使用して座標を単に記憶するコマンドを定義し、後でその座標を使用して透明度を使用して tikz のものを描画することです。remember pictureoverlay

例えば:

\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

教えてくれたアンドリュー・ステイシーに感謝します新しい改良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 がコメントで提案したソリューションがそうです。

私は別の選択肢を検討しました。それは素晴らしい背景パッケージによるゴンサロ・メディナ(チャットで提案してくれたアンドリューに感謝します!)このパッケージを使用して、ドキュメント内の任意の場所に背景画像を設定し、\BgThispageを配置すると同時にで「アクティブ化」します\tikzmark。このアプローチを使用すると、新しい改良tikzmarkそして代わりに古いミニマリストtikzmarkに使える。

適切な座標で描画を行うには、オプションとに適切な値を与えることも重要です。MWE がありplacementます。scale

\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 回?) コンパイルすると、次の結果が得られます。

良い!

関連情報