[pstricks] Superimposing \psframeboxes, and \psmatrix alignment
Denis Girou
Denis.Girou at idris.fr
Mon Sep 2 20:58:28 CEST 2002
>>>>> "Bryn.Humberstone" == Bryn Humberstone <bdh at alphalink.com.au> writes:
Bryn.Humberstone> I'm trying to use pstricks to make a diagram in which I need to create boxes
Bryn.Humberstone> of tables of text like so:
Bryn.Humberstone> +-----------+
Bryn.Humberstone> | ... |
Bryn.Humberstone> | ... |
Bryn.Humberstone> | ... |
Bryn.Humberstone> | |
Bryn.Humberstone> +-----------+
Bryn.Humberstone> I have no problem using \psframebox and putting arrays inside. The trouble
Bryn.Humberstone> comes because I'd like each box to have a little boxed number in the top
Bryn.Humberstone> left corner like:
Bryn.Humberstone> +-+---------+
Bryn.Humberstone> |6| ... |
Bryn.Humberstone> +-+ ... |
Bryn.Humberstone> | ... |
Bryn.Humberstone> | |
Bryn.Humberstone> +-----------+
Bryn.Humberstone> and there seem to be plenty of ways this could be accomplished but I've been
Bryn.Humberstone> unable to get any of them to work.
Bryn.Humberstone> My idea was to draw the array and then just superimpose another
Bryn.Humberstone> \psframebox{6} at the same location. The main issue is that the my boxes are
Bryn.Humberstone> themselves within a \psmatrix so I don't have access to their exact
Bryn.Humberstone> coordinates. I thought this would not be a problem each of the boxes are
Bryn.Humberstone> within \rnodes, so I have their names. But I'm not sure how I can insist
Bryn.Humberstone> that another psframebox is placed at "the top-left corner of rnode A", say.
Bryn.Humberstone> I tried using \nput but I can't get it to put a new object where I'd like.
I am not absolutely sure of what is the best solution. It seems that we can
use the original macro and just explicitely transfer at the right place the
other small box with the reference. This work in my tests, but perhaps your
usage would be more evoluted and this would not work. Otherwise, a logical way
is to define a special version of the \psframebox macro which add the
definition of a node which will serve to reference the top-left corner later.
I give you the two versions. Make your own tests and see what is better for
you...
Bryn.Humberstone> A more general question that would also (I think) be enough is: is there a
Bryn.Humberstone> pstricks function to convert a node name into a pair of coordinates, so I
Bryn.Humberstone> could do something like:
Bryn.Humberstone> \rput[tl]{\MagicalFunction{A}}{ \psframebox{6} }
Faton Berisha already answered on this point. Just note that these
coordinates will be only known at the PostScript level, not TeX level,
but in such cases it is enough.
Bryn.Humberstone> Another thing that a quick search through the list archives couldn't help me
Bryn.Humberstone> with was psmatrices: I am using them to create a column of these boxes. The
Bryn.Humberstone> problem is that the boxes are different widths and \psmatrix centres
Bryn.Humberstone> the column horizontally by default. Is there a way of changing this so they
Bryn.Humberstone> are left aligned?
Use the "mcol" parameter with the "l" value (see Beta documentation page 28).
D.G.
\documentclass[a4paper]{article}
\usepackage{pstcol}
\usepackage{pst-node}
\newcommand{\MyFrameSep}{0.5}
\newcommand{\MyBox}[2]{%
\psframebox[framesep=\MyFrameSep]{%
\rput[l](-\MyFrameSep,\MyFrameSep){%
\psframebox[fillstyle=solid,fillcolor=black]{\textcolor{white}{#1}}}
\begin{minipage}[t]{3.5cm}
\centering
#2
\end{minipage}}}
\newcommand{\MyDiagram}{%
\begin{psmatrix}
\MyBox{1}{AAAA\\AAAA AAAA\\AAAA} & \MyBox{2}{BBBB\\BBBB\\BBBB\\BBBB} \\
\MyBox{3}{CCCC\\CCCC CCCC CCCC} \\
\MyBox{4}{DDDD} & \MyBox{5}{EEEE\\EEEE EEEE\\EEEE}
\end{psmatrix}}
\pagestyle{empty}
\begin{document}
\MyDiagram
\vspace{1cm}
\renewcommand{\MyFrameSep}{0.2}
\MyDiagram
\renewcommand{\MyFrameSep}{0}
\MyDiagram
\vspace{1cm}
\renewcommand{\MyFrameSep}{1}
\MyDiagram
\end{document}
------------------------------------------------------------------------------
\documentclass[a4paper]{article}
\usepackage{pstcol}
\usepackage{pst-node}
\makeatletter
\def\MyPsFrameBox{\pst at object{MyPsFrameBox}}
\def\MyPsFrameBox at i{\pst at makebox\MyPsFrameBox at ii}
\def\MyPsFrameBox at ii{%
\begingroup
\pst at useboxpar
\pst at dima=\pslinewidth
\advance\pst at dima by \psframesep
\pst at dimc=\wd\pst at hbox\advance\pst at dimc by \pst at dima
\pst at dimb=\dp\pst at hbox\advance\pst at dimb by \pst at dima
\pst at dimd=\ht\pst at hbox\advance\pst at dimd by \pst at dima
% D.G. modification begin - Sep. 2, 2002
\pnode(0,\psframesep){NodeTemp}
% D.G. modification end
\setbox\pst at hbox=\hbox{%
\ifpsboxsep\kern\pst at dima\fi
\begin at ClosedObj
\addto at pscode{%
\psk at cornersize
\pst at number\pst at dima neg
\pst at number\pst at dimb neg
\pst at number\pst at dimc
\pst at number\pst at dimd
.5
\tx at Frame}%
\def\pst at linetype{2}%
\showpointsfalse
\end at ClosedObj
\box\pst at hbox
\ifpsboxsep\kern\pst at dima\fi}%
\ifpsboxsep\dp\pst at hbox=\pst at dimb\ht\pst at hbox=\pst at dimd\fi
\leavevmode\box\pst at hbox
\endgroup}
\makeatother
\SpecialCoor
\newcommand{\MyFrameSep}{0.5}
\newcommand{\MyBox}[2]{%
\MyPsFrameBox[framesep=\MyFrameSep]{%
\begin{minipage}[t]{3.5cm}
\centering
#2
\end{minipage}}%
\rput[l](NodeTemp){%
\psframebox[fillstyle=solid,fillcolor=black]{\textcolor{white}{#1}}}}
\newcommand{\MyDiagram}{%
\begin{psmatrix}
\MyBox{1}{AAAA\\AAAA AAAA\\AAAA} & \MyBox{2}{BBBB\\BBBB\\BBBB\\BBBB} \\
\MyBox{3}{CCCC\\CCCC CCCC CCCC} \\
\MyBox{4}{DDDD} & \MyBox{5}{EEEE\\EEEE EEEE\\EEEE}
\end{psmatrix}}
\pagestyle{empty}
\begin{document}
\MyDiagram
\vspace{1cm}
\renewcommand{\MyFrameSep}{0.2}
\MyDiagram
\renewcommand{\MyFrameSep}{0}
\MyDiagram
\vspace{1cm}
\renewcommand{\MyFrameSep}{1}
\MyDiagram
\end{document}
More information about the PSTricks
mailing list