Índice que recoge números de ejemplo, no números de página.

Índice que recoge números de ejemplo, no números de página.

Estoy produciendo algunos textos lingüísticos glosados ​​en una lengua nativa americana. Las oraciones están etiquetadas, por ejemplo, como (2.3), que significa “texto 2, oración 3”, y me gustaría que el índice retome estos números, en lugar de los números de página. En términos de la imagen a continuación, me gustaría:

Salchichas, (2.1)

Chucrut, (2.2)

a diferencia de lo que se muestra (Bratwurst, 2; Chucrut, 2).

¿Cómo puedo conseguir esto?

ingrese la descripción de la imagen aquí

Estoy usando una versión de expex para los números de ejemplo. Es demasiado largo para incluirlo aquí, pero puedo enviarlo por correo electrónico a las partes interesadas.


*Aclaración. Sé cómo etiquetar ejemplos (poniendo, por ejemplo, <label>después \ex) y cómo llamar etiquetas en un momento posterior ( \getref{label}). Sin embargo, esta pregunta no trata sobre el etiquetado de ejemplo: no quiero tener que vincular manualmenterepollodecir, \getref{Sauerkraut}, \getref{Kohl}, \getref{Wirsing}. Quiero aprovechar makeindexpara producir un índice que enumere números de ejemplo en lugar de números de página.


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

Respuesta1

Publicación más larga

Permítame compartir mis hallazgos con usted. He dividido mi respuesta en tres partes: sin tráfico, tráfico unidireccional y tráfico bidireccional, cada parte da como resultado su propio archivo TeX compilable.

He usadoXindyporqueCrear índicees bastante limitado para idiomas distintos del inglés. Por otro lado, estoy usando bastante antiguo.makeidxpaquete, pero recomendaría usar elimakeidxpaquete porque podríamos guardar una ranura de escritura de E/S en la última parte. Quería comparar métodos, lo usé de esa manera.

Lo estoy usando lualatexpara procesar los archivos TeX, pero latexse puede usar cualquier motor importante.


Sin transporte: comentarios sobre el mal-expex-1.texexpediente.

Como ya se señaló en él, podemos redefinir \@wrindexya que es la parte clave llamada por el \indexcomando. Podemos almacenar la información directamente llamando a \ep@rawexnoprint, consulte la línea 19 en el primer archivo. Ese es el comandoexpexEl paquete se utiliza para almacenar información.

El siguiente problema es cómo notificar al procesador de índice sobre la ubicación del número de punto. Xindy usa clases de ubicación para este propósito, usa varias de ellas y podemos crear una nueva. Se puede hacer define-location-classy definimos el acompañamiento markup-locrefpara esta nueva clase, además de eso agregamos paréntesis. El último paso sería definir el orden de las nuevas clases de ubicación, con su permiso, más adelante le mostraré cómo se puede hacer.

Corremos:

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

El contenido del mal-expex-1.idxarchivo es el siguiente:

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

Adjunto el código TeX y una vista previa de tres páginas recortadas. Como podemos ver en la última página, este es el formulario solicitado, pero¡Houston, tenemos un problema!Una vez que queremos una versión de nuestro documento en la que se pueda hacer clic, las referencias cruzadas del índice no funcionan.

% 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, parte 1: sin tráfico


Tráfico unidireccional: observaciones sobre el mal-expex-2.texexpediente

Bueno, ya abrí esa caja de Pandora, déjame informarte cómo podemos salvar nuestras almas. Ese gran problema me lleva a cargar elhyperrefpaquete y explore nuestras posibilidades adicionales.

La idea era utilizar referencias cruzadas regulares tal como las conocemos por la combinación \label+ \ref+ \pageref, sin importar lo que se escriba en la ubicación del índice de las entradas del índice.

He redefinido el \@wrindexagregado |myhyperlink{\ep@rawexnoprint}que nos ayuda a controlar la salida. El paso clave fue agregar \label{\ep@rawexnoprint}#1este comando. Almacena información de referencia e imprime la referencia por nosotros, por lo que no tenemos que escribirla dos veces.

Notificamos al procesador de índice sobre un nuevo comando define-attributesy definimos una nueva clase como en el primer ejemplo. El resultado de nuestros esfuerzos es que se puede hacer clic en el número, pero no en los paréntesis.

Hay un pequeño problema comohyperrefestá redefiniendo los comandos en los que se puede hacer clic, pero nos lleva a la página, no a la línea donde \indexse llamó el comando. Si exploramos mal-expex-2.auxmás el archivo podemos ver lo que está pasando:

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

Almacenó toda la información necesaria, pero conduce al segundo capítulo. Ese no es el mejor resultado que podemos lograr aquí ya que el título en sí podría escribirse varias páginas antes que elexpexejemplos. Bueno, hemos conseguido algunas mejoras. Estamos recibiendo mensajes de error dexindysobre los objetivos de referencia cruzada que no existen, pero podemos ignorarlos, gestionamos esa parte por nosotros mismos.

Ejecutamos estas tres líneas:

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

El contenido del mal-expex-2.idxarchivo es este:

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

Adjunto el código TeX y una vista previa del resultado.

% 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, parte 2: tráfico en un solo sentido


Tráfico bidireccional: observaciones sobre el mal-expex-3.texexpediente

Una vez que podamos mejorar algo, lo haremos. Deseamos tener una versión del documento en la que se pueda hacer clic con referencias cruzadas que conduzcan a las ubicaciones adecuadas. Es más, podemos intentar tener referencias cruzadas desde ambas direcciones. Desde \indexel índice y desde las entradas del índice hasta sus \indexcontrapartes. Debemos tener en cuenta que las entradas del índice están agrupadas y podemos perder algunos hipervínculos en el índice, por lo general.

Para esto utilicé un par de comandos \hypertargety \hyperlinkasegurándome de proporcionarles marcadores únicos; consulte las líneas 40-47 en el código siguiente. Es una versión corregida, va a la ubicación original, pero no hay vuelta atrás. Centrémonos en esa característica.

He preparado un nuevo archivo para los próximos experimentos para separarlos del idxarchivo normal para el propósito de esta publicación. Usaré myiextensión (refleja el idxarchivo) y iymextensión (refleja el indarchivo).

El núcleo de este método es utilizar \hypertargety \hyperlinkdos veces: un par manejando el camino de ida y el otro par manejando el camino de regreso. Consulte las líneas 50 a 65 del código. Necesitaba usar \raiseboxpara obtener la ubicación desde la línea de base izquierda del cuadro hasta la esquina superior izquierda.

También preparé un nuevo conjunto de comandos para uso regular. Podemos almacenar números de página (es un método común; número arábigo simple), podemos almacenar el número deexpexejemplo (número arábigo, punto, número arábigo entre paréntesis) y número de capítulo (número arábigo entre paréntesis). Usando este enfoque, vea las líneas 68-70, podemos almacenar casi cualquier cosa allí.

Lo único que nos queda por hacer es avisarxindysobre todo esto. Ampliemos nuestro xdyarchivo de estilo; consulte las líneas 20 a 36 en el código TeX.

Para facilitarnos el trabajo he realizado una mejora más. He redefinido las \ex...\xedeclaraciones a la forma de simplemente \ex...definiendo el final de la línea ( ^^M) como un comando y usándolo después. Por supuesto, este paso no es necesario en producción, solo quería mostrarles que se puede realizar y que podemos ahorrarnos escribir archivos \xe.

Ejecutamos las siguientes cuatro líneas:

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

El contenido del mal-expex-3.idxarchivo es el mismo que en la segunda parte, porque redefinimos los comandos a nivel TeX. El contenido del mal-expex-3.myiarchivo es algo nuevo para nosotros y se ve así:

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

Adjunto el último ejemplo y una vista previa de nuestros esfuerzos.

% 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, parte 3: tráfico de doble sentido

Respuesta2

Quería publicar una solución que equivale a lo mismo, pero que puede ser un poco más sencilla. Utiliza el indexpaquete. Puede indicar indexque utilice una macro específica (a continuación \PageExample) para generar una referencia en el índice. A continuación lo tengo imprimiendo entradas en el formato "Página-Ejemplo" (por ejemplo, 2-7). A continuación se analiza un formato diferente.

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

La puntuación que puede aparecer en las referencias del índice está limitada por makeindex. Si está satisfecho con el formato "2-7", el ejemplo anterior funciona perfectamente.

Si utiliza xindypara procesar el índice, hay más flexibilidad. Quería referencias como esta "Número de página (número de ejemplo)", es decir, 2 (7). Es fácil generar eso con la definición alternativa \PageExampleanterior, pero el archivo de índice debe ser procesado por xindy.

Después de compilar con latex, invoco xindylo siguiente:

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

El archivo page-example.xdyproporciona instrucciones xindysobre mi formato "Número de página (número de ejemplo)". Contiene solo una línea:

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

Respuesta3

Modificar \thepage resultó no ser una buena idea, por las razones que se detallan a continuación. Entonces, ahora escribo directamente en el archivo .idx.

El principal problema que queda es que makeindex solo reconoce {-} como delimitador, no {.}. Además, el contador \excnt se incrementa DESPUÉS de usarse en lugar de ANTES de usarse.

Siguiendo el consejo de Nicoloa Talbot pude solucionar el problema del delimitador. Tenga en cuenta que tengo Windows instalado en la unidad G, lo que probablemente no sea el caso de nadie más.

Primero copié y cambié el nombre de un archivo ist de G:\programfiles\MikTex 2.9\makeindex como "period.ist". Cualquier subdirectorio servirá. También lo edité para que conste de

page_compositor "."

Luego utilicé el menú Crear/Definir perfiles de salida de TeXnic Center para agregar -s "period.ist" a la lista de argumentos de Makeindex. Si alguno de estos pasos no se realiza correctamente (para su instalación), Makeindex no funcionará.

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

índice

información relacionada