页边章序号导航的实现

实现原理

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

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

\newcommand\RemoveLabels{\Materialfalse}

用法

注意事项

0

发表评论

邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据