Diga o código abaixo:
\documentclass[tikz,border=2mm]{standalone}
\usetikzlibrary{positioning}
\tikzset{
% colmat
pics/colmat/.style={code={
\tikzset{colmat/.cd,#1} \def\pv##1{\pgfkeysvalueof{/tikz/colmat/##1}}%
\edef\m{\pv{m}}%
\edef\w{2}%
\foreach \row [count=\j] in \m {
\foreach \r/\g/\b [count=\i] in \row {
\fill[fill={rgb,255:red,\r; green,\g; blue,\b}] (\i*\w,\j*\w) rectangle ++(\w,\w);
}%foreach
}%foreach
}},colmat/.cd,m/.initial={{255/0/0}},/tikz/.cd,
%
}
\begin{document}
\begin{tikzpicture}
\tikzset{
box/.style={draw,minimum width=1cm,minimum height=1cm}
}
\def\clst{
{200/10/10},
{10/10/200},
{10/200/200}%
}
\node[box] (A) at (0,0) {A};
\foreach \pos in {left,right,above,below} {
\node[\pos=1 of A,matrix] (B-\pos) {\pic{colmat={m=\clst}};\\};
}
\node[left=6 of A,box] (C) at (0,0) {C};
\foreach \pos in {left,right,above,below} {
\node[\pos=1 of C,box] (D) {D};
}
\end{tikzpicture}
\end{document}
Desejo que o bloco pic em torno de A tenha o mesmo comportamento do nó D em torno de C. Encontrei algumas perguntas semelhantes, mas ainda não descobri a maneira certa de fazer isso.
Responder1
Acho que essa pergunta já surgiu antes. O truque é agrupar pic
em um matrix
nó (para ser claro, esta é uma matriz 1x1). Isso funciona a menos que você queira colocar o pic
em uma matriz, mas aí você pode usar o pic
próprio, ou quiser usar uma matriz no pic
, pelo menos a partir de agora.
\documentclass[tikz,border=2mm]{standalone}
\usetikzlibrary{positioning}
\tikzset{
pics/mypic/.style={code={
\tikzset{mypic/.cd,#1} \def\pv##1{\pgfkeysvalueof{/tikz/mypic/##1}}%
\edef\m{\pv{m}}%
\foreach \row [count=\j] in \m {
\foreach \r/\g/\b [count=\i] in \row {
\fill[fill={rgb,255:red,\r; green,\g; blue,\b}] (\i-1,\j-1) rectangle ++(1,1);
}%foreach
}%foreach
}},mypic/.cd,m/.initial={{255/0/0}},/tikz/.cd,
%
}
\begin{document}
\begin{tikzpicture}
\tikzset{
box/.style={draw,minimum width=1cm,minimum height=1cm}
}
\def\clst{
{31/18/12}%
}
\node[box] (A) at (0,0) {A};
\foreach \pos in {left,right,above,below} {
\node[\pos=1 of A,matrix] (B-\pos) {\pic{mypic={m=\clst}};\\};
}
\node[left=6 of A,box] (C) at (0,0) {C};
\foreach \pos in {left,right,above,below} {
\node[\pos=1 of C,box] (D) {D};
}
\end{tikzpicture}
\end{document}
Uma maneira simples de lidar com fotos maiores é contar as entradas e torná-las simétricas.
\documentclass[tikz,border=2mm]{standalone}
\usetikzlibrary{positioning}
\tikzset{
% colmat
pics/colmat/.style={code={
\tikzset{colmat/.cd,#1}
\def\pv##1{\pgfkeysvalueof{/tikz/colmat/##1}}%
\edef\m{\pv{m}}%
\foreach \row [count=\j] in \m {\xdef\mydimj{\j}
\foreach \r/\g/\b [count=\i] in \row {\xdef\mydimi{\i}}}
\typeout{\m,\mydimi,\mydimj}
\edef\w{2}%
\foreach \row [count=\j] in \m {
\foreach \r/\g/\b [count=\i] in \row {
\fill[fill={rgb,255:red,\r; green,\g; blue,\b}]
(\i*\w-\mydimi/2,\j*\w-\mydimj/2) rectangle ++(\w,\w);
}%foreach
}%foreach
}},colmat/.cd,m/.initial={{255/0/0}},/tikz/.cd,
%
}
\begin{document}
\begin{tikzpicture}
\tikzset{
box/.style={draw,minimum width=1cm,minimum height=1cm}
}
\def\clst{
{200/10/10},
{10/10/200},
{10/200/200}%
}
\node[box] (A) at (0,0) {A};
\foreach \pos in {left,right,above,below} {
\node[\pos=1 of A,matrix] (B-\pos) {\pic{colmat={m=\clst}};\\};
}
\node[left=6 of A,box] (C) at (0,0) {C};
\foreach \pos in {left,right,above,below} {
\node[\pos=1 of C,box] (D) {D};
}
\end{tikzpicture}
\end{document}
Responder2
Responder3
Atualizada:
Com o código de desenho
\foreach \row [count=\j] in \m {
\foreach \r/\g/\b [count=\i] in \row {
\fill[fill={rgb,255:red,\r; green,\g; blue,\b}]
(\i * \w, \j * \w) rectangle ++(\w,\w);
}
}
- cada quadrado preenchido tem seu canto sudoeste em
(\i*\w, \j*\w)
e canto nordeste em(\i*\w + \w, \j*\w + \w)
. - Para
\i
variar de1
até\mydimi
ej
até (1
inclusive\mydimj
), o retângulo maior construído tem seu canto sudoeste em(1*\w, 1*\w)
e canto nordeste em(\mydimi*\w + \w, \mydimj*\w + \w)
. - Portanto, o centro desse retângulo maior está em
(.5*\mydimi*\w + \w, 0.*\mydimj*\w + \w)
. Para colocar esse centro na origem(0, 0)
, deslocamos a coordenada usando
shift={(-0.5*\mydimi*\w - \w, -0.5*\mydimj*\w - \w)}
Um exemplo completo, observe que simplifiquei um pouco a pic
definição.
\documentclass[tikz,border=2mm]{standalone}
\usetikzlibrary{positioning}
\makeatletter
\tikzset{
% colmat
pics/colmat/.style={code={
\tikzset{colmat/#1}
\foreach \row [count=\j] in \pic@colmat@m {
\xdef\mydimj{\j}
\foreach \r/\g/\b [count=\i] in \row {\xdef\mydimi{\i}}
}
\edef\w{2}%
\foreach \row [count=\j] in \pic@colmat@m {
\foreach \r/\g/\b [count=\i] in \row {
\fill[fill={rgb,255:red,\r; green,\g; blue,\b},
shift={(-0.5*\mydimi*\w - \w, -0.5*\mydimj*\w - \w)}]
(\i * \w, \j * \w) rectangle ++(\w,\w);
}%foreach
}%foreach
}},
colmat/m/.estore in=\pic@colmat@m,
colmat/m/.initial={{255/0/0}}
}
\makeatother
\begin{document}
\begin{tikzpicture}
\tikzset{
box/.style={draw,minimum width=1cm,minimum height=1cm}
}
\def\clst{
{200/10/10},
{10/10/200},
{10/200/200}%
}
\node[box] (A) at (0,0) {A};
\foreach \pos in {left,right,above,below} {
\pic[\pos=2 of A] (B-\pos) {colmat={m=\clst}};
}
\node[left=6 of A,box] (C) at (0,0) {C};
\foreach \pos in {left,right,above,below} {
\node[\pos=1 of C,box] (D-\pos) {D};
}
\end{tikzpicture}
\end{document}
Resposta antiga:
Ao contrário do nó, uma foto possui uma âncora fixa. Essa âncora está (0, 0)
dentro de seus comandos de desenho. Consulte o manual pgf, seg. 18.2, parágrafoA localização de uma foto.
Na definição da sua foto, (0, 0)
está no canto sudoeste do quadrado preenchido. Conseqüentemente, o tikz coloca todos os cantos sudoeste da foto mypic
em posições como left=1 of A
.
Dentro da definição da foto, mover (0, 0)
para o centro do quadrado preenchido resolve o seu problema. Aqui eu uso uma shift
opção para compensar. É melhor ajustar as coordenadas utilizadas nos comandos de desenho de mypic
, para manter seu centro na origem.
% before
\fill[fill={...}, ] (\i-1,\j-1) rectangle ++(1,1);
% after
\fill[fill={...}, shift={(-.5, -.5)}] (\i-1,\j-1) rectangle ++(1,1);
% for updated example in question, a shift of (0, -3) is required.