warcomeb” post=78628Ciao Claudio, ho provato a fare questo
`\documentclass[a4paper,10pt,twocolumn]{IEEEtran}\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% COMANDI VARI PER LE IMMAGINI
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\usepackage{xparse}
\usepackage{tikz}
\usetikzlibrary{calc,positioning}\newcommand{\bigpicsize}[1]{\footnotesize{#1}}
\newcommand{\picsize}[1]{\scriptsize{#1}}
\newcommand{\picsizett}[1]{\scriptsize{\texttt{#1}}}
\newcommand{\smallpicsize}[1]{\tiny{#1}}\pgfmathtruncatemacro{\classwidth}{3}
\pgfmathtruncatemacro{\classheight}{2}
\newcommand{\setclasswidth}[1]{\pgfmathtruncatemacro{\classwidth}{#1}}
\newcommand{\setclassheight}[1]{\pgfmathtruncatemacro{\classheight}{#1}}\tikzset{class/.style args={#1 and #2}{
rectangle,draw,rounded corners,thick,minimum width=#1, minimum height=#2
}
}\tikzset{classinside/.code n args={3}{%
\node at ($(#1.north)+(0,-0.30)$){\picsizett{#2}};
\draw($(#1.north west)+(0,-0.60)$)–($(#1.north east)+(0,-0.60)$);
\node[yshift=-\classheight,text width=\classwidth cm,align=center] at (#1){#3};
}
}% DRAWCLASS
% #1 – Coordinate
% #2 – Label
% #3 – Nome Classe
% #4 – Contenuto
\NewDocumentCommand{\drawclass}{d() m m m}{
\IfNoValueTF{#1}{%true
\node[class=\classwidth cm and \classheight cm,name=#2]{};
}
{%false
\node[class=\classwidth cm and \classheight cm,name=#2]at(#1){};
}
\node[classinside={#2}{#3}{#4}]{};
}\newcommand{\classmark}[1]{%
\tikz[overlay,remember picture,baseline=-0.5ex,xshift=-0.3cm] \node[draw,fill=black,circle,scale=0.05] (#1) {};
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{document}\begin{figure*}[tb]
\centering
% \begin{tikzpicture}[scale=0.8,remember picture,overlay]
\begin{tikzpicture}[scale=0.8]% \draw[help lines,yshift=-15cm] (0,0) grid (18,15);
% SYSTEMC
\nodeat (18,0.25) {\bigpicsize{SystemC design}};
\draw [dashed] (2,0) rectangle (18,-3);\drawclass(5,-1.5){m1}{sc\_module}{\vdots \\ \classmark{m1init} \picsizett{ps\_init()}}
\drawclass(10,-1.5){m2}{sc\_module}{\vdots \\ \classmark{m2init} \picsizett{ps\_init()}}
\drawclass(15,-1.5){m3}{sc\_module}{\vdots \\ \classmark{m3init} \picsizett{ps\_init()}}
\draw(m1init.center) — ($(m1init)-(0,1)$)-|(m2init.center) — ($(m2init)-(0,1)$)-|(m3init.center);
% \draw(m1init.center) — ($(m1init)-(0,1)$)-|(m2init.center);
\end{tikzpicture}
\caption{Scheme of the interaction of Powersim with a SystemC design.}
\label{fig:powersim}
\end{figure*}\end{document}`
ma succedono cose strane:
1) se commento le help lines le tre righe di congiunzione dei classmark vengono spostate in altre parti della pagina.
2) se metto `\begin{tikzpicture}[scale=0.8,remember picture,overlay]` il disegno va per buona parte fuori della pagina.
3) se metto le help line (ma ovviamente dopo non ci vanno) e provo a disegnare solo una parte delle linee di collegamento (come ad esempio la riga commentata) anche qui questa viene messa in altre parti della pagina.cosa sta succedendo???
grazie
Marco
Ciao,
questo codice dovrebbe sistemare tutto:
`
\documentclass[a4paper,10pt,twocolumn]{IEEEtran}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% COMANDI VARI PER LE IMMAGINI
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\usepackage{xparse}
\usepackage{tikz}
\usetikzlibrary{calc,positioning}
\newcommand{\bigpicsize}[1]{\footnotesize{#1}}
\newcommand{\picsize}[1]{\scriptsize{#1}}
\newcommand{\picsizett}[1]{\scriptsize{\texttt{#1}}}
\newcommand{\smallpicsize}[1]{\tiny{#1}}
\pgfmathtruncatemacro{\classwidth}{3}
\pgfmathtruncatemacro{\classheight}{2}
\newcommand{\setclasswidth}[1]{\pgfmathtruncatemacro{\classwidth}{#1}}
\newcommand{\setclassheight}[1]{\pgfmathtruncatemacro{\classheight}{#1}}
\tikzset{class/.style args={#1 and #2}{
rectangle,draw,rounded corners,thick,minimum width=#1, minimum height=#2
}
}
\tikzset{classinside/.code n args={3}{%
\node at ($(#1.north)+(0,-0.30)$){\picsizett{#2}};
\draw($(#1.north west)+(0,-0.60)$)–($(#1.north east)+(0,-0.60)$);
\node[yshift=-\classheight,text width=\classwidth cm,align=center] at (#1){#3};
}
}
% DRAWCLASS
% #1 – Coordinate
% #2 – Label
% #3 – Nome Classe
% #4 – Contenuto
\NewDocumentCommand{\drawclass}{d() m m m}{
\IfNoValueTF{#1}{%true
\node[class=\classwidth cm and \classheight cm,name=#2]{};
}
{%false
\node[class=\classwidth cm and \classheight cm,name=#2]at(#1){};
}
\node[classinside={#2}{#3}{#4}]{};
}
\newcommand{\classmark}[1]{%
\tikz[overlay,remember picture,baseline=-0.5ex,xshift=-0.3cm] \node[draw,fill=black,circle,scale=0.05] (#1) {};
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{document}
\begin{figure*}[tb]
\centering
\begin{tikzpicture}[scale=0.8]
\draw[help lines,yshift=-15cm] (0,0) grid (18,15);
% SYSTEMC
\node
at (18,0.25) {\bigpicsize{SystemC design}};
\draw [dashed] (2,0) rectangle (18,-3);
\drawclass(5,-1.5){m1}{sc\_module}{\vdots \\ \classmark{m1init} \picsizett{ps\_init()}}
\drawclass(10,-1.5){m2}{sc\_module}{\vdots \\ \classmark{m2init} \picsizett{ps\_init()}}
\drawclass(15,-1.5){m3}{sc\_module}{\vdots \\ \classmark{m3init} \picsizett{ps\_init()}}
\end{tikzpicture}
% Usare solo le opzioni remember picture, overlay per disegnare le connessioni
\begin{tikzpicture}[scale=0.8,remember picture,overlay]
\draw(m1init.center) — ($(m1init)-(0,1)$)-|(m2init.center) — ($(m2init)-(0,1)$)-|(m3init.center);
\end{tikzpicture}
\caption{Scheme of the interaction of Powersim with a SystemC design.}
\label{fig:powersim}
\end{figure*}
\end{document}
` infatti il risultato mi sembra sia quello che ti aspetti:
[attachment=478]Immagine_2012-10-03.jpg[/attachment]
Ovviamente elimina pure le help lines. 😉
Il problema, forse, è che nel mio precedente intervento non avevo spiegato nessuna delle modifiche. Il comando che tu hai chiamato [tt]\classmark[/tt] è la famosa macro che serve come marker e può essere inserita facilmente in ogni punto del diagramma. Io l’ho usata per disegnare un pallino a sinistra del testo con uno shift di 0.3cm: ovviamente questo non va bene in caso tu la debba posizionare a destra. Ecco perché conviene cambiare la precedente definizione in:
`
\NewDocumentCommand{\classmark}{o m}{%
\IfNoValueTF{#1}{%true
\tikz[overlay,remember picture,baseline=-0.5ex,xshift=-0.3 cm] \node[draw,fill=black,circle,scale=0.05] (#2) {};
}
{%false
\tikz[overlay,remember picture,baseline=-0.5ex,xshift=#1 cm] \node[draw,fill=black,circle,scale=0.05] (#2) {};
}
}
` A questo punto se vuoi disegnare il connettore a destra ti basta dire:
`
\drawclass(5,-1.5){m1}{sc\_module}{\vdots \\ \picsizett{ps\_init()} \classmark[0.3]{m1init}}
` dove [tt][0.3][/tt] è l’argomento facoltativo in cui si introduce lo shift.
A parte la disgressione, è importantissimo sapere che quando si adotta questa scelta per disegnare le connessioni, occorre avere due “ambienti” [tt]tikzpicture[/tt]: nel primo si disegna la figura, nel secondo le connessioni. Il primo ambiente non avrà le opzioni [tt]remember picture, overlay[/tt] altrimenti la figura viene spostata chissà dove come capitava a te in precedenza perché disegnata come overlay senza avere una “base” di partenza, mentre la seconda figura che disegna le connessioni deve avere le opzioni [tt]remember picture, overlay[/tt] per poter disegnare le connessioni sulla figura di base. Con [tt]remember picture[/tt] infatti, la figura corrente conosce le coordinate usate nella figura di base. Nota anche che per il corretto processing è necessario compilare due volte.
Ciao
Claudio