给定一组页面样式,例如plain
和butter
,在回忆录类中,如何获取给定样式的页码和计数?
这看起来像是一个已经解决的问题,但我似乎找不到别人已经解决的解决方案。
一个简单的例子:
\documentclass{memoir}
\copypagestyle{butter}{plain}
\begin{document}
\pagestyle{plain}
Page \thepage{} of \thelastpage. % should be "1 of 2" but is "1 of 1"
\newpage
Page \thepage{} of \thelastpage. % should be "2 of 2" but is "1 of 1"
\newpage
\pagestyle{butter}
\setcounter{page}{1} % reset page to 1
Page \thepage{} of \thelastpage. % correctly "1 of 1"
\end{document}
我收集了lastpage
计数器使用文档的最后一页,在本例中为 1,因为我们重置了它。
如何才能获得页面的数量plain
?
在一种特殊的情况下,人们想忽略butter
总页数中的页数,而且有两种样式,有没有一种简单的方法可以得到页数plain
?(除了把butter
页数放在页数之前plain
)
答案1
您可以利用lastpage
包的方法,将当前页码写入文件.aux
。
\documentclass{memoir}
\copypagestyle{butter}{plain}
\makeatletter
% first arg is label for current page number.
\def\savepage#1{%
\immediate\write\@auxout{\string
\newlabel{#1}{{\thepage}{}}}%
}
\makeatother
\begin{document}
\pagestyle{plain}
% rather than \thelastpage reference via \ref
Page \thepage{} of \ref{lastplainpage} (1st plain page)
\newpage
Page \thepage{} of \ref{lastplainpage} (2nd plain page)
% save current value of page counter as "lastplainpage"
\savepage{lastplainpage}
\newpage
\pagestyle{butter}
\pagenumbering{arabic}% reset page to 1
Page \thepage{} of \ref{lastbutterpage} (1st butter page)
\newpage
Page \thepage{} of \ref{lastbutterpage} (2nd butter page)
% save current value of page counter as "lastbutterpage"
\savepage{lastbutterpage}
\end{document}
答案2
以下是一个更自动化的修改Scott H 的回答维护与页面样式相关的页面计数器。
\documentclass{memoir}% http://ctan.org/pkg/memoir
\usepackage[paperheight=12\baselineskip,paperwidth=100pt]{geometry}% http://ctan.org/pkg/geometry
\usepackage{everyshi}% http://ctan.org/pkg/everyshi
\makeatletter
\EveryShipout{\stepcounter{ps@\@cur@pagestyle @lastpage}}% Increment
\newcounter{ps@savepage}% To save the page style counter
\def\savepage#1{%
\setcounter{ps@savepage}{\value{ps@#1@lastpage}}%
\immediate\write\@auxout{\string
\newlabel{ps@#1@lastpage}{{\theps@savepage}{}}}%
}
% Taken from latex.ltx/ltpage.dtx
\def\pagestyle#1{%
\@ifundefined{ps@#1}%
\undefinedpagestyle
{\@nameuse{ps@#1}\gdef\@cur@pagestyle{#1}%
\@ifundefined{c@#1@lastpage}{\newcounter{ps@#1@lastpage}\AtEndDocument{\savepage{#1}}}{}}}
\def\thispagestyle#1{%
\@ifundefined{ps@#1}%
\undefinedpagestyle
{\global\@specialpagetrue\gdef\@specialstyle{#1}\gdef\@cur@pagestyle{#1}%
\@ifundefined{c@#1@lastpage}{\newcounter{ps@#1@lastpage}\AtEndDocument{\savepage{#1}}}{}}}
\newcommand{\TheLastPage}{\ref{ps@\@cur@pagestyle @lastpage}}
\makeatother
\copypagestyle{butter}{plain}
\begin{document}
\pagestyle{plain}
Page \thepage{} of \TheLastPage. % "1 of 2"
\newpage
Page \thepage{} of \TheLastPage. % "2 of 2"
\newpage
\pagestyle{butter}
\setcounter{page}{1} % reset page to 1
Page \thepage{} of \TheLastPage. % correctly "1 of 1"
\end{document}
和\pagestyle
宏\thispagestyle
被重新定义为
- 创建页面样式特定的计数器(如果尚未定义);
- 将当前使用的页面样式存储在宏中
\@cur@pagestyle
(以便稍后使用);并且 - 将页面计数器写入
.aux
文件\AtEndDocument
。
页面样式特定的计数器在以下位置递增(步进)\EveryShipout
:everyshi
)。 自从memoir
已经定义了\thelastpage
,我已经定义了\TheLastPage
相同的功能,这次仅针对页面样式。
geometry
仅为了本例而加载。