我正在寻找一种纯 (La)TeX 解决方案(可惜没有 LuaTeX)来压缩页面引用列表(用 给出\pageref
),就像cite.sty
引用一样;即“将三个或更多连续数字的列表压缩为一个数字范围”。这些数字已经排序,最多可以有四位数字。基本上就是 MakeIndex 所做的,但是是在 TeX 中。
输入应该像\pageref{foo}, \pageref{bar}, \pageref{foobar}, \pageref{quax}
(其中可以根据需要选择分隔符),输出应该像“1,2--4”。
答案1
最新版本(V0.18)cleveref
包含的内容\cpageref
,也\cpagerefrange
可用于引用页面范围。它尚未在 CTAN 上,因此对于下面的测试,我从Toby Cubitt 的网站:
\documentclass{book}
\usepackage{lipsum}
\usepackage{cleveref}% load last
\begin{document}
\chapter{One}
\section{One-One}\label{One-One}
\lipsum[1-4]\label{One-Two}
\chapter{Two}
\section{Two-One}\label{Two-One}
\section{Two-Two}\label{Two-Two}
\section{Two-Three}\label{Two-Three}
\chapter{Three}
\section{Three-One}\label{Three-One}
\lipsum[1-9]
\newpage
Section One-One is on Page~\pageref{One-One}\par
Section One-Two is on Page~\pageref{One-Two}\par
Section Two-One is on Page~\pageref{Two-One}\par
Section Two-Two is on Page~\pageref{Two-Two}\par
Section Two-Three is on Page~\pageref{Two-Three}\par
Section Three-One is on Page~\pageref{Three-One}\par
\bigskip
Using the \textbf{cleveref package (V0.18)}:\par
\bigskip
See \cpageref{One-One,One-Two,Three-One}\par
See \cpageref{One-One,One-Two,Two-One,Two-Two,Three-One}\par
See \cpagerefrange{One-One}{Three-One}\par
\end{document}
答案2
结果并不像我最初希望的那样漂亮,但似乎可以工作。它需要一个整数列表,并按照您描述的方式压缩它们。代码应该很容易理解,我不禁觉得应该可以做得更短,但是嘿。
\documentclass{article}
\makeatletter
\let\dotlessi\i
\newcount\last
\def\range#1{%
\last 0\relax
\def\temp{}
\def\first{}
\@for\i:=#1\do{%
\ifnum\the\last=0%start
\edef\temp{\i}%
\else%
\advance\last 1\relax%
\ifnum\last=\i%
\ifx\first\empty%
\let\@temp\temp%
\edef\temp{\@temp--}%
\def\first{x}%
\else%
\fi%
\else%
\ifx\first\empty%
\let\@temp\temp%
\let\j\i%
\edef\temp{\@temp,\j}
\else%
\advance\last -1\relax%
\let\@temp\temp%
\let\j\i%
\edef\temp{\@temp\the\last,\j}%
\fi%
\fi%
\fi%
\last \i\relax%
}%
[\temp]%
}
\makeatother
\let\i\dotlessi
\begin{document}
\noindent
Some test ranges\\
\range{1,2,3,4,7}\\
\range{1,3,5,7}\\
\range{1,3,4,5,7}\\
\range{}
\end{document}
输出结果如下:
PS:tex.sx 图像上传怎么了?:(