8

This is a question so general, I couldn't easily find an archived post which directly addressed it.

I am interested in using LaTeX to design a one sided sheet containing figures and small amounts of text. I have a specific layout in mind drawn below. I want to be able to draw these regions, crop graphics (in graph/logo) to fit them, and place text which never flies beyond the boundary regions drawn.

mock up of output

How can one do that? I'm reaching for latex because I am generating PDFs and hope to loop over information and generate hundreds of such documents.

AdamO
  • 345
  • The frames are supossed to appear in the document or they are just visual guidelines for the design you want? – Gonzalo Medina Aug 29 '12 at 23:19
  • They are visual guidelines, a mock up. It's a panel based approach to document design. In the "graphs" 2X4 matrix at the center right, there are 8 barcharts. The graph below is a time trend. Left are numbers, and names, then there is a JPG corporate logo to place at the upper right. – AdamO Aug 29 '12 at 23:35
  • 1
    The approach in this answer might be useful. – Scott H. Aug 29 '12 at 23:57

4 Answers4

8

Just as an experiment, and taking as a basis the answer by Frank Mittelbach mentioned in Scott H's comment, I decided to use for the first time the xcoffins package, and here's the result (obviously there are a lot of improvements that can be done, but it could be used as a starting point):

\documentclass{article}
\usepackage[landscape,paperwidth=19cm]{geometry} 
\usepackage{xcolor} 
\usepackage{xcoffins}
\usepackage{lipsum}

\newlength\GraphWd
\setlength\GraphWd{2.5cm}

\pagestyle{empty}
\definecolor{mycolor}{RGB}{134,34,0}

\begin{document}

% upper coffins
\NewCoffin \result
\NewCoffin \Title
\NewCoffin \Date
\NewCoffin \Logo

% lateral info coffin
\NewCoffin \Info

% 10 small graph coffins
\NewCoffin \Graph
\NewCoffin \Graphi
\NewCoffin \Graphii
\NewCoffin \Graphiii
\NewCoffin \Graphiv
\NewCoffin \Graphv
\NewCoffin \Graphvi
\NewCoffin \Graphvii
\NewCoffin \Graphviii
\NewCoffin \Graphix
\NewCoffin \Graphx

% 1 wider graph coffin
\NewCoffin \LGraph

% filling the coffins
\SetHorizontalCoffin \result {}
\SetHorizontalCoffin \Graph {}

\SetHorizontalCoffin \Title {\Large\bfseries Document title}
\SetHorizontalCoffin \Date {\Large\bfseries Document date}
\SetHorizontalCoffin \Logo {\color{mycolor}\rule{4cm}{2cm}}
\SetVerticalCoffin\Info {4cm} {\noindent\raggedright\lipsum[6]}

\SetHorizontalCoffin \LGraph {\Large\color{mycolor}\rule{\dimexpr5\GraphWd+12pt\relax}{2cm}}

\SetHorizontalCoffin \Graphi {\Large\color{mycolor}\rule{\GraphWd}{\GraphWd}}
\SetHorizontalCoffin \Graphii {\Large\color{mycolor}\rule{\GraphWd}{\GraphWd}}
\SetHorizontalCoffin \Graphiii {\Large\color{mycolor}\rule{\GraphWd}{\GraphWd}}
\SetHorizontalCoffin \Graphiv {\Large\color{mycolor}\rule{\GraphWd}{\GraphWd}}
\SetHorizontalCoffin \Graphv {\Large\color{mycolor}\rule{\GraphWd}{\GraphWd}}
\SetHorizontalCoffin \Graphvi {\Large\color{mycolor}\rule{\GraphWd}{\GraphWd}}
\SetHorizontalCoffin \Graphvii {\Large\color{mycolor}\rule{\GraphWd}{\GraphWd}}
\SetHorizontalCoffin \Graphviii {\Large\color{mycolor}\rule{\GraphWd}{\GraphWd}}
\SetHorizontalCoffin \Graphix {\Large\color{mycolor}\rule{\GraphWd}{\GraphWd}}
\SetHorizontalCoffin \Graphx {\Large\color{mycolor}\rule{\GraphWd}{\GraphWd}}

% put the smaller graph coffins in a 2x5 array inside \Graph
\JoinCoffins \Graph \Graphi
\JoinCoffins \Graph [\Graphi-vc,\Graphi-r] \Graphii[vc,l](3pt,0pt)
\JoinCoffins \Graph [\Graphii-vc,\Graphii-r] \Graphiii[vc,l](3pt,0pt)
\JoinCoffins \Graph [\Graphiii-vc,\Graphiii-r] \Graphiv[vc,l](3pt,0pt)
\JoinCoffins \Graph [\Graphiv-vc,\Graphiv-r] \Graphv[vc,l](3pt,0pt)
\JoinCoffins \Graph [\Graphi-hc,\Graphi-b] \Graphvi[hc,t](0pt,-3pt)
\JoinCoffins \Graph [\Graphvi-vc,\Graphvi-r] \Graphvii[vc,l](3pt,0pt)
\JoinCoffins \Graph [\Graphvii-vc,\Graphvii-r] \Graphviii[vc,l](3pt,0pt)
\JoinCoffins \Graph [\Graphviii-vc,\Graphviii-r] \Graphix[vc,l](3pt,0pt)
\JoinCoffins \Graph [\Graphix-vc,\Graphix-r] \Graphx[vc,l](3pt,0pt)

% put the wider graph below \Graph
\JoinCoffins \Graph[hc,b]  \LGraph[hc,t](0pt,-15pt)

%  put the upper coffins into \result
\JoinCoffins \result \Title
\JoinCoffins \result[\Title-b,\Title-l]  \Date [t,l](0pt,-8pt)
\JoinCoffins \result [vc,l]  \Logo [vc,r](\textwidth,0pt)
% add the \info coffin to \result
\JoinCoffins \result [b,l] \Info [t,l](10pt,-\baselineskip)

% add the \Graph coffin to \result
\JoinCoffins \result [\Info-t,\Info-r] \Graph [t,l](40pt,-1.5\baselineskip)

\noindent\TypesetCoffin \result

\end{document}

enter image description here

xcoffins is really a nice package.

Gonzalo Medina
  • 505,128
7

In ConTeXt, Layers are frequently used for placing material on specific location of the page. For example, the layout that you are looking for can be achieved as follows.

\setuppapersize[A5,landscape]
\setuppagenumbering[location=] % No page numbering

\useMPlibrary[dum] % For placeholder pictures

\definelayer
  [header]
  [
    x=2mm,
    y=2mm,
  ]

\definelayer
  [info]
  [
    x=5mm,
    y=\the\dimexpr0.2\paperheight+15mm,
  ]

\definelayer
  [graph]
  [
    x=\the\dimexpr0.3\paperwidth-10mm,
    y=\the\dimexpr0.85\paperheight-5mm,
  ]

\definelayer
  [grid]
  [
    x=\the\dimexpr0.3\paperwidth-10mm,
    y=\the\dimexpr0.2\paperheight+15mm,
  ]

\setupbackgrounds[page][background={header, info, graph, grid}]

\setlayerframed
  [header]
  [
    width=\the\dimexpr\paperwidth-4mm,
    height=0.2\paperheight,
  ]
  {Document header}

\setlayerframed
  [info]
  [
    width=0.2\paperwidth,
    height=\the\dimexpr0.6\paperheight-5mm,
    align={flushleft, hyphenated},
  ]
  {Information about the content}

\setlayer
  [graph]
  {\externalfigure[dummy][width=0.7\paperwidth, height=0.1\paperheight]}


\def\GRAPH
    {\externalfigure[dummy]
                    [
                      width=\the\dimexpr0.1\paperwidth-0.4mm,
                      height=\the\dimexpr0.2\paperheight-0.5mm,
                    ]}
\setlayerframed
  [grid]
  [
    width=0.7\paperwidth,
    height=0.5\paperheight,
    %frame=off,
  ]
  {
    \startTABLE[offset=1mm]
      \NC \GRAPH \NC \GRAPH \NC \GRAPH \NC \GRAPH \NC \GRAPH \NC \NR
      \NC \GRAPH \NC \GRAPH \NC \GRAPH \NC \GRAPH \NC \GRAPH \NC \NR
    \stopTABLE
  }

\starttext

% Insert an empty page, with only the background layers.
\null

\stoptext

which gives

enter image description here

Aditya
  • 62,301
6

You can use the textpos package to position objects (text and figures) on a page.

Ian Thompson
  • 43,767
0

I will have to say that assembling graphs in an obvious panel was best done with wrapfig. Getting the logo aligned at the top was difficult, however I found the package fancyhdr worked tremendously well, with only the following line required:

\fancyheader[R]{\includegraphics{logo.jpg}}

AdamO
  • 345