我有兴趣在页脚放置一些进度标记,例如代表每个章节的(短)垂直线(标记),以及另一个标记来指示文档中的当前页面,其中的位置对应0.0\linewidth
于文档的开始,并且1.0\linewidth
是文档的结束。
因此,章节标记应该是固定的,即第一章标记在左侧某处,最后一章标记在右侧某处。页面标记应随着文档的进展从左向右移动。
有人可以给我指明正确的方向吗?因为每一页都有页脚,并且直到文档编译一次后才知道最后的章节,我不知道如何最好地保留这些信息,以便每个章节的标记都可以在每一页上呈现。
我没有任何 MWE,因为坦率地说,我不知道从哪里开始,但我真的很想将它包含在我的论文中。
以下是我所寻找内容的示意图:
答案1
您可以xassoccnt
预先使用并确定页数,然后使用从计算相对\fpeval
页码xfp
xassoccnt
相比之下, over的优点lastpage
在于重新设置页码不会影响总页码,并且它提供了一个可扩展的页码值\pageref
(当然,这可以通过\getpagerefnumber
fromrefcount
包来规避)。
请注意,需要运行两次才能提供正确的信息。第一次运行中,什么都没有绘制。
此相对页面进度以乘数形式给出\linewidth
,Ti钾在页脚中绘制 Z 矩形。
各个章节的程序非常相似。
\documentclass{book}
\usepackage{xfp}
\usepackage{blindtext}
\usepackage{tikz}
\usepackage{fancyhdr}
\usepackage{xassoccnt}
\NewDocumentCounter{pages}
\DeclareAssociatedCounters{page}{pages}
\DeclareTotalAssociatedCounters{page}{totalpages}
\newcommand{\pageprogress}{%
\ifnum\TotalValue{totalpages}>0
\begin{tikzpicture}
\draw[left color=yellow,right color=red,fill] (0,0) rectangle (\fpeval{\number\value{pages}/\TotalValue{totalpages}}\linewidth,0.5);
\end{tikzpicture}%
\fi
}
\renewcommand{\headrulewidth}{0pt}
\fancypagestyle{plain}{%
\fancyhf{}
\fancyfoot[L]{\pageprogress}
}
\begin{document}
\pagestyle{plain}
\blindtext[500]
\end{document}
更新
存储章节起始页并根据总页数计算它们的相对位置并为本地页码计数器放置标记。
注意:这还不是故障安全
\documentclass{book}
\usepackage{xfp}
\usepackage{blindtext}
\usepackage{tikz}
\usepackage{fancyhdr}
\usepackage{refcount}
\usepackage{xpatch}
\usepackage[redefinelabel=false]{xassoccnt}
\NewDocumentCounter{chapters,localpages}
\NewTotalDocumentCounter{totalpages}
\DeclareAssociatedCounters{chapter}{chapters}
\DeclareAssociatedCounters{page}{localpages,totalpages}
\DeclareTotalAssociatedCounters{chapter}{totalchapters}
\ExplSyntaxOn
\prop_new:N \l_nicolas_chapter_pages_prop
\cs_generate_variant:Nn \prop_put:Nnn {Nxx}
\cs_generate_variant:Nn \prop_item:Nn {Nx}
\cs_generate_variant:Nn \fp_set:Nn {Nx}
\cs_new:Npn \getchapterpage#1{%
\prop_item:Nn \l_nicolas_chapter_pages_prop {#1start}
}
\cs_new:Npn \storechapterallpages {%
\int_step_inline:nnnn {1}{1} {\TotalValue{totalchapters}}{%
\prop_put:Nxx \l_nicolas_chapter_pages_prop {##1} {\getpagerefnumber{autochapter::##1}}
}
\int_step_inline:nnnn {1}{1} {\TotalValue{totalchapters}}{%
% \int_set:Nx \l_tmpa_int {##1-1}
% \int_set:Nx \l_tmpb_int {##1+1}
\prop_put:Nxx \l_nicolas_chapter_pages_prop {##1start} {\fp_eval:n { (\prop_item:Nn \l_nicolas_chapter_pages_prop {##1}-1)/\TotalValue{totalpages}}}
}
}
\newcommand{\runinloop}[4]{%
\int_step_function:nnnN {#1} {#2} {#3} #4
}
\ExplSyntaxOff
\newcommand{\drawchapterruleandmarker}[1]{%
\draw[line width=1pt,blue] (\getchapterpage{#1}\linewidth,-3pt) -- (\getchapterpage{#1}\linewidth,5pt);
\node[below,inner sep=0pt] (chapter#1) at (\getchapterpage{#1}\linewidth,-5pt) {#1};
\shade[line width=1pt,red,ball color=red] (\fpeval{\number\value{localpages}/\TotalValue{totalpages}}\linewidth,2pt) circle (0.2);
}
\newcommand{\pageprogress}{%
\ifnum\TotalValue{totalchapters}>0
\begin{tikzpicture}%
\draw[line width=1pt,blue] (0,2pt) -- (\linewidth,2pt);%
\runinloop{1}{1}{\TotalValue{totalchapters}}{%
\drawchapterruleandmarker%
}%
\end{tikzpicture}%
\fi
}
\renewcommand{\headrulewidth}{0pt}
\fancypagestyle{plain}{%
\fancyhf{}
\fancyfoot[L]{\pageprogress}
}
\makeatletter
\AtBeginDocument{%
\xpatchcmd{\@chapter}{%
\refstepcounter{chapter}%
}{%
\refstepcounter{chapter}%
\label{autochapter::\number\value{chapters}}% Provide an automatic label
}{\typeout{Patch success}}{\typeout{Patch failure}}
\storechapterallpages%
}
\makeatother
\begin{document}
\pagestyle{plain}
\chapter{First}
\blindtext[20]
\chapter{Second}
\blindtext[40]
\chapter{Third}
\blindtext[100]
\chapter{Fourth}
\blindtext[10]
\chapter{Fifth}
\blindtext[50]
\clearpage
\end{document}