将每个部分的页数放入目录中

将每个部分的页数放入目录中

我如何让目录显示数数每个部分的页数,因此

1. Foo 1
1.1 酒吧 2
1.2 巴兹 5

它会显示

1. Foo 7
1.1 酒吧 4
1.2 巴兹 3

我猜是类似在 \section 命令结束时将页数计数器重置为 1 之类的操作?但那样会捕获上一节的页数,而不是当前节的页数。

这只是为了我自己的利益(以及与我的主管讨论),而不是为了读者,所以我不介意这看起来很草率或出现在文档的末尾而不是开头;我只是假设修改目录是实现它的最简单方法。我的文档只包含章节和部分(没有小节),所以如果这只适用于章节,我会很高兴。

不过,如果它也适用于章节,那就更好了,因为它们不一定等于章节页数的总和:总和往往会多算,因为任何包含多个章节部分的页面都会被计算两次,另一方面,章节开头的“第 0 节”将不会被包括在内。如果这能奏效,如果它还能避免计算以奇数页结尾的章节末尾的空白页,那就太好了。(我可以通过更改为单面布局来手动避免空白页。)

答案1

由于没有人回复,我将发布我最终使用的方法。我得到了有关将令牌添加到列表中的帮助在 StackExchange 上提问并使用 David Carlisle 的答案。

重要的!这是我在对 TeX 几乎一无所知的情况下草草地写出来的代码。它绝对不是良好实践的典范,应该谨慎对待。我把它贴在这里,以防它对其他人有用,但请确保不要将它用于任何“严肃”的事情,例如在包代码中。

\usepackage{ifthen}

% Create a list of tokens, and allow text to be added to it
\newtoks\pagecounttoks
\pagecounttoks={\ \par}
\newcommand{\appendtopagecounttable}[1]{%
\edef\tmp{\pagecounttoks{\the\pagecounttoks#1}}\tmp%
}
\newcommand{\pagecounttable}{\the\pagecounttoks}

\newcommand{\addchapterpagecount}[3]{%
    \appendtopagecounttable{\noindent #1\ \ \ #2\ \ \ \ #3\par\ \par}
}
\newcommand{\addsectionpagecount}[3]{%
    \appendtopagecounttable{#1\ \ \ #2\ \ \ \ #3\par}
}

% Allow commands to be executed after each \chapter and \section command
\let\origsection\section
\renewcommand\section{\@ifstar{\starsection}{\nostarsection}}
\newcommand\nostarsection[1]{%
  \origsection{#1}\sectionpostlude{#1}{\the\value{section}}
}
\newcommand\starsection[1]{%
  \origsection*{#1}\sectionpostlude{#1}{\ }
}
\let\origchapter\chapter
\renewcommand\chapter{\@ifstar{\starchapter}{\nostarchapter}}
\newcommand\nostarchapter[1]{%
  \origchapter{#1}\chapterpostlude{#1}{\the\value{chapter}}
}
\newcommand\starchapter[1]{%
  \origchapter*{#1}\chapterpostlude{#1}{-1}
}

% The counter used for counting pages
\newcounter{sectionstartpage}
\newcounter{sectionendpage}
\newcounter{chapterstartpage}
\newcounter{chapterendpage}

% Name of previous section
\newcommand{\prevchaptername}{}
\newcommand{\prevchaptervalue}{}
\newcommand{\prevsectionname}{}
\newcommand{\prevsectionvalue}{}

% The content of before/after \section commands
\newcommand\sectionpostlude[2]{%
  \let\oldlabel\label
  \def\label##1{}
  \ifthenelse{\equal{\value{sectionstartpage}}{0} \or \equal{\prevchaptervalue}{-1}}{}{
    \setcounter{sectionendpage}{\thepage}%
    \addtocounter{sectionendpage}{-\value{sectionstartpage}}%
    \addsectionpagecount{\prevchaptervalue.\prevsectionvalue}{\prevsectionname}{\the\value{sectionendpage}}
  }
  \setcounter{sectionstartpage}{\thepage}%
  \renewcommand{\prevsectionname}{#1}
  \edef\prevsectionvalue{#2}
  \let\label\oldlabel
}

% The content of before/after \section commands
\newcommand\chapterpostlude[2]{%
  \sectionpostlude{(Introduction)}{0}
  \let\oldlabel\label
  \def\label##1{}
  \ifthenelse{\equal{\value{chapterstartpage}}{0} \or \equal{\prevchaptervalue}{-1}}{}{
    \setcounter{chapterendpage}{\thepage}%
    \ifthenelse{\equal{#1}{Bibliography}}{%
      \addtocounter{chapterendpage}{1}%
    }{}
    \addtocounter{chapterendpage}{-\value{chapterstartpage}}%
    \addchapterpagecount{\prevchaptervalue}{\prevchaptername}{\the\value{chapterendpage}}
  }
  \setcounter{chapterstartpage}{\thepage}%
  \renewcommand{\prevchaptername}{#1}
  \edef\prevchaptervalue{#2}
  \let\label\oldlabel
}

% Also update everything when we get to the bibliography
\let\oldbibliography\bibliography
\renewcommand{\bibliography}[1]{
  \chapterpostlude{Bibliography}{-1}
  \oldbibliography{#1}
}

\newcommand\pagecounttablex{%
  \setstretch{1}
  \clearpage
  \phantomsection\addcontentsline{toc}{chapter}{Page counts}
  \noindent{\huge\bf Page counts}\par\ 
  {\small\pagecounttable}
}

相关内容