21

Can I create a user manual with sections at the right like multi-tab?

Like this:

demo

-- I think maybe I can template the page by tikz. (That will be very flexible if possible) so I added the tikz tag.

Lenik
  • 1,075

2 Answers2

23

Here's a possible option using the background package to place the border, the tabs and the page number:

\documentclass{article}
\usepackage[a5paper,vmargin=2cm]{geometry}
\usepackage{background}
\usepackage{etoolbox}
\usepackage{totcount}
\usepackage{lipsum}

% to have access to the total number of sections
\regtotcounter{section}

% every section starts on a new page
\pretocmd{\section}{\clearpage}{}{}

% auxiliary lengths for the height of the frame and the width of each tab
\newlength\mylen
\newlength\mylena

% style for the section tabs
\tikzset{tab/.style={
  text width=\mylena,anchor=south,
  draw=gray,thick,rectangle,rounded corners=12pt,rotate=270,
  align=center,text height=20pt,
  text depth=25pt,inner sep=0pt,fill=gray!20,
  yshift=-18pt,font=\sffamily\LARGE}}
% style for the current section tab
\tikzset{selectedtab/.style={tab,color=white,fill=gray!90}}

% the page number is showed in the background material
\pagestyle{empty}

\AtBeginDocument{
% calculation of the width for each tab
\setlength\mylen{\dimexpr\textheight+2cm\relax}
\ifnum\totvalue{section}>0
\setlength\mylena{\dimexpr\mylen/\totvalue{section}\relax}
\fi

% the main part; as background material we place the border, 
% the section (current and other) tabs and the page number 
\backgroundsetup{
scale=1,
color=black,
angle=0,
opacity=1,
contents= {
  \begin{tikzpicture}[remember picture, overlay]
  \node[inner sep=0pt,text width=\the\dimexpr\textwidth+1.5cm\relax] 
    at (current page.center) (border) {\rule{0pt}{\dimexpr\textheight+2cm\relax}};
  \foreach \valsection in {0,...,\numexpr\totvalue{section}-1\relax}
  {
    \node[\ifnum\thesection<\numexpr\valsection+1\relax tab\else \ifnum\thesection>\numexpr\valsection+1\relax tab\else selectedtab\fi\fi,xshift=(0.5+\valsection)*\mylena] 
      at (border.north east) (tab-\valsection) {Section \the\numexpr\valsection+1\relax};
  }
  \node[draw=gray,line width=2pt,rectangle,rounded corners=10pt,inner sep=0pt,
    text width=\the\dimexpr\textwidth+1.5cm\relax,fill=white] 
    at (current page.center) {\rule{0pt}{\dimexpr\textheight+2cm\relax}};
  \node[font=\LARGE\sffamily,fill=white] 
    at (border.south) {\makebox[3em][c]{\thepage}};
\end{tikzpicture}}
  }
}

\begin{document}

\section{Test Section One}
\lipsum[1-3]
\section{Test Section Two}
\lipsum[1-3]
\section{Test Section Three}
\lipsum[1-3]
\section{Test Section Four}
\lipsum[2]

\end{document}

enter image description here

The document needs to be processed three times.

If the most recent version for the background package is not available, here's the code using the syntax for version 1.0:

\documentclass{article}
\usepackage[a5paper,vmargin=2cm]{geometry}
\usepackage{background}
\usepackage{etoolbox}
\usepackage{totcount}
\usepackage{lipsum}

% to have access to the total number of sections
\regtotcounter{section}

% every section starts on a new page
\pretocmd{\section}{\clearpage}{}{}

% auxiliary lengths for the height of the frame and the width of each tab
\newlength\mylen
\newlength\mylena

% style for the section tabs
\tikzset{tab/.style={
  text width=\mylena,anchor=south,
  draw=gray,thick,rectangle,rounded corners=12pt,rotate=270,
  align=center,text height=20pt,
  text depth=25pt,inner sep=0pt,fill=gray!20,
  yshift=-18pt,font=\sffamily\LARGE}}
% style for the current section tab
\tikzset{selectedtab/.style={tab,color=white,fill=gray!90}}

% the page number is showed in the background material
\pagestyle{empty}

\AtBeginDocument{
% calculation of the width for each tab
\setlength\mylen{\dimexpr\textheight+2cm\relax}
\ifnum\totvalue{section}>0
\setlength\mylena{\dimexpr\mylen/\totvalue{section}\relax}
\fi

% the main part; as background material we place the border, 
% the section (current and other) tabs and the page number 
\SetBgScale{1}
\SetBgColor{black}
\SetBgAngle{0}
\SetBgOpacity{1}
\SetBgContents{
  \begin{tikzpicture}[remember picture, overlay]
  \node[inner sep=0pt,text width=\the\dimexpr\textwidth+1.5cm\relax] 
    at (current page.center) (border) {\rule{0pt}{\dimexpr\textheight+2cm\relax}};
  \foreach \valsection in {0,...,\numexpr\totvalue{section}-1\relax}
  {
    \node[\ifnum\thesection<\numexpr\valsection+1\relax tab\else \ifnum\thesection>\numexpr\valsection+1\relax tab\else selectedtab\fi\fi,xshift=(0.5+\valsection)*\mylena] 
      at (border.north east) (tab-\valsection) {Section \the\numexpr\valsection+1\relax};
  }
  \node[draw=gray,line width=2pt,rectangle,rounded corners=10pt,inner sep=0pt,
    text width=\the\dimexpr\textwidth+1.5cm\relax,fill=white] 
    at (current page.center) {\rule{0pt}{\dimexpr\textheight+2cm\relax}};
  \node[font=\LARGE\sffamily,fill=white] 
    at (border.south) {\makebox[3em][c]{\thepage}};
\end{tikzpicture}}
}

\begin{document}

\section{Test Section One}
\lipsum[1-3]
\section{Test Section Two}
\lipsum[1-3]
\section{Test Section Three}
\lipsum[1-3]
\section{Test Section Four}
\lipsum[2]

\end{document}
Gonzalo Medina
  • 505,128
  • I can't compile with latex (or xelatex): `... ABD: EveryShipout initializing macros ! Undefined control sequence. @begindocumenthook ...}\relax } \backgroundsetup { scale=1, color=black, an... l.47 \begin{document}

    ? ` I'm using TexLive 2012.

    – Lenik Oct 07 '12 at 07:40
  • @XièJìléi the problem is that your system has not the most recent version of the background package; you can update the package, or use the code with the old syntax that I just added to my answer. Please let me know if this made the code compilable. – Gonzalo Medina Oct 07 '12 at 15:17
  • It's my mistake: I was run with TeXLive 2010, I have just reinstalled TeXLive 2012, and both versions are okay now. Cheers! – Lenik Oct 07 '12 at 17:04
  • To highlight the current section, I added a selectedtab style, and coded: \node[\ifnum\thesection<\valsection tab\else \ifnum\thesection>\valsection tab\else selectedtab\fi\fi .... though it works, could it be shorter? I'm new to LaTeX programming. – Lenik Oct 07 '12 at 17:10
  • @XièJìléi I think it's OK (although I had to make a little correction to the \valsection counter). I updated my answer with some modifications (including the highlighting for the current section, that I had forgotten about; thank you for reminding me about this). – Gonzalo Medina Oct 07 '12 at 22:18
  • How to show the actual section title instead of section number in the tab button? – Lenik Oct 10 '12 at 02:25
  • @XièJìléi I think it would be best to post this new requirement as a fresh question. Follow-up questions like this are more than welcome! In the new question you can link to this one to provide the background. – Gonzalo Medina Oct 10 '12 at 02:57
  • See this: http://tex.stackexchange.com/questions/76078/how-to-get-the-section-title-by-section-number – Lenik Oct 10 '12 at 03:27
2

Here is another suggestion based on the answer of @Gonzalo Medina but using the scrlayer package to define a layer pagestyle:

\documentclass{article}
\usepackage[a5paper,vmargin=2cm]{geometry}
\usepackage{tikz}% loads also xcolor and graphicx
\usepackage{totcount}
\usepackage{lipsum}% for dummy text
\usepackage{etoolbox}

% to have access to the total number of sections
\regtotcounter{section}

% every section starts on a new page
\pretocmd{\section}{\clearpage}{}{}

% auxiliary length for the width of each tab
\newlength\mylena

\tikzset{
  tab/.style={% style for the section tabs
    text width=\mylena,
    draw=gray,
    thick,
    rectangle,
    rounded corners=12pt,
    align=center,
    text width=53pt,
    inner sep=0pt,
    fill=gray!20,
    font=\sffamily\LARGE,
    overlay
  },
  selectedtab/.style={% style for the current section tab
    tab,
    color=gray!90,
    text=white
  },
  pagenumber/.style={% style for the page number
    font=\LARGE\sffamily,
    fill=white,
    text width=3em,
    align=center
  }
}

\usepackage{scrlayer}
\DeclarePageStyleByLayers{border}{border.odd,border.even}
\pagestyle{border}

\DeclareNewLayer[
  background,
  oddpage,
  textarea,
  addvoffset=-1cm,
  addhoffset=-.75cm,
  addheight=2cm,
  addwidth=1.5cm,
  contents={%
  \ifnum\totvalue{section}>0
    \setlength\mylena{\dimexpr\layerheight/\totvalue{section}\relax}%
  \fi
    \begin{tikzpicture}
      \pgfdeclarelayer{background}
      \pgfsetlayers{background,main}
      \node[
        draw=gray,
        fill=white,
        inner sep=0pt,
        minimum width=\layerwidth-\pgflinewidth,
        minimum height=\layerheight-\pgflinewidth,
        rounded corners=10pt,
        line width=2pt
      ](border){};
      \node[pagenumber]at (border.south){\thepage};
      \begin{pgfonlayer}{background}
        \foreach \valsection in {0,...,\numexpr\totvalue{section}-1\relax}{%
          \node[
            \ifnum\value{section}<\numexpr\valsection+1\relax 
              tab%
            \else 
              \ifnum\value{section}>\numexpr\valsection+1\relax 
                tab%
              \else
                selectedtab%
              \fi
            \fi,
            minimum height=\mylena-\pgflinewidth
          ] at ([yshift=-(0.5+\valsection)*\mylena]border.north east)
          {%
            \hspace*{25pt}\rotatebox{-90}{Section \the\numexpr\valsection+1\relax}%
          };
        }
      \end{pgfonlayer}
    \end{tikzpicture}%
  }
]{border.odd}

\DeclareNewLayer[
  clone=border.odd,
  evenpage,
  contents={%
    \begin{tikzpicture}
      \node[
        draw=gray,
        fill=white,
        inner sep=0pt,
        minimum width=\layerwidth-\pgflinewidth,
        minimum height=\layerheight-\pgflinewidth,
        rounded corners=10pt,
        line width=2pt
      ](border){};
      \node[pagenumber]at (border.south){\thepage};
    \end{tikzpicture}%
  }
]{border.even}

\begin{document}
\section{Test Section One}
\lipsum[1-3]
\section{Test Section Two}
\lipsum[1-3]
\section{Test Section Three}
\lipsum[1-3]
\section{Test Section Four}
\lipsum[1-5]
\end{document}

Run twice to get

enter image description here

As in the example above it is possible to define different layers for even an odd pages. For a twosided article

\documentclass[twoside]{article}

the example above results in

enter image description here

esdd
  • 85,675