
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?
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 makeindex
einen 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 altemakeidx
Paket, aber ich würde empfehlen, dieimakeidx
Paket, weil wir im letzten Teil einen I/O-Schreibslot einsparen konnten. Ich wollte Methoden vergleichen, die ich so verwendet habe.
Ich verwende lualatex
zur Verarbeitung der TeX-Dateien, latex
es kann aber jede gängige Engine verwendet werden.
Kein Transport: Anmerkungen zur
mal-expex-1.tex
Akte
Wie bereits erwähnt, können wir es neu definieren, \@wrindex
da es sich um den Schlüsselteil handelt, der vom \index
Befehl 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, denexpex
Paket 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-class
wir zusätzlich die Begleitklasse markup-locref
fü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.idx
Datei 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}
Einbahnverkehr: Anmerkungen zur
mal-expex-2.tex
Akte
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, diehyperref
Paket 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}#1
zu 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-attributes
und 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 Problemhyperref
definiert Befehle neu, sodass sie anklickbar sind, uns aber auf die Seite und nicht zu der Zeile führen, in der \index
der Befehl aufgerufen wurde. Wenn wir die mal-expex-2.aux
Datei 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 derexpex
Beispiele. 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.idx
Datei 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}
Gegenseitiger Verkehr: Anmerkungen zur
mal-expex-3.tex
Akte
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 \index
zum Index und von Indexeinträgen im Index zurück zu den \index
Gegenstü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 \hypertarget
und \hyperlink
Befehle 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 idx
für diesen Beitrag von der normalen Datei zu trennen. Ich werde myi
die Erweiterung (spiegelt die idx
Datei wider) und iym
die Erweiterung (spiegelt die ind
Datei wider) verwenden.
Der Kern dieser Methode besteht darin, \hypertarget
und \hyperlink
zweimal 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, \raisebox
um 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 derexpex
Beispiel (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 xdy
Stildatei 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...\xe
Anweisungen 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.idx
Datei ist derselbe wie im zweiten Teil, da wir Befehle auf TeX-Ebene neu definiert haben. Der Inhalt der mal-expex-3.myi
Datei 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}
Antwort2
Ich wollte eine Lösung posten, die auf das Gleiche hinausläuft, aber vielleicht ein bisschen einfacher ist. Sie verwendet das index
Paket. 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 xindy
zur 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 \PageExample
oben leicht generieren, aber die Indexdatei muss dann von verarbeitet werden xindy
.
Nach dem Kompilieren mit latex
rufe ich xindy
wie folgt auf:
texindy -L english example.idx -M page-example.xdy
Die Datei page-example.xdy
enthält Anweisungen xindy
zu 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}