9

I wish to create section heading using titlesec like image

enter image description here

But I have some difficulties in determining the width of remaining of line to include blue box containing section label, my method consist of subtracting length of gray box from textwidth but it did not work.

\documentclass[a4paper]{book}
\usepackage{lipsum}
\usepackage[explicit]{titlesec}
\usepackage{xcolor}

\newlength{\myl}
\colorlet{mygray}{gray!90}
\colorlet{myblue}{blue!80}

\newcommand{\graybox}{\colorbox{mygray}{\strut \color{white}Section~\thesection}}

\settowidth{\myl}{\graybox}


\titleformat{\section}[hang]{\large\bfseries}%
{\graybox}{.5ex}{\colorbox{myblue}{\makebox[\dimexpr \linewidth-\myl-2\fboxsep-.5ex][l]%
{\strut \color{white}\large\bfseries #1}}}

\pagestyle{empty}

\begin{document}

enter image description here

3
  • 3
    Right now you are measuring \graybox in the preamble. I think you should move the line \settowidth{\myl}{\graybox} in the last argument of \titleformat, before \colorbox{myblue}....
    – campa
    Jun 1, 2016 at 16:12
  • @campa Perhaps make your suggestion an answer, as it fixes the problem nicely, even after a \setcounter{section}{100} changes \thesection width. Jun 1, 2016 at 16:18
  • Thanks @campa your comment fix the problem, can you post it as an answer.
    – Salim Bou
    Jun 1, 2016 at 16:24

2 Answers 2

6

The computations are somewhat similar to those in the other answers, but this solution also copes with unnumbered sections and long titles.

\documentclass[a4paper]{book}
\usepackage{lipsum}
\usepackage{titlesec}
\usepackage{xcolor}

\newsavebox{\sectionlabelbox}
\newlength{\sectionlabelwidth}
\colorlet{mygray}{gray!90}
\colorlet{myblue}{blue!80}

\newcommand{\sectionlabel}{%
  \sbox{\sectionlabelbox}{\colorbox{mygray}{\strut\color{white}Section~\thesection}}%
  \global\sectionlabelwidth=\wd\sectionlabelbox
  \usebox{\sectionlabelbox}%
}
\newcommand{\sectiontitle}[1]{%
  \colorbox{myblue}{%
    \parbox[t]{\dimexpr\columnwidth-\sectionlabelwidth-2\fboxsep-0.5ex}{
      \raggedright\strut\color{white}#1
    }%
  }%
}

\titleformat{\section}[hang]
  {\large\bfseries\global\sectionlabelwidth=-0.5ex }%
  {\sectionlabel}
  {.5ex}
  {\sectiontitle}

\begin{document}

\section{A test}

\setcounter{section}{9}

\section{Another test}

\section{Another test, but with a title that is so long it has to be
split across lines}

\section*{A further test}

\end{document}

enter image description here

Here's a modification where the grey box has the same vertical size of the blue box.

\documentclass[a4paper]{book}
\usepackage{lipsum}
\usepackage{titlesec}
\usepackage{xcolor}

\newsavebox{\sectiontitlebox}
\newlength{\sectionlabelwidth}
\colorlet{mygray}{gray!90}
\colorlet{myblue}{blue!80}

\newcommand{\sectiontitle}[1]{%
  \settowidth{\sectionlabelwidth}{%
    \colorbox{mygray}{\strut\color{white}Section~\thesection}%
  }%
  \sbox{\sectiontitlebox}{%
    \colorbox{myblue}{%
      \parbox[t]{\dimexpr\columnwidth-\sectionlabelwidth-2\fboxsep-0.5ex}{
        \raggedright\strut\color{white}#1
      }%
    }%
  }%
  \colorbox{mygray}{%
    \vrule height \dimexpr\ht\sectiontitlebox-\fboxsep\relax
           depth  \dimexpr\dp\sectiontitlebox-\fboxsep\relax
           width 0pt
    \color{white}Section~\thesection
  }%
  \hspace{0.5ex}%
  \usebox{\sectiontitlebox}%
}

\newcommand{\sectionstartitle}[1]{%
  \colorbox{myblue}{%
    \parbox[t]{\dimexpr\columnwidth-2\fboxsep}{
        \raggedright\strut\color{white}#1
    }%
  }%
}

\titleformat{name=\section}[hang]
  {\large\bfseries}
  {}
  {0pt}
  {\sectiontitle}
\titleformat{name=\section,numberless}[hang]
  {\large\bfseries}
  {}
  {0pt}
  {\sectionstartitle}

\begin{document}

\section{A test}

\setcounter{section}{9}

\section{Another test}

\section{Another test, but with a title that is so long it has to be
split across lines}

\section*{A further test}

\end{document}

enter image description here

3
  • I wonder if it's possible to have the grey box always the same height as the blue box? It would look nicer, in my opinion.
    – Bernard
    Jun 1, 2016 at 18:42
  • @Bernard Your wish is my command. ;-)
    – egreg
    Jun 1, 2016 at 19:59
  • @egreg:Thanks, my Lord! That is quite simple and elegant indeed. Actually, the really nicest (but it's my personal taste) would be a simple coloured \fcolorbox with no coloured background around the label.
    – Bernard
    Jun 1, 2016 at 20:15
3

Based on Is there a way to measure the remaining space of a line of text?

\documentclass[a4paper]{book}
\usepackage{lipsum}
\usepackage[explicit]{titlesec}
\usepackage{xcolor}

\newlength{\myl}
\colorlet{mygray}{gray!90}
\colorlet{myblue}{blue!80}

\newcommand{\graybox}{\colorbox{mygray}{\strut \color{white}Section~\thesection}}

\settowidth{\myl}{\graybox}

\usepackage{tikz}
\usetikzlibrary{calc}

\newcommand{\currentsidemargin}{%
    \ifodd\value{page}%
    \oddsidemargin%
    \else%
    \evensidemargin%
    \fi%
}

\newlength{\whatsleft}

\newcommand{\measureremainder}[1]{%
    \begin{tikzpicture}[overlay,remember picture]
    % Helper nodes
    \path (current page.north west) ++(\hoffset, -\voffset)
    node[anchor=north west, shape=rectangle, inner sep=0, minimum width=\paperwidth, minimum height=\paperheight]
    (pagearea) {};


    \path (pagearea.north west) ++(1in+\currentsidemargin,-1in-\topmargin-\headheight-\headsep)
    node[anchor=north west, shape=rectangle, inner sep=0, minimum width=\textwidth, minimum height=\textheight]
    (textarea) {};

    % Measure distance to right text border
    \path let \p0 = (0,0), \p1 = (textarea.east) in
    [/utils/exec={\pgfmathsetlength#1{\x1-\x0}\global#1=#1}];

    \end{tikzpicture}%
}

\titleformat{\section}[hang]{\large\bfseries}%
{\graybox}{.5ex}{\measureremainder{\whatsleft}\colorbox{myblue}{\makebox[\dimexpr\whatsleft-2\fboxsep][l]%
{\strut\color{white}\large\bfseries #1}}}

\pagestyle{empty}

\begin{document}

\section{blub}

\setcounter{section}{10}

\section{blub}

\lipsum

\end{document}

enter image description here

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .