
Gibt es einen Befehl, zum Beispiel so etwas wie \pages{pangolins}
---, der die Seitenzahlen (und Seitenbereiche) eines Indexeintrags „pangolins“ darstellt? Wenn nicht, gibt es eine elegante Möglichkeit, einen solchen Befehl zu codieren, mit oder ohne Verwendung vorhandener Indexpakete wie imakeidx?
Hier ist ein Minimalbeispiel für die Verwendung eines solchen Befehls:
\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}
Antwort1
Dies unterstützt auch Seitenbereiche und mehrere Seiten (Seitenbereiche sollten jedoch nicht mit Einzelverweisen vermischt werden). Es verwendet Barbara Beetons Idee in den Kommentaren zur Frage.
\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}
Man könnte automatisch „Seite“-„Seiten“-Präfixe hinzufügen, basierend auf dem in der Eigenschaftenliste gespeicherten Wert.
Es werden mehrere Indizes unterstützt, \readindex
für jeden sollte jedoch ein bestimmter Befehl verwendet werden: \readindex[<index name>]
, wobei der Name der Dateiname der entsprechenden .idx
Datei ist.
Antwort2
Angesichts der eherpräziseVersprechen, die Sie machen (nur ein Indexeintrag pro Element, nur eine Seitenreferenz usw.), können Sie den \index
Befehl einfach so ändern, dass er automatisch auch ein Etikett mit demselben Namen erstellt. Dann verwenden Sie einfach den normalen \pageref
Befehl, um darauf zu verweisen.
\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}
Antwort3
Und um die Antworten abzurunden: Beim Ausprobieren verschiedener Optionen bin ich auf eine vereinfachte Methode gestoßen, bei der bestimmte Wörter mit und gekennzeichnet \phantomsection
und \label
dann \pageref
bei Bedarf die Seitenzahl mit eingefügt wird:
\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}
Dies schien in den Fällen, die ich ausprobiert habe, zu funktionieren, aber ich habe nur ein begrenztes Verständnis davon, was hinter den Kulissen in LaTeX vor sich geht; dieser Ansatz könnte auf eine Art und Weise fehlerhaft sein, die mir nicht bewusst war. (Kritik ist erwünscht.)