Titlesec:重新定义sectioning命令导致latex无限执行

Titlesec:重新定义sectioning命令导致latex无限执行

我是 TeX.SX 的新手,我希望我做的一切都正确。

为了避免“你为什么这样做?”这样的回答,我首先想简要描述一下我想要什么:我正在开发一个基于的类tufte-book,它实现了\subsubsection抛出错误。但是,我想\subsubsection在我的课程中提供。此外,我希望能够使用宏\titleformat来设置子节的样式,因为tufte-book使用titlesec。我的第一次尝试是:

\documentclass{tufte-book}

\makeatletter
% Copy the definition from book.cls
\renewcommand\subsubsection{\@startsection{subsubsection}{3}{\z@}%
                                 {-3.25ex\@plus -1ex \@minus -.2ex}%
                                 {1.5ex \@plus .2ex}%
                                 {\normalfont\normalsize\bfseries}}
\makeatother
% The following macro is called at the very end of titlesec.sty.
% If I uncomment it, the latex process runs forever.

%\titleclass{\subsubsection}{straight}[\subsection]

% Without the optional argument, it works...
% However, if you make the following line a comment...
\titleclass{\subsubsection}{straight}

% ... the access to subsubsection using the titlesec API doesn't work anymore 
\titleformat{\subsubsection}{%
  \fontsize{36}{42}\selectfont%
}{\thesubsubsection}{1em}{}[]


\begin{document}
  \subsection{bar}
  \subsubsection{foo}
\end{document}

经过一番调查后titlesec.sty,MWE 可以简化为使用\titleclass两次相同的调用:

\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage{titlesec}

% runs forever
%\titleclass{\subsubsection}{straight}[\subsection]

% works
\titleclass{\subsubsection}{straight}

% Does not make sense, but works
%\titleclass{\subsubsection}{straight}[\paragraph]

\titleformat{\subsubsection}{%
  \fontsize{36}{42}\selectfont%
}{\thesubsubsection}{1em}{}[]


\begin{document}
  \subsection{bar}
  \subsubsection{foo}
\end{document}

虽然我认为遇到无限循环是发现错误的好兆头,但我既没有找到它,也没有在网上找到有关此问题的任何评论或帖子。我同意\titleclass两次使用相同的定义是一件晦涩难懂的事情,但它至少应该导致错误而不是无限。有人看到(潜在的)错误或更可能是我的错误吗?

答案1

您不必复制其中的定义book,而是必须提供忘记的定义titlesec

\documentclass{tufte-book}

\makeatletter
\renewcommand{\subsubsection}{\ttl@straightclass{subsubsection}}
\makeatother
\titleformat{\subsubsection}[hang]
  {\fontsize{36}{42}\selectfont}
  {\thesubsubsection}
  {1em}
  {}
  []

\setcounter{secnumdepth}{2}

\begin{document}
\chapter{A}
\section{B}
\subsection{bar}
\subsubsection{foo}
\paragraph{C}
\end{document}

在此处输入图片描述

答案2

这两种情况的问题是

\titleclass{\subsubsection}{straight}[\subsection]

尝试\subsection在插入新\subsubsection级别之前将下面的部分级别向下移动。解决此问题的一种方法是定义一个具有新名称的级别,例如 ssubsection,然后将其\subsubsection作为 的副本\ssubsection;由于可选参数等,您需要使用\LetLtxMacro同名包来执行此操作:

示例输出

\documentclass{tufte-book}

\usepackage{letltxmacro}

\titleclass{\ssubsection}{straight}[\subsection]

\newcounter{ssubsection}

\titleformat{\ssubsection}{%
  \normalfont\normalsize\bfseries\selectfont%
}{\thessubsection}{1em}{}[]

\titlespacing{\ssubsection}{0pt}{*3.25}{*1.5}

\LetLtxMacro\subsubsection\ssubsection

\begin{document}
  \subsection{Bar} Text.
  \subsubsection{Foo} Text.
\end{document} 

相关内容