12

I'm trying to redefine the \subsubsection of the report class to behave like \paragraph and not have a linebreak after the title.

It's closely related to this question but I have no idea how to extrapolate the reverse effect from it.

I tried to get the code for paragraph using \show\paragraph and redifining \subsubsection with it as follows, but although it does compile, it doesn't work when I try to use it.

\renewcommand{\subsubsection}{\long macro :->\@startsection{subsubsection}{4}{\z@ }{3.25ex \@plus 1ex \@minus .2ex}{-1em}{\normalfont \normalsize \bfseries}}

I'm would like to know how to solve my original problem, but now, I'm also curious as to what I did wrong with that \renewcommand since it seems to me like I'd encounter it again with other problems I'd try to solve by modifying how latex does its thing.

MWE:

\RequirePackage[l2tabu, orthodox]{nag}
\documentclass[12pt]{report}

\usepackage{listings}

\def\thesection{\Roman{section}}
\def\thesubsection{\thesection.\Alph{subsection}}
\setcounter{secnumdepth}{2}

%\renewcommand{\subsubsection}{\long macro :->\@startsection{subsubsection}{4}{\z@ }{3.25ex \@plus 1ex \@minus .2ex}{-1em}{\normalfont \normalsize \bfseries}}

\begin{document}

\chapter{Chapter 1}
\label{c:c1}

\section{Section 1}
\label{s:s1}

\subsection{Subsection 1}
\label{ss:ss1}

\subsubsection{\lstinline{<Upper|Lower> Triangular}} defines a triangular matrix ...

\end{document}
Lexiel
  • 1,037

3 Answers3

10

The output of \show cannot be used as you are trying. It says that \subsection is a "long" macro that has no arguments and the replacement text is what follows ->.

The right place where to look is report.cls, where you find

\newcommand\subsubsection{\@startsection{subsubsection}{3}{\z@}%
                                     {-3.25ex\@plus -1ex \@minus -.2ex}%
                                     {1.5ex \@plus .2ex}%
                                     {\normalfont\normalsize\bfseries}}
\newcommand\paragraph{\@startsection{paragraph}{4}{\z@}%
                                    {3.25ex \@plus1ex \@minus.2ex}%
                                    {-1em}%
                                    {\normalfont\normalsize\bfseries}}

The key point that explain the different behavior are: the negative fourth argument of \@startsection for \subsubsection which suppresses indentation of the following paragraph; the positive fifth argument tells TeX that the title will not be "run-in". So

\makeatletter
\renewcommand\subsection{%
  \@startsection{subsubsection}{3}{\z@}{3.25ex \@plus1ex \@minus.2ex}%
  {-1em}{\normalfont\normalsize\bfseries}}
\makeatother

The second argument to \@startsection tells LaTeX the level of the sectioning command for the purposes of secnumdepth and tocdepth and should stay 3.

Important note

The \makeatletter and \makeatother commands are necessary because we are doing stuff involving the internal command of LaTeX.

Every time a command containing @ in its name has to be used, the code must either be in a .sty file or surrounded by that pair. See What do \makeatletter and \makeatother do? for more information.

egreg
  • 1,121,712
  • To see the definition you can also use texdef -t latex -c report subsubsection paragraph (or latexdef instead texdef -t latex if that symlink is installed). However, looking into the source file directly has the benefit that you see the code as it was formatted by the author. – Martin Scharrer Jul 07 '11 at 20:46
  • @Martin: but it uses the same output as \show. I think that the main part of my answer is to explain what went wrong to begin with. – egreg Jul 07 '11 at 20:47
  • Thanks a lot for all the details, I'm now a little less ignorant in the ways of latex :) – Lexiel Jul 07 '11 at 20:51
  • @egreg: Indeed (I actually added that to my comment while you were responding ;-) ). I just wanted to point the possibility out, nothing against the answer. – Martin Scharrer Jul 07 '11 at 20:51
3

\long macro :-> is not part of the definition of the macro, and you need to change the catcode of @ in the definition. The following should work:

\makeatletter
\renewcommand{\subsubsection}{\@startsection{subsubsection}{3}{\z@}%
  {3.25ex \@plus 1ex \@minus .2ex}{-1em}{\normalfont\normalsize\bfseries}}
\makeatother
egreg
  • 1,121,712
Michael Ummels
  • 8,604
  • 3
  • 36
  • 27
0

If you prefered not to do things manually, you can use the titlesec package whose usage is described in this question: Defining custom sectioning commands

yo'
  • 51,322