3

I'm trying to do calculation to be used in tikz. Here is my current code:

\def\monthtabpos#1%
  {\ifthenelse{#1<7}
     {\dimexpr \numexpr -3*#1 \relax cm}
     {\dimexpr \numexpr -3*(#1-6) \relax cm}
  }        

\newcommand{\monthtab}[2]{
  \shorthandoff{;}
  \begin{tikzpicture}[remember picture,overlay]
    \node[yshift=\monthtabpos{#2},xshift=-0.5cm] at (current page.north east) {
      \tikz\shade[shading=axis,bottom color=white,top color=gray!50,shading angle=-90] 
        (0,0) rectangle (1cm,3cm) node[rotate=90,pos=0.5] {\Large\scshape #1};
    };
  \end{tikzpicture}
}

The idea is that \monthtabpos calculates the vertical position of the picture. This code is then called from \titleformat to position a tab for sections:

% Tune section headings
\renewcommand\thesection{\arabic{section}}
\titleformat{name=\section,page=even}[display]
  {\newpage\secstyle} % format
  {\large\makedate{\thesection}~\chaphead} % label
  {10pt} %sep
  {\vspace{-5mm}\filcenter\textls[-35]} %before
\titleformat{name=\section,page=odd}[display]
  {\newpage\secstyle} % format
  {\large\makedate{\thesection}~\chaphead} % label
  {10pt} %sep
  {\vspace{-5mm}\filcenter\textls[-35]} %before
  [\monthtab{\chaphead}{\arabic{chapter}}] % after
\titlespacing{\section}{0pt}{*}{*-2}

When I build this code, I get:

LaTeX Warning: Unsynchronized `section' title on page 7.

! Argument of \XC@definec@lor has an extra }.
<inserted text> 
                \par 
l.2 \dvday{Créé à son image}

Note that if I replace yshift=\monthtabpos{#2} with yshift=-3*{#2}cm, it works fine (except I don't get the effect I want when #2 > 6), and that I have checked that \monthtabpos returns the expected string.

I have also tried defining a local macro in tikz with:

\newcommand{\monthtab}[2]{
  \shorthandoff{;}
  \begin{tikzpicture}[remember picture,overlay]
    \node let \tabpos = (\monthtabpos{#2}) in
      [yshift=\tabpos,xshift=-0.5cm] at (current page.north east) {
      \tikz\shade[shading=axis,bottom color=white,top color=gray!50,shading angle=-90] 
        (0,0) rectangle (1cm,3cm) node[rotate=90,pos=0.5] {\Large\scshape #1};
    };
  \end{tikzpicture}
}

and it doesn't help.

Note that this does work (but is really ugly I think):

\newcommand{\monthtab}[2]{
  \shorthandoff{;}
  \ifthenelse{#2<7}{
  \begin{tikzpicture}[remember picture,overlay]
    \node[yshift=-3*{#2}cm,xshift=-0.5cm] at (current page.north east) {
      \tikz\shade[shading=axis,bottom color=white,top color=gray!50,shading angle=-90] 
        (0,0) rectangle (1cm,3cm) node[rotate=90,pos=0.5] {\Large\scshape #1};
    };
  \end{tikzpicture}
  }
  {
  \begin{tikzpicture}[remember picture,overlay]
    \node[yshift=18cm-3*{#2}cm,xshift=-0.5cm] at (current page.north east) {
      \tikz\shade[shading=axis,bottom color=white,top color=gray!50,shading angle=-90] 
        (0,0) rectangle (1cm,3cm) node[rotate=90,pos=0.5] {\Large\scshape #1};
    };
  \end{tikzpicture}
  }
}
  • The "house style" of TeX.SX is not to have any greeting or closing in the questions or answers. – Martin Scharrer Apr 13 '11 at 11:04
  • Alright, I'll remember that :-) – ℝaphink Apr 13 '11 at 11:09
5

I think the easiest way to calculate this is yshift={-3*(mod(#2-1,6)+1)*1cm}, which also works for chapters 13, 14, etc.

\mod(a,b) gives the remainder of the division of a by b. So mod(#2-1,6) will give 0,1,2,3,4,5,0,1,2,... for #2=1,2,3,...

See chapter 63.2 in the v2.10 TikZ manual for a list of functions that are available to do calculations within TikZ (for example it has ifthenelse).

  • Using a modulo is definitely a much nicer solution than my \ifthenelse. Thank you. – ℝaphink Apr 13 '11 at 22:07

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

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