4903 × 314 ピクセルの PDF 画像があります。画像の (3903, 251) にノードを配置するにはどうすればよいでしょうか? 画像自体は、ページの幅に合わせて拡大縮小されます。
答え1
編集: 複数のノード用の2番目のマクロを追加しました
の説明\PlaceInImageAt
:
の最初の引数は
(#1,#2)
画像のピクセル サイズ、2 番目は(#4,#5)
ノードを配置するピクセルです。 は#3
使用する画像、オプションの[#6]
は に指定できるオプション\node
、最後に#7
そのノードの内容です。サイズ引数(#1,#2)
はオプションです。指定されていない場合はが使用されます。のコマンド(100,100)
を変更することで、画像を任意のサイズ (不均等でも) に拡大縮小できます。\includegraphics
#3
の説明\MultiPlaceInImageAt
:
最初の 3 つの引数は同じです。optional は、[#4]
各ノードに渡されるオプションを受け取ります。最後の引数は、コンマで区切られたリストです。各ノードは、次のスキームに従って中括弧で囲む必要があります
{<x>,<y>=[<options>]<content>}
。
\documentclass[]{article}
\usepackage{tikz,graphicx}
\makeatletter
\newbox\PlaceInImageAtbox
\newcommand\PlaceInImageAt{}% just to check whether it is already defined
\def\PlaceInImageAt
{%
\@ifnextchar(
{\PlaceInImageAt@i}
{\PlaceInImageAt@i(100,100)}
}
\def\PlaceInImageAt@i(#1,#2)#3(#4,#5)%
{%
\@ifnextchar[
{\PlaceInImageAt@ii{#1}{#2}{#3}{#4}{#5}}
{\PlaceInImageAt@ii{#1}{#2}{#3}{#4}{#5}[]}%
}
\def\PlaceInImageAt@ii#1#2#3#4#5[#6]#7%
{%
\setbox\PlaceInImageAtbox\hbox{#3}%
\begin{tikzpicture}
\draw[use as bounding box] node at (0,0) {\usebox\PlaceInImageAtbox};
\pgfmathsetmacro\PlaceInImageAtx{(#4 - #1/2) * (\wd\PlaceInImageAtbox/#1)}
\pgfmathsetmacro\PlaceInImageAty{(#5 - #2/2) * (\ht\PlaceInImageAtbox/#2)}
\node[#6] at (\PlaceInImageAtx pt,\PlaceInImageAty pt) {#7};
\end{tikzpicture}%
}
\def\MultiPlaceInImageAt
{%
\@ifnextchar(
{\MultiPlaceInImageAt@i}
{\MultiPlaceInImageAt@i(100,100)}
}
\def\MultiPlaceInImageAt@i(#1,#2)#3%
{%
\@ifnextchar[
{\MultiPlaceInImageAt@ii{#1}{#2}{#3}}
{\MultiPlaceInImageAt@ii{#1}{#2}{#3}[]}%
}
\def\MultiPlaceInImageAt@ii#1#2#3[#4]#5%
{%
\setbox\PlaceInImageAtbox\hbox{#3}%
\begin{tikzpicture}
\draw[use as bounding box] node at (0,0) {\usebox\PlaceInImageAtbox};
\@for\arg@MultiPlace:={#5}\do
{%
\expandafter
\MultiPlaceInImageAt@each\arg@MultiPlace\@rgend{#1}{#2}{#4}
}
\end{tikzpicture}
}
\def\MultiPlaceInImageAt@each#1,#2=%
{%
\@ifnextchar[
{\MultiPlaceInImageAt@each@i{#1}{#2}}
{\MultiPlaceInImageAt@each@i{#1}{#2}[]}%
}
\def\MultiPlaceInImageAt@each@i#1#2[#3]#4\@rgend#5#6#7%
{%
\pgfmathsetmacro\PlaceInImageAtx{(#1 - #5/2) * (\wd\PlaceInImageAtbox/#5)}
\pgfmathsetmacro\PlaceInImageAty{(#2 - #6/2) * (\ht\PlaceInImageAtbox/#6)}
\node[#7,#3] at (\PlaceInImageAtx pt, \PlaceInImageAty pt) {#4};
}
\makeatother
\begin{document}
\PlaceInImageAt(4903,314){\includegraphics{example-image}}
(3903,251)[draw,circle,red]{foo}
\PlaceInImageAt{\includegraphics[width=5cm,height=2cm]{example-image}}
(50,50)[draw,circle,red]{foo}
\MultiPlaceInImageAt{\includegraphics[scale=0.5]{example-image-a}}
[red]% option for each node
{{20,20=[blue]a},{40,40={b}},{60,60={c}},{80,80={d}}}
\end{document}
答え2
\textwidth
以下は、グラフィックスのみを拡大縮小する場合(垂直方向の拡大縮小が比例するように)に実行するコードです。
アップデート: 繰り返し使用するための小さなマクロを作成しました。
\documentclass{article}
\usepackage{tikz}
\newcommand{\PlaceNode}[5][]{
\pgfmathsetmacro{\myx}{(#2-4903/2)*(\the\textwidth/4903)}
\pgfmathsetmacro{\myy}{(#3-314/2)*(\the\textwidth/4903)}
\node[#1] (#4) at (\myx pt,\myy pt) {#5};
}
\begin{document}
\begin{tikzpicture}
\node at (0,0){\includegraphics[width=\textwidth]{example-image-a}};
\PlaceNode[draw,circle,red]{3903}{251}{first}{}
\PlaceNode[draw,circle,blue]{3703}{151}{second}{}
\end{tikzpicture}
\end{document}