Take the 2-minute tour ×
TeX - LaTeX Stack Exchange is a question and answer site for users of TeX, LaTeX, ConTeXt, and related typesetting systems. It's 100% free, no registration required.

I modified this project How to print section titles like tab-list? in the following way: usletter, 8 tabs on the edge of paper, odd pages only, text within the tab is set by the user (\TabText), "non"-functioning hyperlinks within the tabs...

Now, I'm puzzled by my remaining challenges:

  • Set one specific color for each tab (= set of 8 TabColors)
  • Set specific colors for the hyperlinked text within each tab (= set of 8 TabTextColors)
  • Functional hyperlinks within each tab and selectedtab (clickable text and/or clickable colored rectangle tabs)

Here is my code:

%!TEX TS-program = pdflatex

% compile at least three times **

\documentclass[usletter,openright]{book}
\usepackage[vmargin=2cm]{geometry} 
\usepackage{background}
\usepackage{etoolbox}
\usepackage{totcount}
\usepackage{lipsum}
\usepackage{changepage}  % for oddpages only

\RequirePackage{hyperref}
\hypersetup{colorlinks=true,
     breaklinks=true,
     linkcolor=magenta,    % how to specify linkcolor according to chapter / contents ?
     bookmarks=true,
      pageanchor=true}     


\newcommand{\TabText}[1]{
\ifnum#1=0  \hyperlink{HyperTableOfcontents}{Contents} Contents \fi
\ifnum#1=1   \hyperlink{HyperChapterOne}{Chapter1 Chapter1}\fi
\ifnum#1=2   \hyperlink{HyperChapterOne}{Chapter2 Chapter2}\fi
\ifnum#1=3   \hyperlink{HyperChapterOne}{Chapter3} Chapter3 \fi
\ifnum#1=4  Chapter4 Chapter4\fi
\ifnum#1=5    Chapter5 Chapter5\fi
\ifnum#1=6   Chapter6 Chapter6\fi
\ifnum#1=7   Chapter7 Chapter7\fi
\ifnum#1=8   Chapter8 Chapter8\fi
}

%  Doesn't function well / color of text within each tab / superseded by "linkcolor"
%   
%% \TabTexTColor{\valchapter}
%   \newcommand{\TabTexTColor}[1]{
%   \ifnum#1=0 blue \fi
%   \ifnum#1=1 red  \fi
%   \ifnum#1=2 yellow \fi
%   \ifnum#1=3 black \fi
%   \ifnum#1=4  green \fi
%   \ifnum#1=5  cyan \fi
%   \ifnum#1=6  magenta \fi
%   \ifnum#1=7   orange\fi
%   \ifnum#1=8  black\fi
%   }


\regtotcounter{chapter}
\newlength\mylen 
\newlength\mylena  


\tikzset{tab/.style={
  text width=\mylena,anchor=south,
  draw=green,thick,rectangle,rounded corners=12pt,rotate=270,   % how to specify draw color according to chapter / contents ?
  align=center,text height=20pt,
  text depth=1cm,inner sep=0pt,fill=gray!20,    % how to specify fill color according to chapter / contents ?
  yshift=-1.5cm,font=\sffamily\LARGE}}


\tikzset{selectedtab/.style={tab,color=white,fill=blue!90}}  % how to specify fill color according to chapter / contents ?

\AtBeginDocument{% 
\setlength\mylen{\dimexpr\textheight+4cm\relax}
\ifnum\totvalue{chapter}>0
\setlength\mylena{\dimexpr\mylen/(\totvalue{chapter}+1)\relax}\fi


\SetBgScale{1}
\SetBgColor{blue}  % how to specify background color according to chapter / contents ? It regulates the color of the text in the non-selected tabs
\SetBgAngle{0}
\SetBgOpacity{1}


\SetBgContents{
  \begin{tikzpicture}[remember picture, overlay]
  \checkoddpage
\ifoddpage     %  to put tabs only on odd pages 
  \node[inner sep=0pt,text width=\the\dimexpr\textwidth+1.5cm\relax] 
    at (current page.center)  {\rule{0pt}{\dimexpr\textheight+2cm\relax}};
  \foreach \valchapter in {0,...,\numexpr\totvalue{chapter}\relax}
  {
    \node[\ifnum\thechapter<\numexpr\valchapter\relax tab\else
    \ifnum\thechapter>\numexpr\valchapter\relax tab\else 
    selectedtab\fi\fi,
    xshift=(0.5+\valchapter)*\mylena] 
      at (current page.north east) (tab-\valchapter) 
      {\TabText{\valchapter}};}
\fi 
\end{tikzpicture}}
}


\begin{document}

\frontmatter 

\hypertarget{HyperTableOfcontents}{\tableofcontents}

\mainmatter

\hypertarget{HyperChapterOne}{\chapter{Chapter One}}
\section{Section One Chapter One}
\lipsum
\section{Section Two Chapter One}
\lipsum
\lipsum
\lipsum

\hypertarget{HyperChapterTwo}{\chapter{Chapter Two}}
\lipsum
\section{Section One Chapter Two}
\lipsum
\section{Section Two Chapter Two}
\hyperlink{HyperTableOfcontents}{Contents} % test: link is well functioning
\hyperlink{HyperChapterOne}{Chapter1} % test: link is well functioning
\lipsum
\lipsum
\lipsum

\hypertarget{HyperChapterThree}{\chapter{Chapter Three}}
\lipsum
\section{Section One Chapter Three}
\lipsum
\section{Section Two Chapter Three}
\lipsum
\lipsum

\hypertarget{HyperChapterFour}{\chapter{Chapter Four}}
\lipsum
\lipsum
\lipsum
\lipsum

\hypertarget{HyperChapterFive}{\chapter{Chapter Five}}
\lipsum
\lipsum
\lipsum
\lipsum

\hypertarget{HyperChapterSix}{\chapter{Chapter Six}}
\lipsum
\lipsum
\lipsum
\lipsum

\hypertarget{HyperChapterSeven}{\chapter{Chapter Seven}}
\lipsum
\lipsum
\lipsum
\lipsum

\end{document}
share|improve this question
    
Welcome on TeX.sx! Note that you can achieve code blocks by indenting every line of code by 4 white spaces, or simply selecting it and clicking the "code" {} button. –  T. Verron Nov 22 '12 at 20:38

1 Answer 1

up vote 2 down vote accepted

Finally, here is my functioning test-code for clickable tabs.

%!TEX TS-program = pdflatex
\PassOptionsToPackage{table,x11names,svgnames}{xcolor}
\documentclass[10pt,twoside,openright,usletter]{book}
\usepackage[vmargin=2cm,hmargin=2cm]{geometry}  % les marges interfèrent avec le format usletter
\usepackage{lipsum}
\usepackage{eso-pic}
\usepackage{tikz}
\usetikzlibrary{positioning}  
\usetikzlibrary{shapes}
\usepackage{hyperref}
\usepackage{totcount}
\usepackage{changepage}  % pour isoler les pages paires et impaires 

\hypersetup{colorlinks=true,
         breaklinks=true,
         linkcolor=magenta,   
         bookmarks=true,
          pageanchor=true}     


% Références:  
%   1- TikZ pour l’impatient  Gérard Tisseau Jacques Duma version 5 septembre 2012
%   2- A very minimal introduction to TikZ∗ Jacques Crémer École d'économie de Toulouse version 11 mars 2011
%   3- http://stackoverflow.com/questions/3504952/tikz-how-to-encapsulate-shade-in-node
%   4- http://tex.stackexchange.com/questions/60329/how-to-hyperlink-a-shape-using-tikz
%   5- http://tex.stackexchange.com/questions/60768/how-to-control-borders-of-intersected-nodes-rectangles
%   6- http://tex.stackexchange.com/questions/48918/tikzstyle-default-node-text-with-fill-color
%   7- http://tex.stackexchange.com/questions/78689/change-style-of-labels-of-tikz-nodes-of-a-given-style?rq=1
%   8- http://www.raphink.info/2011/04/fancytabs-latex-package.html  and the fancytabs.sty file (its content)
%   9- PGF/TikZ - Graphics for LATEX A tutorial by Meik Hellmund of University of Leipzig, Mathematisches Institut
%   10- http://www.texample.net/tikz/examples/computer-science-mindmap/


% ---> Pot-pourri des bases de la formation des onglets cliquables:
%
% - Les vecteurs de base ont pour longueur 1 cm (et quand on imprime, c’est très précisément 1 cm).  l’origine dans la figure engendrée. En fait, elle n’a pas de position prédéfinie. La figure occupe seulement la place minimale pour que tous les éléments tracés explicitement soient visibles. La position de l’origine par rapport à la figure dépend donc des points tracés. 
% - un rectangle est défini par son coin inférieur gauche et son coin supérieur droit
%          \draw [blue]  (0,0) rectangle (2,1);  où (0,0) est le coin inférieur gauche et (2,1) le coin supérieur droit
% - je n'ai pas réussi à lier un rectangle à un texte, i.e. pas d'hyperref entre un rectangle et une cible; fonctionne seulement avec le texte d'un noeud
% - Nous avons vu l’option draw de \node qui trace la frontière du nœud.
%       La forme de cette frontière peut être modifiée et décorée à l’aide de différentes options :
%           – de forme : rectangle (défaut), circle, ellipse, diamond
%           – de style : dashed, dotted, thick, red, fill
%           – de modification : rounded corners, minimum width ou height
% - \node [below right,red,align=center] at (0,0) {below right align center at 0,0};  % on écrit du texte vis-à-vis un noeud
% \node[draw,rectangle,rounded corners=3pt] (P) at (0,0) {Paris};
% - « Soit A le point de coordonnées (1, 0) ». Cela s’écrit \coordinate (A) at (1,0) ;  i.e. \coordinate (nom) at (x,y) ;    .... \draw (A) -- (B) ;  si points A et B définis
% - \node [below right,red,align=center] at (1,1) {below right align center};  % on écrit du texte vis-à-vis un noeud
% -  les dimensions peuvent être calculées lorsqu'elles sont entourées d'une certaine expression: {\dimexpr   calculs ici   \relax}     par exemple:  {\dimexpr   2cm+2cm/3  \relax}
% -  pour les pages paires /impaires seulement:   \checkoddpage  \ifoddpage \else  \fi
% - Dans les spécifications de l'embellissement du noeud:
%              shade  : peut être utilisée avec une seule couleur
%           * attributs pouvant être spécifiés après "shade": 
%               shade,shading=ball,ball color=blue!60!red,
%               shade,shading=radial,ball color=blue!60!red,
%               shade,top color=red, bottom color=green,
%                shade,bottom color=green,left color=blue,
%                shading angle=-90
%
%  align = center contrôle le centrage latéral (donc vertical si onglet vertical)


% Bloc dimensions étiquettes verticales à droite
\newlength\HauteurOngletDroite   
\setlength\HauteurOngletDroite{\dimexpr\paperheight/8\relax} %  
\newlength\LargeurOngletDroite
\setlength\LargeurOngletDroite{\dimexpr\paperwidth/33\relax} % 
\newlength\ProfondeurTexteOngletDroite   
\setlength\ProfondeurTexteOngletDroite{\dimexpr\LargeurOngletDroite/2-1.5mm\relax} % contrôle le centrage latéral de l'onglet vertical
\newlength\xOngletDroite  
\setlength\xOngletDroite{\dimexpr\paperwidth-(\LargeurOngletDroite*1/2)\relax}
\newlength\yOngletZeroDroite
\newlength\yOngletUnDroite
\setlength\yOngletZeroDroite{\dimexpr\paperheight-(\HauteurOngletDroite*1/2)\relax} %
\setlength\yOngletUnDroite{\dimexpr\paperheight-(\HauteurOngletDroite*3/2)\relax}

\tikzset{OngletDroite/.style={
align=center,text width=\HauteurOngletDroite,text height=\LargeurOngletDroite,text depth=\ProfondeurTexteOngletDroite,inner sep=0pt,thick,rectangle,rounded corners=5pt,rotate=270,font=\sffamily\normalsize
}}  % 

% Bloc dimensions étiquettes verticales à gauche
\newlength\HauteurOngletGauche   
\setlength\HauteurOngletGauche{\dimexpr\paperheight/8\relax} %  
\newlength\LargeurOngletGauche
\setlength\LargeurOngletGauche{\dimexpr\paperwidth/33\relax} % 
\newlength\ProfondeurTexteOngletGauche   
\setlength\ProfondeurTexteOngletGauche{\dimexpr\LargeurOngletGauche-2mm\relax} % 
\newlength\xOngletGauche   
\setlength\xOngletGauche{\dimexpr(\LargeurOngletGauche*1/2-2mm)\relax}  
\newlength\yOngletZeroGauche
\newlength\yOngletUnGauche
\setlength\yOngletZeroGauche{\dimexpr\paperheight-(\HauteurOngletGauche*1/2)\relax} %
\setlength\yOngletUnGauche{\dimexpr\paperheight-(\HauteurOngletGauche*3/2)\relax}

\tikzset{OngletGauche/.style={
align=center,text width=\HauteurOngletGauche,text depth=\ProfondeurTexteOngletGauche,minimum height=\LargeurOngletGauche,inner sep=0pt,thick,rectangle,rounded corners=5pt,rotate=270,font=\sffamily\normalsize
}}  %  

% Bloc dimensions étiquettes horizontales en haut
\newlength\HauteurOngletHaut   
\setlength\HauteurOngletHaut{\dimexpr\paperwidth/40\relax} %  vertical
\newlength\LargeurOngletHaut
\setlength\LargeurOngletHaut{\dimexpr\paperheight/7\relax} % horizontal

\newlength\ProfondeurTexteOngletHaut   
\setlength\ProfondeurTexteOngletHaut{\dimexpr\HauteurOngletHaut/2-3.5mm\relax} %

\newlength\xOngletZeroHaut   
\setlength\xOngletZeroHaut{\dimexpr(\LargeurOngletHaut)\relax} 

\newlength\xOngletUnHaut   
\setlength\xOngletUnHaut{\dimexpr(\LargeurOngletHaut*2)\relax} 

\newlength\yOngletHaut
\setlength\yOngletHaut{\dimexpr\paperheight-(\HauteurOngletHaut*1/2-1mm)\relax} %

\tikzset{OngletHaut/.style={
align=center,text width=\LargeurOngletHaut,text depth=\ProfondeurTexteOngletHaut,minimum height=\HauteurOngletHaut,inner sep=0pt,thick,rectangle,rounded corners=5pt,rotate=0,font=\sffamily\normalsize
}}  %  

% Bloc dimensions étiquettes horizontales en bas
\newlength\HauteurOngletBas   
\setlength\HauteurOngletBas{\dimexpr\paperwidth/40\relax} %  vertical
\newlength\LargeurOngletBas
\setlength\LargeurOngletBas{\dimexpr\paperheight/7\relax} % horizontal

\newlength\ProfondeurTexteOngletBas   
\setlength\ProfondeurTexteOngletBas{\dimexpr\HauteurOngletBas/4\relax} %

\newlength\xOngletZeroBas   
\setlength\xOngletZeroBas{\dimexpr(\LargeurOngletBas)\relax} 

\newlength\xOngletUnBas   
\setlength\xOngletUnBas{\dimexpr(\LargeurOngletBas*2)\relax} 

\newlength\yOngletBas
\setlength\yOngletBas{\dimexpr(\HauteurOngletBas-3.5mm)\relax} %

\tikzset{OngletBas/.style={
align=center,text width=\LargeurOngletBas,text depth=\ProfondeurTexteOngletBas,minimum height=\HauteurOngletBas,inner sep=0pt,thick,rectangle,rounded corners=5pt,rotate=0,font=\sffamily\normalsize
}}  %  



\newcommand{\MesOnglets}{%
\begin{tikzpicture}[remember picture,overlay]  
%  Onglets verticaux à droite
    \coordinate (PositionOngletDroiteZero) at (\xOngletDroite,\yOngletZeroDroite) ;  
    \coordinate (PositionOngletDroiteUn) at (\xOngletDroite,\yOngletUnDroite) ; 
% 
\node (OngletDroiteZero)   at (PositionOngletDroiteZero)  {\hyperlink{HyperTableOfcontents}{\tikz
\node[OngletDroite,draw=purple,fill=gray!20,text=green]{TDM};}};  
% 
\node (OngletDroiteUn)   at (PositionOngletDroiteUn)  {\hyperlink{HyperChapitreUn}{\tikz
\node[OngletDroite,draw=blue,shade,top color=red, bottom color=green,shading angle=-30,text=red] {Chapitre 1};}};  
%  Onglets verticaux à gauche
    \coordinate (PositionOngletGaucheZero) at (\xOngletGauche,\yOngletZeroGauche) ;  
    \coordinate (PositionOngletGaucheUn) at (\xOngletGauche,\yOngletUnGauche) ; 
%
\node (OngletGaucheZero)   at (PositionOngletGaucheZero) {\hyperlink{HyperTableOfcontents}{\tikz \node[OngletGauche,draw=purple,shade,top color=purple, bottom color=orange,shading angle=-30,text=blue]{\rotatebox{180}{TDM}};}};  
%  
\node (OngletGaucheUn)   at (PositionOngletGaucheUn)  {\hyperlink{HyperChapitreUn}{\tikz
\node[OngletGauche,draw=blue,fill=yellow!80,text=red]{\rotatebox{180}{Chapitre 1}};}};  
%  
%
%  Onglets horizontaux en haut
    \coordinate (PositionOngletHautZero) at (\xOngletZeroHaut,\yOngletHaut) ;  
    \coordinate (PositionOngletHautUn) at (\xOngletUnHaut,\yOngletHaut) ; 
%
\node (OngletHautZero)   at (PositionOngletHautZero) {\hyperlink{HyperTableOfcontents}{\tikz \node[OngletHaut,draw=purple,shade,top color=purple, bottom color=orange,shading angle=-30,text=blue]{TDM};}};  
%  
\node (OngletHautUn)   at (PositionOngletHautUn)  {\hyperlink{HyperChapitreUn}{\tikz
\node[OngletHaut,draw=blue,fill=yellow!80,text=red]{Chapitre 1};}};  
%  
%  Onglets horizontaux en bas
    \coordinate (PositionOngletBasZero) at (\xOngletZeroBas,\yOngletBas) ;  
    \coordinate (PositionOngletBasUn) at (\xOngletUnBas,\yOngletBas) ; 
%
\node (OngletBasZero)   at (PositionOngletBasZero) {\hyperlink{HyperTableOfcontents}{\tikz \node[OngletBas,draw=purple,shade,top color=purple, bottom color=orange,shading angle=-30,text=blue]{TDM};}};  
%  
\node (OngletBasUn)   at (PositionOngletBasUn)  {\hyperlink{HyperChapitreUn}{\tikz
\node[OngletBas,draw=blue,fill=yellow!80,text=red]{Chapitre 1};}};  
%  
\end{tikzpicture}
}%fin newcommand    





\AddToShipoutPicture{  
\MesOnglets
}% fin \AddToShipoutPicture



\begin{document}


    \frontmatter 
    \hypertarget{HyperTableOfcontents}{\tableofcontents}

    \mainmatter

    \cleardoublepage
    \hypertarget{HyperChapitreUn}{\chapter{Chapitre un}}
    \section{Section un Chapitre un}

    \lipsum
    \section{Section deux Chapitre un}
    \lipsum

    \lipsum
    \lipsum

    \cleardoublepage
    \hypertarget{HyperChapitreDeux}{\chapter{Chapitre deux}}
    \lipsum
    \section{Section un Chapitre deux}
    \lipsum
    \section{Section deux Chapitre deux}
        \lipsum
    \lipsum
    \lipsum

    \cleardoublepage
    \hypertarget{HyperChapitreTrois}{\chapter{Chapitre trois}}
    \lipsum
    \section{Section un Chapitre trois}
    \lipsum
    \section{Section deux Chapitre trois}
    \lipsum
    \lipsum

    \cleardoublepage
    \hypertarget{HyperChapitreQuatre}{\chapter{Chapitre quatre}}
    \lipsum
    \lipsum
    \lipsum
    \lipsum

    \cleardoublepage
    \hypertarget{HyperChapitreCinq}{\chapter{Chapitre cinq}}
    \lipsum
    \lipsum
    \lipsum
    \lipsum

    \cleardoublepage
    \hypertarget{HyperChapitreSix}{\chapter{Chapitre six}}
    \lipsum
    \lipsum
    \lipsum
    \lipsum

    \cleardoublepage
    \hypertarget{HyperChapitreSept}{\chapter{Chapitre sept}}
    \lipsum
    \lipsum
    \lipsum
    \lipsum

\end{document}
share|improve this answer

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.