Index, der Beispielnummern und nicht Seitenzahlen aufgreift

Index, der Beispielnummern und nicht Seitenzahlen aufgreift

Ich erstelle einige linguistische Texte mit Erläuterungen in einer indianischen Sprache. Die Sätze sind beispielsweise als (2.3) gekennzeichnet, was „Text 2, Satz 3“ bedeutet, und ich möchte, dass der Index diese Zahlen und nicht die Seitenzahlen aufgreift. In Bezug auf das folgende Bild hätte ich gerne:

Bratwurst, (2.1)

Sauerkraut, (2.2)

im Gegensatz zu dem, was gezeigt wird (Bratwurst, 2; Sauerkraut, 2).

Wie kann ich das erreichen?

Bildbeschreibung hier eingeben

Für die Beispielzahlen verwende ich eine Version von Expex. Sie ist zu lang, um sie hier einzufügen, aber ich kann sie per E-Mail an alle Interessierten senden.


*Erläuterung. Ich weiß, wie man Beispiele beschriftet (indem man z. B. <label>nach \ex) und wie man Beschriftungen an einer späteren Stelle aufruft ( \getref{label}). In dieser Frage geht es jedoch nicht um die Beschriftung von Beispielen: Ich möchte nicht manuell verlinken müssenKohlzu, sagen wir, \getref{Sauerkraut}, \getref{Kohl}, \getref{Wirsing}. Ich möchte hiermit makeindexeinen Index erstellen, der Beispielnummern statt Seitenzahlen auflistet.


\documentclass{report} 
\usepackage{expex-x2} 
\usepackage{expexchapno}

\lingset{aboveexskip=0pt,glspace=1em plus .5em minus.2em,   
glrightskip=0pt plus 8em,aboveglftskip=0pt,glneveryline={\it},   
glstyle=nlevel,everygl={\hangindent=1.2em \hangafter=1},   
exnotype=chapter.arabic}

\usepackage{makeidx}     
\makeindex

\begin{document}     

\gathertags

\chapter{First chapter}

\chapter{Second chapter}

\ex Bratwurst --- this example is followed by \verb"\index{Bratwurst}"
\xe \index{Bratwurst} 

\ex Sauerkraut --- this example is followed by
\verb"\index{Sauerkraut}" \xe \index{Sauerkraut}

\printindex
\end{document}

Antwort1

Längerer Beitrag

Bitte erlauben Sie mir, meine Erkenntnisse mit Ihnen zu teilen. Ich habe meine Antwort in drei Teile unterteilt: kein Verkehr, Einwegverkehr und Zweiwegverkehr, wobei jeder Teil eine eigene kompilierbare TeX-Datei ergibt.

Ich habe benutztXindyWeilIndex erstellenist für nicht-englische Sprachen eher begrenzt. Andererseits verwende ich ziemlich altemakeidxPaket, aber ich würde empfehlen, dieimakeidxPaket, weil wir im letzten Teil einen I/O-Schreibslot einsparen konnten. Ich wollte Methoden vergleichen, die ich so verwendet habe.

Ich verwende lualatexzur Verarbeitung der TeX-Dateien, latexes kann aber jede gängige Engine verwendet werden.


Kein Transport: Anmerkungen zur mal-expex-1.texAkte

Wie bereits erwähnt, können wir es neu definieren, \@wrindexda es sich um den Schlüsselteil handelt, der vom \indexBefehl aufgerufen wird. Wir können die Informationen direkt speichern, indem wir aufrufen \ep@rawexnoprint, siehe Zeile 19 in der ersten Datei. Das ist der Befehl, denexpexPaket verwendet, um Informationen zu speichern.

Das nächste Problem ist, wie der Indexprozessor über den Nummernpunktnummernstandort informiert wird. Xindy verwendet zu diesem Zweck die Standortklasse, es verwendet mehrere davon und wir können eine neue erstellen. Dies kann erreicht werden, indem define-location-classwir zusätzlich die Begleitklasse markup-locreffür diese neue Klasse definieren und zusätzlich Klammern hinzufügen. Der letzte Schritt wäre, die Reihenfolge der neuen Standortklassen zu definieren. Mit Ihrer Erlaubnis werde ich Ihnen später zeigen, wie dies getan werden kann.

Wir rennen:

lualatex mal-expex-1.tex
xindy -M texindy -M expex-1 -L general -C utf8 mal-expex-1.idx
lualatex mal-expex-1.tex

Der Inhalt der mal-expex-1.idxDatei ist wie folgt:

\indexentry{Bratwurst}{2.1}
\indexentry{Sauerkraut}{2.2}
\indexentry{Striz}{2.3}
\indexentry{Oldman}{2.4}
\indexentry{Sauerkraut}{2.5}

Ich füge den TeX-Code und eine Vorschau von drei zugeschnittenen Seiten bei. Wie wir auf der letzten Seite sehen können, ist dies das angeforderte Formular, aberHouston, wir haben ein Problem!Wenn wir eine anklickbare Version unseres Dokuments möchten, funktionieren die Indexquerverweise nicht.

% run: *latex mal-expex-1.tex
\documentclass{report}
\pagestyle{empty}
\usepackage{expex}
\lingset{aboveexskip=0pt,glspace=1em plus .5em minus.2em,   
glrightskip=0pt plus 8em,aboveglftskip=0pt,glneveryline={\it},   
glstyle=nlevel,everygl={\hangindent=1.2em \hangafter=1},   
exnotype=chapter.arabic}
\usepackage{makeidx}    
\makeindex
\usepackage{filecontents}
\begin{filecontents*}{expex-1.xdy}
;; expex-1.xdy
(define-location-class "expexnumber" ("arabic-numbers" :sep "." "arabic-numbers"))
(markup-locref :open "(" :close ")" :class "expexnumber")
\end{filecontents*}
\makeatletter
\def\@wrindex#1{%
   \protected@write\@indexfile{}%
      {\string\indexentry{#1}{\ep@rawexnoprint}}%
 \endgroup
 \@esphack#1%
}%End of \def\@wrindex...
\makeatother

\begin{document}    
%\gathertags
\chapter{First chapter}
Some initial text.
\chapter{Second chapter}
The first approach.
\ex Bratwurst --- this example is followed by \index{Bratwurst} \xe
\ex Sauerkraut --- this example is followed by \index{Sauerkraut} \xe
\ex By \index{Striz} \xe
\ex By \index{Oldman} \xe
\ex Again \index{Sauerkraut} \xe
%\begingroup
%\def\thispagestyle#1{}%
\printindex
%\endgroup
\end{document}

mwe, Teil 1: kein Verkehr


Einbahnverkehr: Anmerkungen zur mal-expex-2.texAkte

Nun, ich habe die Büchse der Pandora bereits geöffnet. Lassen Sie mich Ihnen mitteilen, wie wir unsere Seelen retten können. Dieses große Problem bringt mich dazu, diehyperrefPaket und erkunden Sie unsere weiteren Möglichkeiten.

Die Idee war, reguläre Querverweise zu verwenden, wie wir sie von \label+ \ref+ \pageref-Kombinationen kennen, unabhängig davon, was an der Indexstelle der Indexeinträge gesetzt wird.

Ich habe das neu definiert \@wrindex, hinzugefügt |myhyperlink{\ep@rawexnoprint}, was uns hilft, die Ausgabe zu steuern. Der wichtigste Schritt war das Hinzufügen \label{\ep@rawexnoprint}#1zu diesem Befehl. Es speichert Referenzinformationen und druckt die Referenz für uns aus, sodass wir sie nicht zweimal eingeben müssen.

Wir benachrichtigen den Indexprozessor über einen neuen Befehl define-attributesund definieren eine neue Klasse wie im ersten Beispiel. Das Ergebnis unserer Bemühungen ist, dass die Zahl anklickbar ist, die Klammern jedoch nicht.

Es gibt ein kleines Problemhyperrefdefiniert Befehle neu, sodass sie anklickbar sind, uns aber auf die Seite und nicht zu der Zeile führen, in der \indexder Befehl aufgerufen wurde. Wenn wir die mal-expex-2.auxDatei genauer untersuchen, können wir sehen, was passiert:

\newlabel{2.1}{{1}{2}{Second chapter}{chapter.2}{}}

Es speicherte alle notwendigen Informationen, führt aber zum zweiten Kapitel. Das ist nicht das beste Ergebnis, das wir hier erreichen können, da der Titel selbst mehrere Seiten früher gesetzt werden könnte als derexpexBeispiele. Nun, wir haben einige Verbesserungen. Wir erhalten Fehlermeldungen vonxindyüber nicht vorhandene Querverweisziele, aber wir können sie ignorieren, wir verwalten diesen Teil selbst.

Wir betreiben diese drei Linien:

lualatex mal-expex-2.tex
xindy -M texindy -M expex-2 -L general -C utf8 mal-expex-2.idx
lualatex mal-expex-2.tex

Der Inhalt der mal-expex-2.idxDatei ist dieser:

\indexentry{Bratwurst|myhyperlink{2.1}}{2.1}
\indexentry{Sauerkraut|myhyperlink{2.2}}{2.2}
\indexentry{Striz|myhyperlink{2.3}}{2.3}
\indexentry{Oldman|myhyperlink{2.4}}{2.4}
\indexentry{Sauerkraut|myhyperlink{2.5}}{2.5} 

Ich füge den TeX-Code und eine Vorschau des Ergebnisses bei.

% run: *latex mal-expex-2.tex
\documentclass{report}
\pagestyle{empty}
\usepackage{expex}
\lingset{aboveexskip=0pt,glspace=1em plus .5em minus.2em,   
glrightskip=0pt plus 8em,aboveglftskip=0pt,glneveryline={\it},   
glstyle=nlevel,everygl={\hangindent=1.2em \hangafter=1},   
exnotype=chapter.arabic}
\usepackage{makeidx}    
\makeindex
\usepackage[colorlinks]{hyperref}
\usepackage{filecontents}
\begin{filecontents*}{expex-2.xdy}
;; expex-2.xdy
(define-attributes (("default" "textbf" "textit" "myhyperlink")))
(define-crossref-class "myhyperlink")
(markup-crossref-list :class "myhyperlink" :sep ",\,")
(markup-crossref-layer :open "(\myhyperlink{" :close "})" :class "myhyperlink")
\end{filecontents*}
\def\myhyperlink#1{\hyperref[#1]{#1}}
\makeatletter
\def\@wrindex#1{%
   \protected@write\@indexfile{}%
      {\string\indexentry{#1|myhyperlink{\ep@rawexnoprint}}{\ep@rawexnoprint}}%
 \endgroup
 \@esphack\label{\ep@rawexnoprint}#1}%
\makeatother%End of \def\@wrindex...

\begin{document}    
%\gathertags
\chapter{First chapter}
Some initial text.
\chapter{Second chapter}
The first approach.
\ex Bratwurst --- this example is followed by \index{Bratwurst} \xe
\ex Sauerkraut --- this example is followed by \index{Sauerkraut} \xe
\ex By \index{Striz} \xe
\ex By \index{Oldman} \xe
\ex Again \index{Sauerkraut} \xe
%\begingroup
%\def\thispagestyle#1{}%
\printindex
%\endgroup
\end{document}

mwe, Teil 2: Einbahnstraßenverkehr


Gegenseitiger Verkehr: Anmerkungen zur mal-expex-3.texAkte

Sobald wir etwas verbessern können, werden wir es tun. Wir möchten eine anklickbare Version des Dokuments mit Querverweisen haben, die zu den richtigen Stellen führen. Darüber hinaus können wir versuchen, Querverweise aus beiden Richtungen zu haben. Vom \indexzum Index und von Indexeinträgen im Index zurück zu den \indexGegenstücken. Wir müssen bedenken, dass Indexeinträge gruppiert sind und wir im Allgemeinen einige Hyperlinks im Index verlieren könnten.

Dafür habe ich einige \hypertargetund \hyperlinkBefehle verwendet und dabei sichergestellt, dass sie eindeutige Markierungen erhalten, siehe Zeilen 40-47 im Code unten. Es handelt sich um eine korrigierte Version, die an den ursprünglichen Speicherort zurückgeht, aber keinen Weg zurück führt. Konzentrieren wir uns auf diese Funktion.

Ich habe für die nächsten Experimente eine neue Datei vorbereitet, um sie idxfür diesen Beitrag von der normalen Datei zu trennen. Ich werde myidie Erweiterung (spiegelt die idxDatei wider) und iymdie Erweiterung (spiegelt die indDatei wider) verwenden.

Der Kern dieser Methode besteht darin, \hypertargetund \hyperlinkzweimal zu verwenden: ein Paar behandelt die eine Richtung, das andere Paar behandelt den Rückweg. Bitte sehen Sie sich die Zeilen 50-65 im Code an. Ich musste verwenden, \raiseboxum den Standort von der linken Grundlinie der Box zur linken oberen Ecke zu erhalten.

Ich habe auch einen neuen Befehlssatz für den regelmäßigen Gebrauch vorbereitet. Wir können Seitenzahlen speichern (es ist eine gängige Methode; einfache arabische Zahlen), wir können die Anzahl derexpexBeispiel (arabische Zahl Punkt arabische Zahl in Klammern) und Kapitelnummer (arabische Zahl in Klammern). Mit diesem Ansatz, siehe Zeilen 68-70, können wir dort fast alles speichern.

Das Einzige, was wir noch tun müssen, ist,xindyüber all das. Lassen Sie uns unsere xdyStildatei erweitern, siehe Zeilen 20-36 im TeX-Code.

Um uns die Arbeit zu erleichtern, habe ich noch eine weitere Verbesserung vorgenommen. Ich habe die \ex...\xeAnweisungen in die Form von umdefiniert \ex..., indem ich einfach das Zeilenende ( ^^M) als Befehl definiert und es anschließend verwendet habe. Dieser Schritt ist in der Produktion natürlich nicht notwendig, ich wollte Ihnen nur zeigen, dass es möglich ist und wir uns das Eintippen von sparen können \xe.

Wir betreiben folgende vier Linien:

lualatex mal-expex-3.tex
xindy -M texindy -M expex-3 -L general -C utf8 -o mal-expex-3.ind mal-expex-3.idx
xindy -M texindy -M expex-3 -L general -C utf8 -o mal-expex-3.iym mal-expex-3.myi
lualatex mal-expex-3.tex

Der Inhalt der mal-expex-3.idxDatei ist derselbe wie im zweiten Teil, da wir Befehle auf TeX-Ebene neu definiert haben. Der Inhalt der mal-expex-3.myiDatei ist für uns etwas Neues und sieht folgendermaßen aus:

\indexentry{on purpose|malchapter{2-2-1}}{2}
\indexentry{paja|malpage{2-2-2}}{2}
\indexentry{malipivo|malpage{2-2-3}}{2}
\indexentry{next a|malexpex{2.8-2-4}}{2}
\indexentry{more a|malexpex{2.9-2-5}}{2}
\indexentry{next b|malchapter{2-2-6}}{2}
\indexentry{more b|malchapter{2-2-7}}{2}
\indexentry{paja|malexpex{2.12-2-8}}{2}
\indexentry{paja|malchapter{2-2-9}}{2} 

Anbei das letzte Beispiel und eine Vorschau unserer Bemühungen.

% run: *latex mal-expex-3.tex
\documentclass{report}
\pagestyle{empty}
\usepackage{expex}
\lingset{aboveexskip=0pt,glspace=1em plus .5em minus.2em,   
glrightskip=0pt plus 8em,aboveglftskip=0pt,glneveryline={\it},   
glstyle=nlevel,everygl={\hangindent=1.2em \hangafter=1},   
exnotype=chapter.arabic}
\usepackage{makeidx}    
\makeindex
\usepackage[colorlinks=true]{hyperref}

\usepackage{filecontents}
\begin{filecontents*}{expex-3.xdy}
;; expex-3.xdy
(define-location-class "expexnumber" ("arabic-numbers" :sep "." "arabic-numbers"))
(define-location-class "expexchapter" ("arabic-numbers" :sep "."))
(define-location-class-order ("expexnumber" "expexchapter" "arabic-numbers"))

(define-attributes (("malpage" "malexpex" "malchapter" "myhyperlink")))

(define-crossref-class "myhyperlink")
(markup-crossref-list :class "myhyperlink" :sep ",\,")
(markup-crossref-list :open "(\myhyperlink{" :close "})" :class "myhyperlink")

(define-crossref-class "malpage")
(markup-crossref-list :class "malpage" :sep ",\,")
(markup-crossref-layer :open "\myhyper{" :close "}" :class "malpage")

(define-crossref-class "malexpex")
(markup-crossref-list :class "malexpex" :sep ",\,")
(markup-crossref-layer :open "(\myhyper{" :close "})" :class "malexpex")

(define-crossref-class "malchapter")
(markup-crossref-list :class "malchapter" :sep ",\,")
(markup-crossref-layer :open "[\myhyper{" :close "}]" :class "malchapter")
\end{filecontents*}

% Redefinition in common index... (one-way approach)
\def\myhyperlink#1{\hyperlink{#1}{#1}}
\makeatletter
\def\@wrindex#1{%
   \protected@write\@indexfile{}%
      {\string\indexentry{#1|myhyperlink{\ep@rawexnoprint}}{\ep@rawexnoprint}}%
 \endgroup
 \@esphack\raisebox{\baselineskip}[0pt][0pt]{\hypertarget{\ep@rawexnoprint}{\raisebox{-\baselineskip}[0pt][0pt]{#1}}}}%
\makeatother

% A new index file...
\makeatletter
\let\temphere=\ep@rawexnoprint
\makeatother
\newwrite\myindexfile
\immediate\openout\myindexfile=\jobname.myi
\def\myhyper#1{\myhypertemp #1 }
\def\myhypertemp #1-#2-#3 {\hyperlink{#3}{\raisebox{\baselineskip}[0pt][0pt]{\hypertarget{#3-to-index}}#1}}
% Two-way approach...
\newcount\mycounter 
\mycounter=0
\def\myshipping#1#2{%
  \global\advance\mycounter by 1%
  \raisebox{\baselineskip}[0pt][0pt]{\hypertarget{\the\mycounter}{}}%
  \hyperlink{\the\mycounter-to-index}{#1}%
  \immediate\write\myindexfile{\string\indexentry{#1|\material{#2-\thepage-\the\mycounter}}{\thepage}}%
  }% End of \myshipping...

% Regular definitions to be used in document body...
\def\pageindex#1{\def\material{malpage}\myshipping{#1}{\thepage}}
\def\expexindex#1{\def\material{malexpex}\myshipping{#1}{\temphere}}
\def\chapterindex#1{\def\material{malchapter}\myshipping{#1}{\thechapter}}

\begin{document}
% The form of \ex...\xe rewritten to the form of \ex... only
% We are hacking the end of the line...
\catcode`\^^M=13
\def^^M{\par}
\let\extemp=\ex
\def\ex#1^^M{\extemp#1\xe}

%\gathertags
\chapter{First chapter}
Some initial text.

\chapter{Second chapter}
The first approach.

\ex Bratwurst --- this example is followed by \index{Bratwurst} 
\ex Sauerkraut --- this example is followed by \index{Sauerkraut}
\ex By \index{Striz}
\ex By \index{Oldman}

\ex an experiment \chapterindex{on purpose}
\ex hello 1 \pageindex{paja}
\ex hello 2 \pageindex{malipivo}
\ex hello 3 \expexindex{next a}
\ex hello 4 \expexindex{more a}
\ex hello 5 \chapterindex{next b}
\ex hello 6 \chapterindex{more b}
\ex hello 7 \expexindex{paja}
\ex hello 8 \chapterindex{paja}
\ex finish \index{Sleep}

% A common index...
%\begingroup % Redefinition of \indexname...
%\def\thispagestyle#1{}%
\def\indexname{Common index\\ with example numbers\\(one-way traffic)}
\printindex

% An improved version of index...
\def\indexname{Index of\\ page, (exercise), [chapter]\\(two-way traffic)}
\immediate\closeout\myindexfile
\IfFileExists{\jobname.iym}{\input \jobname.iym}{}%
%\endgroup
\end{document}

mwe, Teil 3: Gegenverkehr

Antwort2

Ich wollte eine Lösung posten, die auf das Gleiche hinausläuft, aber vielleicht ein bisschen einfacher ist. Sie verwendet das indexPaket. Sie können anweisen index, ein bestimmtes Makro (unten \PageExample) zu verwenden, um eine Referenz im Index zu generieren. Unten habe ich es so konfiguriert, dass Einträge im Format „Seitenbeispiel“ (z. B. 2-7) gedruckt werden. Ein anderes Format wird unten erläutert.

\documentclass{book}
\usepackage{expex,lipsum,index}
% use this definition if using makeindex
\newcommand{\PageExample}{\thepage-\the\excnt}
% use this definition if using xindy
% \newcommand{\PageExample}{\thepage (\the\excnt)}
\newindex[PageExample]{my-index}{idx}{ind}{My Custom Index}
\makeindex
\begin{document}
\ex \lipsum[1]\index[my-index]{First example} \xe

\ex \lipsum[2] \index[my-index]{Second example}\xe

\ex \lipsum[3] \index[my-index]{Third example}\xe

\ex \lipsum[4] \index[my-index]{Fourth example}\xe

\ex \lipsum[5] \index[my-index]{Fifth example}\xe

\ex \lipsum[6] \index[my-index]{Sixth example}\xe

\ex \lipsum[6] \index[my-index]{Seventh example}\xe

\printindex[my-index]
\end{document}

Die in den Indexverweisen vorkommende Interpunktion ist durch begrenzt makeindex. Wenn Sie mit dem Format „2-7“ zufrieden sind, funktioniert das obige Beispiel perfekt.

Wenn Sie xindyzur Verarbeitung des Indexes verwenden, gibt es mehr Flexibilität. Ich wollte Referenzen wie diese „Seitenzahl (Beispielzahl)“, also 2(7). Das lässt sich mit der alternativen Definition von \PageExampleoben leicht generieren, aber die Indexdatei muss dann von verarbeitet werden xindy.

Nach dem Kompilieren mit latexrufe ich xindywie folgt auf:

texindy -L english example.idx -M page-example.xdy

Die Datei page-example.xdyenthält Anweisungen xindyzu meinem Format „Seitenzahl (Beispielzahl)“. Sie enthält nur eine Zeile:

(define-location-class "page-example" ("arabic-numbers" :sep "(" "arabic-numbers" :sep ")" ))

Antwort3

Aus den unten genannten Gründen erwies sich das Ändern von \thepage als keine gute Idee. Stattdessen schreibe ich jetzt direkt in die .idx-Datei.

Das verbleibende Hauptproblem ist, dass makeindex nur {-} als Trennzeichen erkennt, nicht {.}. Außerdem wird der Zähler \excnt NACH seiner Verwendung erhöht und nicht VOR seiner Verwendung.

Nach dem Rat von Nicoloa Talbot konnte ich das Trennzeichenproblem beheben. Beachten Sie, dass ich Windows auf Laufwerk G installiert habe, was bei anderen wahrscheinlich nicht der Fall ist.

Zuerst habe ich eine ist-Datei aus G:\programfiles\MikTex 2.9\makeindex kopiert und in "period.ist" umbenannt. Jedes beliebige Unterverzeichnis ist geeignet. Ich habe sie außerdem so bearbeitet, dass sie aus

Seitenkompositor "."

Dann habe ich das Menü „Ausgabeprofile erstellen/definieren“ von TeXnic Center verwendet, um -s „period.ist“ zur Makeindex-Argumentliste hinzuzufügen. Wenn einer dieser Schritte (für Ihre Installation) nicht korrekt ausgeführt wird, funktioniert Makeindex nicht.

\documentclass{report} 
\usepackage{expex} 

\lingset{aboveexskip=0pt,glspace=1em plus .5em minus.2em,   
glrightskip=0pt plus 8em,aboveglftskip=0pt,glneveryline={\it},   
glstyle=nlevel,everygl={\hangindent=1.2em \hangafter=1},   
exnotype=chapter.arabic}

\usepackage{makeidx}    
\makeindex

\makeatletter
\newcommand{\ExIndex}[1]% same as \index
{%
 \immediate\write\@indexfile
            {\string\indexentry{#1}%
            {\thechapter.\the\excnt}}%
}%
\makeatother

\begin{document}    

\gathertags

\chapter{First chapter}

\chapter{Second chapter}

\ExIndex{Bratwurst} 
\ex Bratwurst --- this example is preceded by \verb"\ExIndex{Bratwurst}"
\xe 

\ExIndex{Sauerkraut}
\ex Sauerkraut --- this example is preceded by \verb"\ExIndex{Sauerkraut}" 
\xe 

\printindex
\end{document}

Index

verwandte Informationen