创建独立编号的章节级结构

创建独立编号的章节级结构

我正在写一本书,在各章之间,我可能会用与本书内容相关的软件包的章节大小的文本块来讨论。因此,我希望将这些内容标记为除章节之外的其他内容。例如,我希望我的目录如下所示:

1 这是我的第一章的标题

2 这是我的第二章标题

软件突破 1:了解 Foo 和 Bar

3 这是我第 3 章的标题

软件突破 2:Baz 和 Quux 来了!

4 这是我第 4 章的标题

等等。您可以在这里看到三个要求:

  1. 软件中断具有独立于章节的计数器。
  2. 软件中断在目录中的出现方式不同。
  3. 否则,软件中断的功能与章节相同。例如,在某一章的某个地方,我可能会输入如下内容:

    We covered widget frozzling in Software Break \ref{break:intro} on page \pageref{break:intro}.
    

我想说的是,我想重新创建标准书籍文档类对章节所做的一切,但同样,作为完全不同的类别,称为软件中断。所以我查看了源代码book.cls这里),但我还不是熟练的 LaTeX 使用者,无法理解它。我可以尝试复制和粘贴大量有关章节定义的内容,但我不确定我是否做对了,或者是否会成功。

或者,也许我需要做的是手动更改部分章节的名称/外观/编号?我不会经常移动章节,所以如果我必须手动对它们进行编号,那也没什么大不了的。

任何建议都值得赞赏!谢谢!

答案1

以下是我最终解决我自己的问题的方法。

总体要点:

  1. 为软件中断部分创建另一个计数器。
  2. 创建一个新的命令来启动软件断点部分,将章节计数器交换为软件断点计数器,重新格式化章节标题和目录中的编号和外观以及所有内容。
  3. 当软件中断结束时创建一个单独的命令,以使一切恢复正常。

代码如下所示,并且需要\usepackage{titlesec}

% Define and initialize counters used below
\newcounter{swbreak}
\setcounter{swbreak}{0}
\newcounter{swapspace}

% Choose the phrase that will be used in the titles:
\def\swbreakphrase{Software Break}

% The following one-parameter environment is used to wrap a "software break."
% Yes, that's write, you wrap the entire chapter-like thing in this:
% \begin{swbreak}
% ...lots and lots of stuff...
% \end{swbreak}
\newenvironment{swbreak}[1]{
    % Swap chapter and software break counters:
    \setcounter{swapspace}{\value{chapter}}
    \setcounter{chapter}{\value{swbreak}}
    % Use A,B,C for software breaks instead of 1,2,3:
    \renewcommand{\thechapter}{\Alph{chapter}}
    % Don't let the actual chapter title *also* show up in the ToC:
    \addtocontents{toc}{\protect\setcounter{tocdepth}{-1}}
    % Change Chapter heading to Software Break heading, and start a new "chapter":
    \titleformat{\chapter}[display]{\normalfont\huge\bfseries}{Software Break \thechapter}{20pt}{\Huge}
    \chapter{#1}
    % Re-enable chapter heading style, and chapters appearing in ToC:
    \addtocontents{toc}{\protect\setcounter{tocdepth}{1}}
    \titleformat{\chapter}[display]{\normalfont\huge\bfseries}{\chaptertitlename\ \thechapter}{20pt}{\Huge}
    % Insert a custom ToC entry style for this software break:
    \addcontentsline{toc}{chapter}{\swbreakphrase\ \Alph{chapter}: #1}
}{
    % Swap chapter and software break counters back to the way they were:
    \setcounter{swbreak}{\value{chapter}}
    \setcounter{chapter}{\value{swapspace}}
    % Use 1,2,3 again instead of A,B,C:
    \renewcommand{\thechapter}{\arabic{chapter}}
}

答案2

以下是定义软件中断环境并更正 TOC 的示例

\documentclass{book}
\makeatletter

\newcommand\SWbreakname{Software Break}

%-- Counter
\newcounter{SWbreak}
\renewcommand\theSWbreak{\Alph{SWbreak}}
\@addtoreset{equation}{SWbreak}
\@addtoreset{table}{SWbreak}
\@addtoreset{figure}{SWbreak}

%-- Software break environment
%-- Usage: \begin{SoftwareBreak}[<short title>]{<full title>}
%--           Contents....
%--        \end{SoftwareBreak}
%--
\newenvironment{SoftwareBreak}[2][\SB@temp]
   {\gdef\SB@temp{#2}%
    \global\let\@chapapp@old=\@chapapp
    \global\let\thechapter@old=\thechapter
    \gdef\@chapapp{\SWbreakname}
    \gdef\thechapter{\theSWbreak}%
    \SB@chapt{#1}{#2}%
   }%
   {%
    \global\let\@chapapp=\@chapapp@old
    \global\let\thechapter=\thechapter@old}

%-- Custom chapter to correct TOC
\newcommand\SB@chapt[2]{%
    \if@openright\cleardoublepage\else\clearpage\fi
    \thispagestyle{plain}%
    \global\@topnum\z@
    \@afterindentfalse
    \ifnum \c@secnumdepth >\m@ne
        \if@mainmatter
            \refstepcounter{SWbreak}%
            \addcontentsline{toc}{SWbreak}%
                {\protect\numberline{\SWbreakname~\theSWbreak:}#1}%
        \else
            \addcontentsline{toc}{SWbreak}{#1}%
        \fi
    \else
        \addcontentsline{toc}{SWbreak}{#1}%
    \fi
    \chaptermark{#1}%
    \addtocontents{lof}{\protect\addvspace{10\p@}}%
    \addtocontents{lot}{\protect\addvspace{10\p@}}%
    \if@twocolumn
        \@topnewpage[\@makechapterhead{#2}]%
    \else
        \@makechapterhead{#2}%
        \@afterheading
    \fi}

%-- TOC formating
\newcommand*\l@SWbreak[2]{%
  \ifnum \c@tocdepth >\m@ne
    \addpenalty{-\@highpenalty}%
    \vskip 1.0em \@plus\p@
    \settowidth\@tempdima{\bfseries \SWbreakname~XX:~}%
    \begingroup
      \parindent \z@ \rightskip \@pnumwidth
      \parfillskip -\@pnumwidth
      \leavevmode \bfseries
      \advance\leftskip\@tempdima
      \hskip -\leftskip
      #1\nobreak\hfil \nobreak\hb@xt@\@pnumwidth{\hss #2}\par
      \penalty\@highpenalty
    \endgroup
  \fi}

%-- Keep hyperref happy
\def\toclevel@SWbreak{0}

\makeatother

\usepackage{lipsum}
\begin{document}
\frontmatter
\tableofcontents
\listoffigures

\mainmatter
\chapter{First Chapter}
\section{A section}
\lipsum[1]
\section{Another section}
\lipsum[1]
\begin{figure}
    \caption{A figure}
\end{figure}
\lipsum[1]

\begin{SoftwareBreak}[First Software Break]
                     {First Software Break plus a very long line to check for wrapping}
    \section{A section in a Software Break}
    \lipsum[1]
    \section{Another section in a Software Break}
    \lipsum[1]
    \begin{figure}
        \caption{A figure}
    \end{figure}
    \lipsum[1]
\end{SoftwareBreak}

\chapter{Second Chapter}
\section{A section}
\lipsum[1]
\section{Another section}
\lipsum[1]
\begin{figure}
    \caption{A figure}
\end{figure}
\lipsum[1]

\begin{SoftwareBreak}{Second Software Break}
    \section{A section in a Software Break}
    \lipsum[1]
    \section{Another section in a Software Break}
    \lipsum[1]
    \begin{figure}
        \caption{A figure}
    \end{figure}
    \lipsum[1]
\end{SoftwareBreak}

\end{document}

相关内容