获取指定样式的页码和页数

获取指定样式的页码和页数

给定一组页面样式,例如plainbutter,在回忆录类中,如何获取给定样式的页码和计数?

这看起来像是一个已经解决的问题,但我似乎找不到别人已经解决的解决方案。

一个简单的例子:

\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被重新定义为

  1. 创建页面样式特定的计数器(如果尚未定义);
  2. 将当前使用的页面样式存储在宏中\@cur@pagestyle(以便稍后使用);并且
  3. 将页面计数器写入.aux文件\AtEndDocument

页面样式特定的计数器在以下位置递增(步进)\EveryShipouteveryshi)。 自从memoir已经定义了\thelastpage,我已经定义了\TheLastPage相同的功能,这次仅针对页面样式。

geometry仅为了本例而加载。

相关内容