我目前正在处理一份文档,该文档需要一个包含当前章节的页码和页数的标题。
\documentclass[a4paper,12pt]{scrreprt}
\usepackage{scrlayer-scrpage}
\usepackage[english]{babel}
\usepackage{blindtext}
\renewcommand\chapterpagestyle{scrheadings}
\renewcommand\chaptermark[1]{\markboth{#1}{}}
\clearscrheadfoot
\pagestyle{scrheadings}
\chead{\leftmark\ (N/M)}
\cfoot{\thepage}
\begin{document}
\chapter{Lorem ipsum}
\blindtext[15]
\chapter{Dolor sit amet}
\blindtext[5]
\chapter{Consectetur}
\blindtext[15]
\chapter{Adipiscing elit}
\blindtext[10]
\end{document}
预期输出:
Lorem ipsum (1/3)
...
Lorem ipsum (2/3)
...
Lorem ipsum (3/3)
...
Dolor sit amet
...
Consectetur (1/3)
...
...
我在 StackOverflow 网络中没有找到任何适合该问题的问题以及一些简短且可行的示例代码,所以我决定创建一个新问题,而不是劫持旧问题。
由于我最近设法使用一些自定义计数器和 pageref 算法完成了此任务,因此我也发布了我自己对此问题的答案。我真的很想知道是否有更好的方法可以做到这一点。
答案1
我设法通过更新增加两个计数器的命令来完成此操作\chapter
。一个计数器用于当前ChapterIndex
,另一个用于NextChapterIndex
。每个章节都会创建一个\label
带有键的ch:\theChapterIndex
,然后在呈现头部或脚注时可以引用该键。可以使用当前页码和章节开头的页码来计算章节相对页码。可以通过章节页码和下一章页码的差值来计算计数。最后一章有点棘手,因为没有下一章。对于这种情况,我只需将该标签添加到文档末尾,并添加一些将\ifnum
下一章的页面与最后一页码进行比较的逻辑。
我花了相当多的时间反复试验,但\ifthenelse
似乎没有成功,\numexpr
所以我不得不退回去\ifnum
,用稍微不同的方式来写。
长话短说 - 我设法完成了这个任务,下面是最终的 LaTeX 代码:
\documentclass[a4paper,12pt]{scrreprt}
\usepackage{scrlayer-scrpage}
\usepackage[english]{babel}
\usepackage{blindtext}
\usepackage{lastpage}
\usepackage{refcount}
\usepackage{ifthen}
% Per chapter page numbers (N/M)
\newcounter{ChapterIndex}
\newcounter{NextChapterIndex}
\stepcounter{NextChapterIndex}
\let\chapterOrig\chapter
\renewcommand{\chapter}[1]{
\chapterOrig{#1}
\stepcounter{ChapterIndex}
\stepcounter{NextChapterIndex}
\label{ch:\theChapterIndex}
}
\newcommand{\chapterPage}[0]{\number\numexpr\thepage-\getpagerefnumber{ch:\theChapterIndex}+1\relax}
\newcommand{\chapterPageCount}[0]{\number\ifnum\getpagerefnumber{ch:\theNextChapterIndex}=\numexpr\getpagerefnumber{LastPage}\numexpr\getpagerefnumber{LastPage}-\getpagerefnumber{ch:\theChapterIndex}+1\relax\else\number\numexpr\getpagerefnumber{ch:\theNextChapterIndex}-\getpagerefnumber{ch:\theChapterIndex}\relax\fi}
\newcommand{\chapterPaginator}[0]{\ifnum\chapterPageCount>1(\chapterPage/\chapterPageCount)\fi}
\renewcommand\chapterpagestyle{scrheadings}
\renewcommand\chaptermark[1]{\markboth{#1}{}}
\clearscrheadfoot
\pagestyle{scrheadings}
\chead{\leftmark\ \chapterPaginator}
\cfoot{\thepage}
\begin{document}
\chapter{Lorem ipsum}
\blindtext[15]
\chapter{Dolor sit amet}
\blindtext[5]
\chapter{Consectetur}
\blindtext[15]
\chapter{Adipiscing elit}
\blindtext[10]
\label{ch:\theNextChapterIndex}
\end{document}
截屏
答案2
以下解决方案使用
assoccnt
提供每章页面计数器。即,与计数器同步步进的计数器perchpage
(每次有新内容时重置) ;\chapter
page
zref
在每个 的末尾perchpage
只写入。还提供了可扩展的引用检查以及一些默认值,如果引用不存在(本质上类似于.aux
\chapter
zref
refcount
提供。;atveryend
在文件关闭\chapter
之前的最后一行末尾写一个引用。.aux
\documentclass{scrreprt}
\usepackage{scrlayer-scrpage}
\usepackage[english]{babel}
\usepackage{blindtext,assoccnt,zref,atveryend}
\makeatletter
\newcounter{perchpage}[chapter]
\DeclareAssociatedCounters{page}{perchpage}
\zref@newprop{perchpage}[0]{\number\value{perchpage}}
\let\oldchapter\chapter
\renewcommand{\chapter}{%
\cleardoublepage
\ifnum\value{chapter}>0\zref@labelbyprops{ch:end:lbl\thechapter}{perchpage}\fi
\oldchapter
}
\newcommand{\chapterPaginator}{%
\ifnum\zref@extract{ch:end:lbl\thechapter}{perchpage}>1
(\number\numexpr\value{perchpage}+1\relax/\zref@extract{ch:end:lbl\thechapter}{perchpage})
\fi}
\AfterLastShipout{\zref@labelbyprops{ch:end:lbl\thechapter}{perchpage}}
\makeatother
\renewcommand\chapterpagestyle{scrheadings}
\renewcommand\chaptermark[1]{\markboth{#1}{}}
\clearscrheadfoot
\pagestyle{scrheadings}
\chead{\leftmark\ \chapterPaginator}
\cfoot{\thepage}
\begin{document}
\chapter{Lorem ipsum}
\blindtext[15]
\chapter{Dolor sit amet}
\blindtext[5]
\chapter{Consectetur}
\blindtext[15]
\chapter{Adipiscing elit}
\blindtext[10]
\end{document}