页边章序号导航的实现

发布于 2023-02-14 08:41:43

所谓“页边章序号导航”是指在书的页边(边注位置)显示当前页所在章的序号,通常也将此序号使用带底色的矩形或者半圆等修饰一下,便于读者快速定位章的范围,这对一些大部头的书籍尤其有用,如1所展示的效果。

1 实现原理

stackexchange中给出了一个基本的实现思路:

  1. 首先借助于totcount宏包获取图书总的章数。
  2. 借助于assoccnt解决了附录会重置章序号问题。
  3. 使用background宏包将一个矩形或者任意的其他图形作为背景放置到页边。

但是原始的实现对于带附录情况时总章数统计不对,下面是本人修正后的代码,供大家参考,代码中已经增加了一些注释以帮助理解执行的流程及其一些变化的方法。修正的主要内容为:

  • 修复了带附录时总章数统计不读的问题。
  • 将矩形底色框修改为圆形底色框,似乎更为美观。

下一步需要进一步完善的地方为:

  • 如果书籍的章数很多,比如超过20章,则章序号线性排列就不太合适了,最好能够设计一个最小章序号宽度的阀值,如果小于这个阀值则考虑更好的算法,比如折回的排列方式。
  • vshift的计算应该根据marginparsep和marginparwidth自动确定。
% 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}

img

2 用法

将以上代码加到导言区之后,只需要在第一章的前面增加命令AddLabels即可,效果如1所示。 图 1: 章序号导航的效果示意

3 注意事项

  • 适合于双面印刷(twoside)大型书籍的排版,如果是简单的单面文件或者页码比较少的书籍意义不大。
  • 虽然在页边画出的是一个圆形,但是裁切完毕后就只剩下一个半圆了。
  • 在目录后面和附录前面使用cleardoublepages命令清理一下,否则可能导致章序号的位置计算失误。

选自:http://softlab.sdut.edu.cn/blog/

0 条评论

发布
问题