
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?
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 makeindex
para 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.makeidx
paquete, pero recomendaría usar elimakeidx
paquete 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 lualatex
para procesar los archivos TeX, pero latex
se puede usar cualquier motor importante.
Sin transporte: comentarios sobre el
mal-expex-1.tex
expediente.
Como ya se señaló en él, podemos redefinir \@wrindex
ya que es la parte clave llamada por el \index
comando. Podemos almacenar la información directamente llamando a \ep@rawexnoprint
, consulte la línea 19 en el primer archivo. Ese es el comandoexpex
El 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-class
y definimos el acompañamiento markup-locref
para 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.idx
archivo 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}
Tráfico unidireccional: observaciones sobre el
mal-expex-2.tex
expediente
Bueno, ya abrí esa caja de Pandora, déjame informarte cómo podemos salvar nuestras almas. Ese gran problema me lleva a cargar elhyperref
paquete 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 \@wrindex
agregado |myhyperlink{\ep@rawexnoprint}
que nos ayuda a controlar la salida. El paso clave fue agregar \label{\ep@rawexnoprint}#1
este 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-attributes
y 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 comohyperref
está redefiniendo los comandos en los que se puede hacer clic, pero nos lleva a la página, no a la línea donde \index
se llamó el comando. Si exploramos mal-expex-2.aux
má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 elexpex
ejemplos. Bueno, hemos conseguido algunas mejoras. Estamos recibiendo mensajes de error dexindy
sobre 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.idx
archivo 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}
Tráfico bidireccional: observaciones sobre el
mal-expex-3.tex
expediente
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 \index
el índice y desde las entradas del índice hasta sus \index
contrapartes. 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 \hypertarget
y \hyperlink
asegurá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 idx
archivo normal para el propósito de esta publicación. Usaré myi
extensión (refleja el idx
archivo) y iym
extensión (refleja el ind
archivo).
El núcleo de este método es utilizar \hypertarget
y \hyperlink
dos 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 \raisebox
para 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 deexpex
ejemplo (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 avisarxindy
sobre todo esto. Ampliemos nuestro xdy
archivo 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...\xe
declaraciones 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.idx
archivo es el mismo que en la segunda parte, porque redefinimos los comandos a nivel TeX. El contenido del mal-expex-3.myi
archivo 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}
Respuesta2
Quería publicar una solución que equivale a lo mismo, pero que puede ser un poco más sencilla. Utiliza el index
paquete. Puede indicar index
que 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 xindy
para 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 \PageExample
anterior, pero el archivo de índice debe ser procesado por xindy
.
Después de compilar con latex
, invoco xindy
lo siguiente:
texindy -L english example.idx -M page-example.xdy
El archivo page-example.xdy
proporciona instrucciones xindy
sobre 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}