
¿Existe un comando, por ejemplo, algo como \pages{pangolins}
--- que represente los números de página (y rangos de páginas) de una entrada de índice "pangolines"? Si no es así, ¿existe alguna forma elegante de codificar dicho comando, con o sin el uso de paquetes de índice existentes como imakeidx?
A continuación se muestra un ejemplo mínimo de cómo se podría utilizar dicho comando:
\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}
Respuesta1
Esto también admite rangos de páginas y varias páginas (pero los rangos de páginas no deben mezclarse con referencias únicas). Utiliza la idea de Barbara Beeton en los comentarios a la pregunta.
\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}
Se podrían agregar prefijos automáticos "página" - "páginas" según el valor almacenado en la lista de propiedades.
Se admiten varios índices, pero \readindex
se debe utilizar un comando específico para cada uno: \readindex[<index name>]
, donde nombre es el nombre del archivo correspondiente .idx
.
Respuesta2
Dado el bastanteprecisopromesas que hace (solo una entrada de índice por elemento, solo una referencia de página, etc.), puede modificar el \index
comando para que también cree automáticamente una etiqueta con el mismo nombre. Luego simplemente usa el \pageref
comando ordinario para hacer una referencia 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}
Respuesta3
Y solo para completar las respuestas, un método simplista que surgió al probar varias opciones fue etiquetar palabras particulares usando \phantomsection
y \label
y luego usar \pageref
para colocar el número de página donde fuera necesario:
\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}
Esto pareció funcionar en los casos que probé, pero tengo una comprensión limitada de lo que sucede detrás de escena en LaTeX; Este enfoque puede tener fallas que no he apreciado. (Se alientan las críticas).