Существует ли команда, которая выдает номера страниц записи указателя?

Существует ли команда, которая выдает номера страниц записи указателя?

Есть ли команда --- например, что-то вроде \pages{pangolins}--- которая представляет номера страниц (и диапазоны страниц) индексной записи "pangolins"? Если нет, есть ли элегантный способ закодировать такую ​​команду, с использованием или без использования существующих индексных пакетов, таких как imakeidx?

Вот минимальный пример того, как можно использовать такую ​​команду:

\documentclass{book}

\usepackage{imakeidx}
\makeindex

\begin{document}

Here is a paragraph about pangolins\index{pangolins}.  Pangolins are the only mammals covered in scales.

Here is a paragraph about meerkats.  Meerkats are immune to the venom of scorpions and snakes.

Here is another paragraph about pangolins.  A single pangolin can consume 20,000 ants per day.  If you want to learn more about pangolins, see page \pages{pangolins}.

\end{document}

решение1

Это также поддерживает диапазоны страниц и несколько страниц (но диапазоны страниц не должны смешиваться с одиночными ссылками). Это использует идею Барбары Битон в комментариях к вопросу.

\documentclass{book}
\usepackage{imakeidx}
\usepackage{xparse}

\usepackage{lipsum}

\ExplSyntaxOn
\NewDocumentCommand{\readindex}{O{\c_sys_jobname_str}}
 {
  \group_begin:
  \cs_set_eq:NN \indexentry \readindexentry
  \file_if_exist_input:n { #1.idx }
  \group_end:
 }

\NewDocumentCommand{\pages}{m}
 {
  \prop_item:Nn \g_readindex_prop { #1 }
 }

\NewDocumentCommand{\readindexentry}{>{\SplitArgument{1}{|}}m m}
 {
  \readindex_process:nnn #1 { #2 }
 }

\prop_new:N \g_readindex_prop

\cs_new_protected:Nn \readindex_process:nnn
 {
  \str_case:nnF { #2 }
   {
    { ( }{ \readindex_start:nn { #1 } { #3 } }
    { ) }{ \readindex_end:nn   { #1 } { #3 } }
   }
   { \readindex_standard:nn { #1 } { #3 } }
 }

\cs_new_protected:Nn \readindex_standard:nn
 {
  \prop_if_in:NnTF \g_readindex_prop { #1 }
   {
    \prop_gput:Nnx \g_readindex_prop { #1 }
     { \prop_item:Nn \g_readindex_prop { #1 } , ~ #2 }
   }
   {
    \prop_gput:Nnn \g_readindex_prop { #1 } { #2 }
   }
 }

\cs_new_protected:Nn \readindex_start:nn
 {
  \prop_gput:Nnn \g_readindex_prop { #1 } { #2 }
 }
\cs_new_protected:Nn \readindex_end:nn
 {
  \prop_gput:Nnx \g_readindex_prop { #1 }
   { \prop_item:Nn \g_readindex_prop { #1 } -- #2 }
 }

\ExplSyntaxOff

\readindex
\makeindex % must be ***after*** \readindex

\begin{document}

For elephants, see \pages{elephants}.

Here we also talk about unicorns\index{unicorns}, treated on \pages{unicorns}.

Here is a paragraph about pangolins\index{pangolins}.  
Pangolins are the only mammals covered in scales.

Here is a paragraph about meerkats.  Meerkats are immune to 
the venom of scorpions and snakes.

Here is another paragraph about pangolins.  A single pangolin 
can consume 20,000 ants per day.  If you want to learn more about 
pangolins, see page \pages{pangolins}.

Now we talk about elephants\index{elephants|(}
\lipsum[1-10]
End of elephant talk\index{elephants|)}.

Again a unicorn\index{unicorns}.

\end{document}

введите описание изображения здесь

Можно добавить автоматические префиксы «страница»-«страницы» на основе значения, хранящегося в списке свойств.

Поддерживается несколько индексов, но \readindexдля каждого из них следует использовать определенную команду: \readindex[<index name>], где имя — это имя соответствующего .idxфайла.

решение2

Учитывая довольноточныйобещания, которые вы даете (только одна запись индекса на элемент, только одна ссылка на страницу и т. д.), вы можете просто изменить команду \indexтак, чтобы она автоматически создавала метку с тем же именем. Затем вы просто используете обычную \pagerefкоманду для перекрестной ссылки на нее.

\documentclass{article}
\usepackage{makeidx}

\makeatletter
\def\@wrindex#1{%
\protected@write\@indexfile{}%
{\string\indexentry{#1}{\thepage}}%
\protected@write\@auxout{}%
{\string\newlabel{#1}{{\@currentlabel}{\thepage}}}%
\endgroup
\@esphack}
\makeatother

\makeindex

\begin{document}


If \index{pangolins} are referred to here, we can wait a little while and then

\clearpage


Refer to the place (\pageref{pangolins}) where we previously referred to them!

\printindex

\end{document}

решение3

И чтобы завершить ответы, при попытке перебрать различные варианты был разработан простой метод: помечать определенные слова с помощью \phantomsectionи , \labelа затем использовать \pagerefдля указания номера страницы там, где это необходимо:

\documentclass{book}

\newcommand{\ps}{\phantomsection}

\begin{document}

Here is a paragraph about {\ps}pangolins\label{pangolins}.

Here is another paragraph about pangolins.  If you want to learn more about pangolins, see page \pageref{pangolins}.

\end{document}

Похоже, это сработало в тех случаях, которые я пробовал, но у меня ограниченное понимание того, что происходит за кулисами LaTeX; этот подход может иметь недостатки, которые я не оценил. (Критика приветствуется.)

Связанный контент