![如何获得自定义页码](https://linux22.com/image/352485/%E5%A6%82%E4%BD%95%E8%8E%B7%E5%BE%97%E8%87%AA%E5%AE%9A%E4%B9%89%E9%A1%B5%E7%A0%81.png)
我需要为文档的页面制定一个特殊的编号方案。给定任意整数 n 和 k(k 不为 0 且不为 1),第一个(逻辑)页面必须编号为 n,后续(逻辑)页面必须编号为 n+k、n+2k、n+3k、...
因此,例如,对于 n=10 和 k=-3,文档的页面必须编号为 10,7,4,1,-2,-5,-8,...
该解决方案必须与 、hyperref
和类似命令兼容,还必须在 ToC、LoF 和 LoT 等列表中生成正确的值。\ref
\pageref
理想情况下,必须通过调用命令来获取编号\numberingschema{<initial value>}{<step>}
。
答案1
以下内容可能足以在文档中设置内容 -\thepage
用于页脚和目录,因此包含基于和的可扩展计算\initpage
。引入了\pagestep
附加内容以允许一个文档中有多个架构。pageschema
\documentclass{article}
\usepackage{xfp,regexpatch}
\usepackage{lipsum}% Just for this example
\usepackage[paper=a6paper]{geometry}% Just for this example
\newcounter{pageschema}\renewcommand{\thepageschema}{\alph{pageschema}}
\renewcommand{\thepage}{\fpeval{\initpage+\pagestep*(\value{page}-1)}}
\newcommand{\pagenumberingschema}[2]{%
\clearpage
\stepcounter{pageschema}% New page schema
\def\initpage{#1}% Store initial page value
\def\pagestep{#2}% Store page step
\setcounter{page}{1}% New page schema start
\ignorespaces
}
\AtBeginDocument{\pagenumberingschema{1}{1}}% Initialize page numbering schema
\usepackage{hyperref}
\makeatletter
% Update the hyperlink anchors to include page schema
\xpatchcmd*{\Hy@EveryPageAnchor}{page.}{page.\thepageschema.}{}{}
\makeatother
\sloppy% Just for this example
\begin{document}
\tableofcontents
\section{First page schema}
\lipsum[1-10]
\pagenumberingschema{7}{-3}
\section{Second page schema A}
\lipsum[1-20]
\section{Second page schema B}
\lipsum[21-40]
\section{Second page schema C}
\lipsum[41-50]
\pagenumberingschema{7}{17}
\section{Third page schema A}
\lipsum[1-20]
\section{Third page schema B}
\lipsum[21-40]
\section{Third page schema C}
\lipsum[41-50]
\end{document}
更新hyperref
页面锚点确保 PDF 链接正常。此外,强制\clearpage
作为 的一部分插入\pagenumberingschema
,这似乎是合乎逻辑的要求。
答案2
好问题。我假设设置就足够了,\thepage
因为它在引用中用到。它似乎至少在加载后有效hyperref
,但我没有对其进行更多测试(我对那部分有点不确定)。
\documentclass{article}
\makeatletter
\newcount\ncnt
\newcount\kcnt
\def\numberingschema#1#2{%{<initial value>}{<step>}
\ncnt=#1
\kcnt=#2
\c@page=0
}
\def\thepage{\@arabic{\numexpr \ncnt+\c@page*\kcnt\relax}}
\makeatother
\usepackage{hyperref}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{document}
\numberingschema{5}{-3}
\tableofcontents
\section{Just a section to separate from TOC}
See Section \ref{sec:2} on page \pageref{sec:2} or Section \ref{sec:2-2} on page \pageref{sec:2-2}
\newpage
\section{First section}
\label{sec:1}
\newpage
\section{Second section}
\label{sec:2}
\newpage
\section{Third section}
\label{sec:3}
\newpage
\section{Forth section}
\label{sec:4}
\newpage
%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\numberingschema{25}{17}
\section{Second First section}
\label{sec:2-1}
\newpage
\section{Second Second section}
\label{sec:2-2}
\newpage
\section{Second Third section}
\label{sec:2-3}
\newpage
\end{document}