我正在写一本书,在各章之间,我可能会用与本书内容相关的软件包的章节大小的文本块来讨论。因此,我希望将这些内容标记为除章节之外的其他内容。例如,我希望我的目录如下所示:
1 这是我的第一章的标题
2 这是我的第二章标题
软件突破 1:了解 Foo 和 Bar
3 这是我第 3 章的标题
软件突破 2:Baz 和 Quux 来了!
4 这是我第 4 章的标题
等等。您可以在这里看到三个要求:
- 软件中断具有独立于章节的计数器。
- 软件中断在目录中的出现方式不同。
否则,软件中断的功能与章节相同。例如,在某一章的某个地方,我可能会输入如下内容:
We covered widget frozzling in Software Break \ref{break:intro} on page \pageref{break:intro}.
我想说的是,我想重新创建标准书籍文档类对章节所做的一切,但同样,作为完全不同的类别,称为软件中断。所以我查看了源代码book.cls
(这里),但我还不是熟练的 LaTeX 使用者,无法理解它。我可以尝试复制和粘贴大量有关章节定义的内容,但我不确定我是否做对了,或者是否会成功。
或者,也许我需要做的是手动更改部分章节的名称/外观/编号?我不会经常移动章节,所以如果我必须手动对它们进行编号,那也没什么大不了的。
任何建议都值得赞赏!谢谢!
答案1
以下是我最终解决我自己的问题的方法。
总体要点:
- 为软件中断部分创建另一个计数器。
- 创建一个新的命令来启动软件断点部分,将章节计数器交换为软件断点计数器,重新格式化章节标题和目录中的编号和外观以及所有内容。
- 当软件中断结束时创建一个单独的命令,以使一切恢复正常。
代码如下所示,并且需要\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}