Question 1: You have to "hide" the height of the title
\renewcommand\thechapter{\arabic{chapter}.0}
\titleformat{\chapter}[display]
{\normalfont\fontsize{25pt}{0pt}\bfseries\sffamily}
{\varhrulefill\enskip\thechapter\enskip\varhrulefill}
{12pt} % <--- modify this for lowering the title
{\center\ignoretitleheight}
\newcommand{\ignoretitleheight}[1]{\leavevmode\smash{\MakeUppercase{#1}}}
Question 2: You have to avoid inserting the \lineskip
when two lines are "too near" to each other
\newcommand{\trailthesubsection}[1]{\MakeUppercase{#1} (\thesubsection)}
\titleformat{\subsection}
{\normalfont\fontsize{15pt}{14pt}\bfseries\sffamily\lineskiplimit=-\maxdimen}
{}
{0pt}
{\filcenter\trailthesubsection}
\titleformat{\subsubsection}
{\normalfont\fontsize{12pt}{11pt}\bfseries\scshape\lineskiplimit=-\maxdimen}
{}
{0pt}
{\filcenter}
However the spacing won't be uniform if some character is higher than the stated baseline skip (an accented uppercase letter, for example).
Updated version
\documentclass{article}
\usepackage{titlesec}
\usepackage{tikz}
\usetikzlibrary{shapes,shadows,calc}
\usepackage{lipsum}
\usepackage[hmargin=0.5in,bmargin=1in,tmargin=1in,centering]{geometry}
\definecolor{gray}{RGB}{236,236,236}
% Distance between left side of node and title text
\newlength\TitleIndentLeft
% Distance between right side of node and title text
\newlength\TitleIndentRight
% Total width for the node
% the total width of the title is internally calculated
% as \TitleWidth-\TitleIndentLeft-\TitleIndentRight
\newlength\TitleWidth
\setlength\TitleIndentLeft{0.25in}
\setlength\TitleIndentRight{0pt}
\setlength\TitleWidth{\dimexpr\textwidth+0.5in\relax} % the node will
% start from the left margin and will extend to the right margin
% 0.5in is added since it's the value for the left margin of the document
\newcommand\SecTitle[1]{%
\begin{tikzpicture}
\node[
outer sep=0pt,
inner xsep=0pt,
inner ysep=1cm,
text width=\TitleWidth,
align=left,
left color=gray,
right color=white,
font=\Huge,
anchor=west
]
at (0,0)
{%
\parbox{\TitleIndentLeft}{\mbox{}}%
\parbox{\dimexpr\textwidth-\TitleIndentLeft-\TitleIndentRight\relax}{\raggedright\strut#1\strut}%
\parbox{\TitleIndentRight}{\mbox{}}%
};
\end{tikzpicture}%
}
%\titleformat{command}[shape]{format}{label}{sep}{before-code}{after-code}
\titleformat{\section}
{\normalfont}
{}
{-0.5in}% -0.5in here since it's the value for the left margin
{\SecTitle}
\begin{document}
\section{Test Section One}
\lipsum[2]
\section{Test Section Two with a Longer Title so that it Spans more than one Line}
\lipsum[2]
% Just for the example to illustrate the effect of the lengths controling the
% title alignment and length
\setlength\TitleIndentLeft{0.5in}
\section{Test Section Two with a Longer Title so that it Spans more than one Line}
\lipsum[2]
\end{document}
Remarks:
I changed the definition for \SecTitle
so it only uses one mandatory argument; in this way, it's not necessary to use the explicit
option for titlesec
.
I defined three auxiliary lengths to help control the total width for the node as well as the distance between the left, right borders of the node and the title:
% Distance between left side of node and title text
\newlength\TitleIndentLeft
% Distance between right side of node and title text
\newlength\TitleIndentRight
% Total width for the node
% the total width of the title is internally calculated
% as \TitleWidth-\TitleIndentLeft-\TitleIndentRight
\newlength\TitleWidth
Changing the values for those length, you can easily control the overhang for the title as well as the total width desired; in the example code above I illustrate this in the third section title.
Instead of using minimum height
, I now use inner ysep
so the box will adjust to longer titles and the vertical separation between the top/bottom of the text and the borders of the box will remain constant.
Initial versions:
Like this? (I was not sure about the desired horizontal shift for the title from the left margin, so based on the image posted I assumed it had to overhang a little, if this is not the case, let me know where exactly it should be to correct the positioning):
\documentclass{article}
\usepackage[explicit]{titlesec}
\usepackage{tikz}
\usetikzlibrary{shapes,shadows,calc}
\usepackage{lipsum}
\usepackage[hmargin=0.5in,bmargin=1in,tmargin=1in,centering]{geometry}
\definecolor{gray}{RGB}{236,236,236}
\newcommand\SecTitle[4]{%
\begin{tikzpicture}
\node[inner xsep=10pt,minimum height=3cm,text width=0.7\textwidth,
align=left,left color=gray,right color=white, signal to=#1,font=\Huge,anchor=#2]
at (#3,0) {#4};
\end{tikzpicture}%
}
%\titleformat{command}[shape]{format}{label}{sep}{before-code}{after-code}
\titleformat{\section}
{\normalfont}{}{-3.5em}
{\SecTitle{east}{west}{0}{#1}}
\begin{document}
\section{Test Section One}
\lipsum[2]
\section{Test Section Two}
\lipsum[2]
\clearpage
\section{Test Section Three}
\lipsum[2]
\section{Test Section Four}
\lipsum[2]
\end{document}
It's not clear to me why so many arguments for \SecTitle
if only the fourth one is really gonna be used as variable.
In fact, if just the last argument is to be really a variable used for the title, you can reduce the definition of \SecTitle
to something like
\newcommand\SecTitle[1]{%
\begin{tikzpicture}[remember picture,overlay]
\node[inner xsep=10pt,minimum height=3cm,text width=0.7\textwidth,
align=left,left color=gray,right color=white,font=\Huge,anchor=west]
at (current page.west|-0,0) {#1};
\end{tikzpicture}%
}
and this also avoids the use of explicit
; notice that I also used
(current page.west|-0,0)
to position the node at the right location (flushed to the left margin) without having to guess lengths. The code (adjust the lengths according to your needs):
\documentclass{article}
\usepackage{titlesec}
\usepackage{tikz}
\usetikzlibrary{shapes,shadows,calc}
\usepackage{lipsum}
\usepackage[hmargin=0.5in,bmargin=1in,tmargin=1in,centering]{geometry}
\definecolor{gray}{RGB}{236,236,236}
\newcommand\SecTitle[1]{%
\begin{tikzpicture}[remember picture,overlay]
\node[inner xsep=10pt,minimum height=3cm,text width=0.7\textwidth,
align=left,left color=gray,right color=white,font=\Huge,anchor=west]
at (current page.west|-0,0) {#1};
\end{tikzpicture}%
}
%\titleformat{command}[shape]{format}{label}{sep}{before-code}{after-code}
\titleformat{\section}
{\normalfont}
{}
{0em}
{\SecTitle}
\titlespacing*{\section}
{0pt}{53pt plus 1ex minus .2ex}{50pt plus .2ex}
\begin{document}
\section{Test Section One}
\lipsum[2]
\section{Test Section Two}
\lipsum[2]
\clearpage
\section{Test Section Three}
\lipsum[2]
\section{Test Section Four}
\lipsum[2]
\end{document}
Best Answer
You don't need to use a brute-force solution: the
titlesec
package provides a\titlespacing
command to set these values properly:From the manual: