如何获取章节首页和最后一页的页码?似乎我无法通过 来实现\label
,如下面的 MWE 中所示,因为如果我做对了,它们只能为整个文档设置一次。我打算最终在页脚中使用这些数字。
\documentclass{memoir}
\usepackage{lipsum}
\begin{document}
\chapter{chapter one}
\label{firstpage}
[First chapter is from page \pageref{firstpage} to page \pageref{lastpage}.]
\lipsum
\label{lastpage}
\chapter{chapter two}
\label{firstpage}
[Second chapter is from page \pageref{firstpage} to page \pageref{lastpage}.]
\lipsum
\label{lastpage}
\end{document}
答案1
您可以重新定义\chapter
来完成工作。您将\finishchapter
在最后一章的末尾需要一个。
如果一章填满了一页,可能会出现问题,因此删除
\label{\thechapter @lastpage}
从下面的代码中删除一行并\finishchapter
在章节的最后一个单词后手动添加可能会更好。
\documentclass{memoir}
\usepackage{xparse}
\usepackage{lipsum}
\let\memoirchapter\chapter
\RenewDocumentCommand{\chapter}{soom}{%
\label{\thechapter @lastpage}%
\IfBooleanTF{#1}
{\IfValueTF{#2}{\memoirchapter*[#2]{#4}}{\memoirchapter*{#4}}}%
{\IfValueTF{#2}
{\IfValueTF{#3}{\memoirchapter[#2][#3]{#4}}{\memoirchapter[#2]{#4}}}%
{\memoirchapter{#4}}%
}%
\label{\thechapter @firstpage}%
}
\NewDocumentCommand{\chapterfirstpage}{}{%
\pageref{\thechapter @firstpage}%
}
\NewDocumentCommand{\chapterlastpage}{}{%
\pageref{\thechapter @lastpage}%
}
\NewDocumentCommand{\finishchapter}{}{%
\label{\thechapter @lastpage}%
}
\begin{document}
\chapter{chapter one}
[First chapter is from page \chapterfirstpage{} to page \chapterlastpage{}.]
\lipsum
\chapter{chapter two}
[Second chapter is from page \chapterfirstpage{} to page \chapterlastpage{}.]
\lipsum[1-12]
\chapter{chapter three}
[Third chapter is from page \chapterfirstpage{} to page \chapterlastpage{}.]
\lipsum[1-30]
\finishchapter
\end{document}
请注意,正常行为是忽略空白页。
答案2
以下示例使用标准页面样式(称为mystyle
)自动更新章节的第一页/最后一页引用。章节页引用存储在计数器中,使用来自的一些宏在每章的开始/结束时进行更新refcount
- 它允许人们在计数器中存储引用。
\documentclass{memoir}
\usepackage{lipsum,refcount}
\newcounter{chapfirstpage}
\newcounter{chaplastpage}
\makepagestyle{mystyle}
\makeoddfoot{mystyle}{}{\thepage{} [Chapter range: \thechapfirstpage--\thechaplastpage]}{}
\makeevenfoot{mystyle}{}{\thepage{} [Chapter range: \thechapfirstpage--\thechaplastpage]}{}
\aliaspagestyle{chapter}{mystyle}% 'chapter' page style should be the same as 'mystyle'
\aliaspagestyle{plain}{mystyle}% 'plain' page style should be the same as 'mystyle'
\let\oldchapter\chapter% Store \chapter
\renewcommand{\chapter}{% Update \chapter
\ifnum\value{chapter}=0\else% If _not_ the first chapter
\label{ch\thechapter:lastpage}% Insert an end-of-chapter \label
\fi
\clearpage
\addtocounter{chapter}{1}%
\label{ch\thechapter:firstpage}% Insert a start-of-chapter \label
\setcounterpageref{chapfirstpage}{ch\thechapter:firstpage}%
\setcounterpageref{chaplastpage}{ch\thechapter:lastpage}%
\addtocounter{chapter}{-1}%
\oldchapter% ...follow regular \chapter
}
\AtEndDocument{\label{ch\number\value{chapter}:lastpage}}% Issue end-of-chapter (end-of-document) \label
% for last chapter
\begin{document}
\chapter{chapter one}\lipsum
\chapter{chapter two}\lipsum
\end{document}
当然,您可以使用自己的页面样式...我公然覆盖了chapter
和plain
页面样式,以确保它在所有页脚中列出。
请注意,您必须创建自己的页面引用才能访问此中间文档。在紧急情况下,您可以使用\pageref{ch<num>:firstpage}
/\thechapfirstpage
和\pageref{ch<num>:lastpage}
/\thechaplastpage
来提取它们,但自动化旨在更新页面样式信息,而不是文档内容信息。
另请注意,根据您的文档构造,我使用
\AtDocumentEnd{...}
插入最后一个页面引用ch<num>:lastpage
可能不够(可能是由于文档末尾的浮动位置尚未确定)。但是,它适用于相对基本的情况。当然,atveryend
包裹可以用来规避这个问题,或者使用memoir
自己lastpage
或者lastsheet
直接“参考”。
答案3
我找到了一个解决方案,即创建一对宏,可以在每章开头重新定义。这应该可行,但如果有更优雅的方法就更好了。
\documentclass{memoir}
\usepackage{lipsum}
\newcommand{\chapterfirstpage}{}
\newcommand{\chapterlastpage}{}
\begin{document}
\chapter{chapter one}
\renewcommand{\chapterfirstpage}{\pageref{ch1.firstpage}}
\renewcommand{\chapterlastpage}{\pageref{ch1.lastpage}}
\label{ch1.firstpage}
[First chapter is from page \chapterfirstpage{} to page \chapterlastpage{}.]
\lipsum
\label{ch1.lastpage}
\chapter{chapter two}
\renewcommand{\chapterfirstpage}{\pageref{ch2.firstpage}}
\renewcommand{\chapterlastpage}{\pageref{ch2.lastpage}}
\label{ch2.firstpage}
[Second chapter is from page \chapterfirstpage{} to page \chapterlastpage{}.]
\lipsum
\label{ch2.lastpage}
\end{document}