所谓“页边章序号导航”是指在书的页边(边注位置)显示当前页所在章的序号,通常也将此序号使用带底色的矩形或者半圆等修饰一下,便于读者快速定位章的范围,这对一些大部头的书籍尤其有用,如1所展示的效果。
在stackexchange中给出了一个基本的实现思路:
但是原始的实现对于带附录情况时总章数统计不对,下面是本人修正后的代码,供大家参考,代码中已经增加了一些注释以帮助理解执行的流程及其一些变化的方法。修正的主要内容为:
下一步需要进一步完善的地方为:
% see https://tex.stackexchange.com/questions/202450/show-current-chapter-number-on-each-page-margin-with-appendix
% 在\appendix之前执行\cleardoublepage
% 在页边显示章节序号
\usepackage[contents={},opacity=1,scale=1,color=white]{background}%将tikz对象置为页面的背景
\usepackage{tikzpagenodes}%定义了页面的text area/header/footer等node
\usepackage{totcount}%获取计数器的最大值
\usetikzlibrary{calc}
\usepackage{assoccnt}%创建辅助计数器和给定的计数器一起变化
\newif\ifMaterial
\definecolor{bgcolor}{rgb}{0,0,1}%页边色块底色
\newlength\LabelSize
\setlength\LabelSize{2cm}
% auxiliary counter
\newcounter{chapshift} %跟踪章序号的变化,即使\appendix之后也可以跟踪(默认的,\appendix会reset chapter counter)
\newtotcounter{totalchapters} %记录章的总数
\DeclareAssociatedCounters{chapter}{chapshift,totalchapters}
\AtBeginDocument{%
\ifnum\totvalue{totalchapters}>0\relax%防止初始没有章的时候报错
\setlength\LabelSize{\dimexpr\textheight/\totvalue{totalchapters}\relax}
\ifdim\LabelSize>2cm\relax%TODO没有考虑\LabelSize过小的情况?
\global\setlength\LabelSize{2cm}
\fi
\fi
}
\newcommand\AddLabels{%
\Materialtrue%
\AddEverypageHook{%
\ifMaterial%
\ifodd\value{page} %
\backgroundsetup{
angle=90,
position={current page.east|-current page text area.north east},
vshift=3pt,
hshift=-\thechapshift*\LabelSize+\LabelSize,%TODO是否可以根据hshift超出了\textheight来进行回退处理?可以有效解决\LabelSize过小的情形
contents={% 去掉circle/minimum size将画出矩形
\tikz\node[draw, circle,minimum size=\LabelSize, fill=bgcolor,anchor=west,text width=\LabelSize,
align=center,text height=15pt,text depth=23pt,font=\large\sffamily] {\thechapter};
}%
}
\else
\backgroundsetup{
angle=90,
position={current page.west|-current page text area.north west},
vshift=-3pt,
hshift=-\thechapshift*\LabelSize+\LabelSize,
contents={%
\tikz\node[draw, circle,minimum size=\LabelSize, fill=bgcolor,anchor=west,text width=\LabelSize,
align=center,text height=23pt,text depth=15pt,font=\large\sffamily] {\rotatebox{180}{\thechapter}};
}%
}
\fi
\BgMaterial%
\else\relax\fi}%
}
\AddLabels
\chapter{样例章节}
\newcommand\RemoveLabels{\Materialfalse}
将以上代码加到导言区之后,只需要在第一章的前面增加命令AddLabels即可,效果如1所示。 图 1: 章序号导航的效果示意