无缝使用 \label 和 \pageref 格式化页码

无缝使用 \label 和 \pageref 格式化页码

我有一份复杂的文档(实际上是一本书),其中有多种页码格式,这些页码基于书中的不同部分(罗马字母、阿拉伯字母,以及诸如 1*、[1] 和 <<1>> 之类的格式)。每个编号部分都从 1 重新开始,并以此格式进行区分。

目标是能够发出命令\label{item}并让稍后\pageref{item}提供格式化的页码。这些参考资料可能跨部门,因此我需要在页码编号的部分中获取像 3* 这样的参考资料,例如 [7]。

我之前问过两个关于索引的复杂问题,并找到了解决方案。然而,它们破坏了我使此引用起作用的方案。

我已经发出命令

\renewcommand{\thepage}{\arabic{page}*}

例如,在每个部分的开头。这既可以控制文档中页码的格式,也可以使\label和做我想要的事情,但由于 makdindex 拒绝允许非数字页码,所以\pageref不起作用- 直接写入 [1] 会破坏一切。\index

我可以使用 fancyhdr 轻松修复页脚中的页码。

我怎样才能\label编写格式化的页面引用,以便\pageref可以将其拉出来而不需要知道引用的项目来自哪个部分?

接下来是不起作用的 MWE。对于名称为“item”的页面引用,我希望\pageref返回 1*。对于名称为“this”的页面引用,我希望\pageref返回 [1]。

\documentclass[12pt,twoside,latin]{book}
\usepackage{fancyhdr}
\fancyhf{}
\fancyfoot[C]{\thepage*}
\pagestyle{fancy}

\begin{document}
This is an item.\label{item}
\newpage
You can read about {\itshape item\/} here: \pageref{item}.
\newpage
\setcounter{page}{1}
\fancyfoot[C]{[\thepage]}
You've read about {\itshape item\/} here: \pageref{item}.  But you should also read about this.\label{this}
\newpage
Have you read about {\itshape this\/} here: \pageref{this}.
\end{document}

答案1

事实证明,只需重新定义 \label 即可。我在文档中每个新部分的开头执行此操作,其中页码格式会发生变化。

\documentclass[12pt,twoside,latin]{book}
\usepackage{fancyhdr}
\usepackage{imakeidx}
\fancyhf{}
\fancyfoot[C]{\thepage*}
\pagestyle{fancy}

\begin{document}
\makeatletter
\renewcommand{\label}[1]{\@bsphack \protected@write \@auxout {}{\string \newlabel {#1}{{\@currentlabel }{\thepage* }}}\@esphack} 
\makeatother

This is an item.\label{item}
\newpage
You can read about {\itshape item\/} here: \pageref{item}.
\newpage
\setcounter{page}{1}
\fancyfoot[C]{[\thepage]}
\makeatletter
\renewcommand{\label}[1]{\@bsphack \protected@write \@auxout {}{\string \newlabel {#1}{{\@currentlabel }{[\thepage] }}}\@esphack} 
\makeatother
You've read about {\itshape item\/} here: \pageref{item}.  But you should also read about this.\label{this}
\newpage
Have you read about {\itshape this\/} here: \pageref{this}.

\end{document}

相关内容