LaTeX技巧922:页边章序号导航的实现

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

2 用法

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

3 注意事项

  • 适合于双面印刷(twoside)大型书籍的排版,如果是简单的单面文件或者页码比较少的书籍意义不大。
  • 虽然在页边画出的是一个圆形,但是裁切完毕后就只剩下一个半圆了。
  • 在目录后面和附录前面使用\cleardoublepages命令清理一下,否则可能导致章序号的位置计算失误。
选自:http://softlab.sdut.edu.cn/blog/
分享到:
未经允许不得转载:LaTeX技巧922:页边章序号导航的实现
已有 条意见

    最新文章

    加载中...
      本站提供专业LaTeX排版、咨询、定制服务,请点击下图咨询详情


      全国首个精品的LaTeX视频教程,大牛带着你入门,让LaTeX学习不再纠结,请点击下图咨询详情

      热门评论

        联系我们

        交流QQ群:91940767
        本站QQ号:343083553
        邮箱联系latexstudio@qq.com
        淘宝店铺latexstudio.taobao.com 提供排版,模板定制,培训,图片处理,视频教程等LaTeX服务。

        关注微信公众号: latex2015

        如果您投稿或者希望加入我们团队,请发送您的简历到latexstudio@qq.com。

        科技艺术的完美融合,专业精致的排版体验

        联系我们联系我们