
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?
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 makeindex
para 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 antigomakeidx
pacote, mas eu recomendaria usar oimakeidx
pacote porque poderíamos salvar um slot de gravação de E/S na última parte. Queria comparar métodos, usei dessa forma.
Estou usando lualatex
para processar os arquivos TeX, mas qualquer latex
mecanismo principal pode ser usado.
Sem transporte: observações sobre o
mal-expex-1.tex
processo
Como já foi apontado, podemos redefinir \@wrindex
por ser a parte chave chamada pelo \index
comando. Podemos armazenar as informações diretamente chamando for \ep@rawexnoprint
, veja a linha 19 do primeiro arquivo. Esse é o comando queexpex
pacote 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-class
mais definimos o acompanhamento markup-locref
para 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.idx
arquivo é 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}
Tráfego de mão única: observações sobre o
mal-expex-2.tex
processo
Bom, já abri aquela caixa de Pandora, deixe-me informar como podemos salvar nossas almas. Esse grande problema me leva a carregar ohyperref
pacote 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}#1
este 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-attributes
e 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 comohyperref
está redefinindo comandos que são clicáveis, mas nos leva à página e não à linha onde \index
o comando foi chamado. Se explorarmos mal-expex-2.aux
mais 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 doexpex
exemplos. Bem, tivemos algumas melhorias. Estamos recebendo mensagens de erro dexindy
sobre 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.idx
arquivo é 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}
Tráfego nos dois sentidos: observações sobre o
mal-expex-3.tex
processo
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 \index
para o índice e das entradas do índice de volta para suas \index
contrapartes. 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 \hypertarget
e \hyperlink
garantindo 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 idx
arquivo normal para o propósito desta postagem. Usarei myi
extensão (reflete o idx
arquivo) e iym
extensão (reflete o ind
arquivo).
O núcleo deste método é usar \hypertarget
e \hyperlink
duas 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 \raisebox
para 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 deexpex
exemplo (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 é notificarxindy
sobre tudo isso. Vamos estender nosso xdy
arquivo de estilo, consulte as linhas 20-36 no código TeX.
Para facilitar nosso trabalho, fiz mais uma melhoria. Eu redefini as \ex...\xe
instruçõ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.idx
arquivo é o mesmo da segunda parte, pois redefinimos os comandos no nível do TeX. O conteúdo do mal-expex-3.myi
arquivo é 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}
Responder2
Queria postar uma solução que dá no mesmo, mas que pode ser um pouco mais simples. Ele usa o index
pacote. Você pode instruir index
a 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 xindy
para 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 \PageExample
acima, mas o arquivo de índice precisa ser processado por xindy
.
Depois de compilar com latex
, invoco xindy
da seguinte forma:
texindy -L english example.idx -M page-example.xdy
O arquivo page-example.xdy
instrui xindy
sobre 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}