Índice que utiliza números de exemplo, não números de página

Índice que utiliza números de exemplo, não números de página

Estou produzindo alguns textos linguísticos glosados ​​em uma língua nativa americana. As sentenças são rotuladas como, por exemplo, (2.3) – que significa “texto 2, sentença 3” – e eu gostaria que o índice captasse esses números, em vez dos números das páginas. Em termos da imagem abaixo, eu gostaria:

Salsicha, (2.1)

Chucrute, (2.2)

ao contrário do que é mostrado (Bratwurst, 2; Sauerkraut, 2).

Como posso conseguir isso?

insira a descrição da imagem aqui

Estou usando uma versão do exex para os números de exemplo. É muito longo para incluir aqui, mas posso enviá-lo por e-mail para qualquer interessado.


*Esclarecimento. Eu sei como rotular exemplos (colocando, por exemplo, <label>after \ex) e como chamar rótulos posteriormente ( \getref{label}). No entanto, esta questão não é sobre rotulagem de exemplo: não quero ter que vincular manualmenterepolhodizer, \getref{Sauerkraut}, \getref{Kohl}, \getref{Wirsing}. Quero pegar carona makeindexpara produzir um índice que liste números de exemplo em vez 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}

Responder1

Postagem mais longa

Por favor, permita-me compartilhar minhas descobertas com você. Dividi minha resposta em três partes: sem tráfego, tráfego de mão única e tráfego de mão dupla, cada parte resultando em seu próprio arquivo TeX compilável.

Eu tenho usadoXindyporqueMakeIndexé bastante limitado para idiomas diferentes do inglês. Por outro lado, estou usando um método bastante antigomakeidxpacote, mas eu recomendaria usar oimakeidxpacote porque poderíamos salvar um slot de gravação de E/S na última parte. Queria comparar métodos, usei dessa forma.

Estou usando lualatexpara processar os arquivos TeX, mas qualquer latexmecanismo principal pode ser usado.


Sem transporte: observações sobre o mal-expex-1.texprocesso

Como já foi apontado, podemos redefinir \@wrindexpor ser a parte chave chamada pelo \indexcomando. Podemos armazenar as informações diretamente chamando for \ep@rawexnoprint, veja a linha 19 do primeiro arquivo. Esse é o comando queexpexpacote usa para armazenar informações.

O próximo problema é como notificar o processador de índice sobre a localização do número do ponto. Xindy usa a classe location para esse fim, usa várias delas e podemos criar uma nova. Isso pode ser feito define-location-classmais definimos o acompanhamento markup-locrefpara esta nova classe, além disso estamos adicionando parênteses. O último passo seria definir a ordem das novas classes de localização, com sua permissão, mostrarei mais tarde como isso pode ser feito.

Nós corremos:

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

O conteúdo do mal-expex-1.idxarquivo é o seguinte:

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

Incluo o código TeX e uma prévia de três páginas cortadas. Como podemos ver na última página, este é o formulário solicitado, masHouston, nós temos um problema!Uma vez que desejamos uma versão clicável do nosso documento, as referências cruzadas do índice não funcionam.

% 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: sem trânsito


Tráfego de mão única: observações sobre o mal-expex-2.texprocesso

Bom, já abri aquela caixa de Pandora, deixe-me informar como podemos salvar nossas almas. Esse grande problema me leva a carregar ohyperrefpacote e explorar nossas novas possibilidades.

A ideia era usar referências cruzadas regulares como as conhecemos a partir da combinação \label+ \ref+ \pageref, não importando o que será digitado na localização do índice das entradas do índice.

Eu redefini o \@wrindex, adicionei |myhyperlink{\ep@rawexnoprint}o que nos ajuda a controlar a saída. A etapa principal foi adicionar \label{\ep@rawexnoprint}#1este comando. Ele armazena informações de referência e imprime a referência para nós, portanto não precisamos digitá-la duas vezes.

Notificamos o processador de índice sobre um novo comando define-attributese definimos uma nova classe como no primeiro exemplo. O resultado de nossos esforços é que o número é clicável, mas os parênteses não.

Há um pequeno problema comohyperrefestá redefinindo comandos que são clicáveis, mas nos leva à página e não à linha onde \indexo comando foi chamado. Se explorarmos mal-expex-2.auxmais o arquivo, podemos ver o que está acontecendo:

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

Armazenou todas as informações necessárias, mas leva ao segundo capítulo. Esse não é o melhor resultado que podemos alcançar aqui, já que o próprio título poderia ser composto várias páginas antes doexpexexemplos. Bem, tivemos algumas melhorias. Estamos recebendo mensagens de erro dexindysobre a inexistência de alvos de referência cruzada, mas podemos ignorá-los, nós mesmos gerenciamos essa parte.

Executamos estas três linhas:

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

O conteúdo do mal-expex-2.idxarquivo é 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} 

Incluo o código TeX e uma prévia do 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áfego de mão única


Tráfego nos dois sentidos: observações sobre o mal-expex-3.texprocesso

Assim que pudermos melhorar alguma coisa, nós o faremos. Desejamos ter uma versão clicável do documento com referências cruzadas que levem aos locais apropriados. Além disso, podemos tentar ter referências cruzadas de ambas as direções. De \indexpara o índice e das entradas do índice de volta para suas \indexcontrapartes. Devemos ter em mente que as entradas do índice são agrupadas e podemos perder alguns hiperlinks no índice, de modo geral.

Para isso usei alguns comandos \hypertargete \hyperlinkgarantindo que eu lhes forneça marcadores exclusivos, veja as linhas 40-47 no código abaixo. É uma versão corrigida, vai para o local original, mas não há caminho de volta. Vamos nos concentrar nesse recurso.

Eu preparei um novo arquivo para os próximos experimentos para separá-los do idxarquivo normal para o propósito desta postagem. Usarei myiextensão (reflete o idxarquivo) e iymextensão (reflete o indarquivo).

O núcleo deste método é usar \hypertargete \hyperlinkduas vezes: um par lidando com um caminho, o outro par lidando com o caminho de volta. Consulte as linhas 50-65 do código. Eu precisava usar \raiseboxpara obter a localização da linha de base esquerda da caixa até o canto superior esquerdo.

Também preparei um novo conjunto de comandos para uso regular. Podemos armazenar números de páginas (é um método comum; número arábico simples), podemos armazenar números deexpexexemplo (número arábico ponto número arábico entre parênteses) e número do capítulo (número arábico entre colchetes). Usando esta abordagem, veja as linhas 68-70, podemos armazenar quase tudo lá.

A única coisa que nos resta fazer é notificarxindysobre tudo isso. Vamos estender nosso xdyarquivo de estilo, consulte as linhas 20-36 no código TeX.

Para facilitar nosso trabalho, fiz mais uma melhoria. Eu redefini as \ex...\xeinstruções para a forma apenas \ex...definindo o final da linha ( ^^M) como um comando e usando-o posteriormente. É claro que esta etapa não é necessária na produção, só queria mostrar que isso pode ser feito e podemos economizar a digitação de arquivos \xe.

Executamos as quatro linhas a seguir:

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

O conteúdo do mal-expex-3.idxarquivo é o mesmo da segunda parte, pois redefinimos os comandos no nível do TeX. O conteúdo do mal-expex-3.myiarquivo é algo novo para nós e se parece com isto:

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

Anexo o último exemplo e uma prévia de nossos esforços.

% 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áfego de mão dupla

Responder2

Queria postar uma solução que dá no mesmo, mas que pode ser um pouco mais simples. Ele usa o indexpacote. Você pode instruir indexa usar uma macro específica (abaixo \PageExample) para gerar uma referência no índice. Abaixo estou imprimindo entradas no formato "Página-Exemplo" (por exemplo, 2-7). Um formato diferente é discutido abaixo.

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

A pontuação que pode ocorrer nas referências do índice é limitada por makeindex. Se você estiver satisfeito com o formato "2-7", o exemplo acima funciona perfeitamente.

Se você usar xindypara processar o índice, haverá mais flexibilidade. Eu queria referências como esta "Número da página (número do exemplo)", ou seja, 2 (7). É fácil gerar isso com a definição alternativa \PageExampleacima, mas o arquivo de índice precisa ser processado por xindy.

Depois de compilar com latex, invoco xindyda seguinte forma:

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

O arquivo page-example.xdyinstrui xindysobre meu formato "Número de página (número de exemplo)". Ele contém apenas uma linha:

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

Responder3

Modificar \thepage acabou não sendo uma boa ideia, pelos motivos indicados abaixo. Então, em vez disso, escrevo diretamente no arquivo .idx.

O principal problema que resta é que makeindex reconhece apenas {-} como delimitador, não {.}. Além disso, o contador \excnt é incrementado APÓS ser usado, em vez de ANTES de ser usado.

Seguindo o conselho de Nicoloa Talbot, consegui resolver o problema do delimitador. Observe que tenho o Windows instalado na unidade G, o que provavelmente não é o caso de mais ninguém.

Primeiro copiei e renomeei um arquivo ist de G:\programfiles\MikTex 2.9\makeindex como "period.ist". Qualquer subdiretório serve. Eu também editei para consistir em

page_compositor "."

Então usei o menu Construir/Definir Perfis de Saída do TeXnic Center para adicionar -s "period.ist" à lista de argumentos Makeindex. Se alguma dessas etapas não for executada corretamente (para sua instalação), o Makeindex não 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

informação relacionada