无论页码如何,都获取真实/实际的页码

无论页码如何,都获取真实/实际的页码

拥有具有不同页码的文档:罗马字母(i、ii 等)和阿拉伯字母(1、2 等)以及设置页码的章节\setcounter{page}{1}

尽管有编号,如何获取“真实/实际”页码?

在以下示例中,我们有两个罗马数字页面和两个各 2 页的章节。这是 6 个“实际/实际”页面。

i  -> 1
ii -> 2
1  -> 3
2  -> 4
1  -> 5
2  -> 6

更新 根据要求,MWE:

\documentclass{book}

\usepackage{lipsum}
\let\oldchapter\chapter
\renewcommand{\chapter}[1]{
    \oldchapter{#1}
    \par\noindent Page:~ \thepage
    \par\noindent Absolute:~ ??? % <- here I need the real/actual page
}

\begin{document}

\frontmatter
\chapter{Primus}
\par\lipsum
\chapter{Secundus}
\par\lipsum
\mainmatter
\chapter{First}
\par\lipsum
\chapter{Second}
\par\lipsum

\end{document}

答案1

请注意,由于异步分页,文本正文中的页数计数器(\thepage 和 totalpages)并不总是可靠的。直接放在 \chapter 后面应该可以工作。

\documentclass{book}

\usepackage{lipsum}
\let\oldchapter\chapter
\renewcommand{\chapter}[1]{
    \oldchapter{#1}
    \par\noindent Page:~ \thepage
    \par\noindent Absolute:~ \inteval{\value{totalpages}+1} % <- here I need the real/actual page
}

\begin{document}

\frontmatter
\chapter{Primus}
\par\lipsum
\chapter{Secundus}
\par\lipsum
\mainmatter
\chapter{First}
\par\lipsum
\chapter{Second}
\par\lipsum

\end{document}

答案2

在 OpTeX 中,我们可以使用。请注意,由于异步分页,文本正文中的\gpageno页码计数器(\pageno和)并不总是可靠的。直接在它后面应该可以工作。\gpageno\chap

\def\lipsum{\lorem[1-12]}
\let\printchap_ori=\_printchap
\def\_printchap#1{%
   \printchap_ori{#1}
   \par\noindent Page:~\folio
   \par\noindent Absolute:~\the\numexpr\gpageno+1\relax
   \par
}

\pageno=-1
\nonum\chap Primus
\lipsum
\nonum\chap Secundus
\lipsum
\vfil\break \pageno=1
\chap First
\lipsum
\chap Second
\lipsum

\bye

答案3

您想要添加钩子\mainmatter\chapter在辅助文件中添加注释。

\documentclass{book}
\usepackage[a6paper]{geometry} % just to get smaller pictures
\usepackage{lipsum}

\newwrite\qpdfcommands
\immediate\openout\qpdfcommands=\jobname-qpdf.commands

\newcommand{\getlastpagenumber}{%
  \inteval{\value{page}\ifodd\value{page}+1\fi}%
}

\AddToHook{cmd/mainmatter/before}{%
  \xdef\pagesinthefrontmatter{\getlastpagenumber}
}
\AddToHook{cmd/chapter/before}{%
  \ifnum\value{chapter}>0
    \immediate\write\qpdfcommands{%
      qpdf --empty --pages \jobname.pdf
      \inteval{\firstpageofprevious+\pagesinthefrontmatter}-%
      \inteval{\getlastpagenumber+\pagesinthefrontmatter}
      -- \jobname-\arabic{chapter}.pdf%
    }%
    \xdef\firstpageofprevious{\inteval{\getlastpagenumber+1}}%
  \else
    \gdef\firstpageofprevious{1}%
  \fi
}
\AtEndDocument{%
  \immediate\write\qpdfcommands{%
    qpdf --empty --pages \jobname.pdf
    \inteval{\firstpageofprevious+\pagesinthefrontmatter}-z
    -- \jobname-\arabic{chapter}.pdf%
  }%
  \immediate\closeout\qpdfcommands
}

\begin{document}

\huge

\frontmatter

This is page \thepage

\clearpage

This is page \thepage

\clearpage

This is page \thepage

\mainmatter

\chapter{First}

\lipsum[1-10]

\chapter{Second}

\lipsum[11-30]

\chapter{Third}

\lipsum[31-60]

\end{document}

尝试一下,你会发现写入的文件将包含

qpdf --empty --pages qpex.pdf 5-28 -- qpex-1.pdf
qpdf --empty --pages qpex.pdf 29-70 -- qpex-2.pdf
qpdf --empty --pages qpex.pdf 71-z -- qpex-3.pdf

我留下来练习如何应对\backmatter

相关内容