Existe um comando que fornece os números das páginas de uma entrada de índice?

Existe um comando que fornece os números das páginas de uma entrada de índice?

Existe um comando --- por exemplo, algo como \pages{pangolins}--- que representa os números das páginas (e intervalos de páginas) de uma entrada de índice "pangolins"? Caso contrário, existe alguma maneira elegante de codificar tal comando, com ou sem o uso de pacotes de índice existentes como imakeidx?

Aqui está um exemplo mínimo de como tal comando pode ser usado:

\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}

Responder1

Isso suporta também intervalos de páginas e também múltiplas páginas (mas os intervalos de páginas não devem ser misturados com referências únicas). Ele usa a ideia de Barbara Beeton nos comentários à questão.

\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}

insira a descrição da imagem aqui

Poderíamos adicionar prefixos automáticos de “página”-“páginas” com base no valor armazenado na lista de propriedades.

Vários índices são suportados, mas um \readindexcomando específico deve ser usado para cada um: \readindex[<index name>], onde o nome é o nome do .idxarquivo correspondente.

Responder2

Dado o bastanteprecisopromessas que você faz (apenas uma entrada de índice por item, apenas uma referência de página, etc.), você pode simplesmente alterar o \indexcomando para que ele crie automaticamente um rótulo com o mesmo nome também. Então você apenas usa o \pagerefcomando comum para fazer referência cruzada.

\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}

Responder3

E só para completar as respostas, um método simplista que surgiu ao tentar várias opções foi rotular palavras específicas usando \phantomsectione \labele depois usar \pagerefpara colocar o número da página onde necessário:

\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}

Isso pareceu funcionar nos casos que tentei, mas tenho uma compreensão limitada do que está acontecendo nos bastidores do LaTeX; essa abordagem pode apresentar falhas de maneiras que não apreciei. (Críticas encorajadas.)

informação relacionada