压缩页面引用列表

压缩页面引用列表

我正在寻找一种纯 (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 图像上传怎么了?:(

相关内容