根据示例数字而不是页码进行索引

根据示例数字而不是页码进行索引

我正在用美洲原住民语言编写一些带注释的语言文本。这些句子被标记为,例如,(2.3) — 意思是“文本 2,句子 3” — 并且我希望索引能够识别这些数字,而不是页码。就下图而言,我希望:

德国香肠,(2.1)

酸菜,(2.2)

与所展示的相反(Bratwurst,2;Sauerkraut,2)。

我怎样才能实现这个目标?

在此处输入图片描述

我使用 expex 的一个版本来制作示例数字。它太长了,无法在此处包含,但我可以将其通过电子邮件发送给任何感兴趣的人。


*澄清。我知道如何标记示例(例如,<label>在 之后放置\ex)以及如何在稍后调用标签(\getref{label})。然而,这个问题与示例标签无关:我不想手动链接卷心菜比如说,,,\getref{Sauerkraut}\getref{Kohl}\getref{Wirsing}想借助这个来makeindex制作一个列出示例编号而不是页码的索引。


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

答案1

较长的文章

请允许我与大家分享我的发现。我将答案分为三部分:无交通、单向交通和双向交通,每部分都会生成自己的可编译 TeX 文件。

我用过辛迪因为制作索引对于非英语语言来说,它相当有限。另一方面,我使用的是相当老的makeidx包,但我建议使用imakeidx包,因为我们可以在最后一部分节省一个 I/O 写入槽。我想比较方法,所以我用了这种方法。

我正在使用lualatex它来处理 TeX 文件,但latex可以使用任何主流引擎。


mal-expex-1.tex禁止运输:文件备注

正如上面已经指出的那样,我们可以重新定义,\@wrindex因为它是命令调用的关键部分\index。我们可以通过调用 for 直接存储信息\ep@rawexnoprint,参见第一个文件中的第 19 行。这就是命令expex包用于存储信息。

下一个问题是如何通知索引处理器有关数字点数字位置的信息。Xindy 为此使用位置类,它使用了其中的几个,我们可以创建一个新的。这可以通过define-location-class我们为这个新类定义伴随来完成markup-locref,此外我们还添加了括号。最后一步是定义新位置类的顺序,如果您允许,我稍后会向您展示如何做到这一点。

我们跑:

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

文件内容mal-expex-1.idx如下:

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

我附上了 TeX 代码和三页裁剪页面的预览。从最后一页可以看出,这是所要求的表格,但是休斯顿,我们有一个问题!一旦我们想要文档的可点击版本,索引交叉引用就不起作用了。

% 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,第 1 部分:无交通


单向交通:文件mal-expex-2.tex备注

好吧,我已经打开了潘多拉魔盒,让我告诉你如何拯救我们的灵魂。这个大问题让我加载了hyperref包装并探索我们进一步的可能性。

\label这个想法是使用我们从++组合中了解到的\ref常规交叉引用\pageref,无论在索引条目的索引位置中排版什么。

我重新定义了\@wrindex,添加了|myhyperlink{\ep@rawexnoprint}它来帮助我们控制输出。关键步骤是添加\label{\ep@rawexnoprint}#1到此命令中。它存储参考信息并为我们打印参考,因此我们不必输入两次。

我们通过 通知索引处理器有关新命令的信息define-attributes,并像第一个示例一样定义一个新类。我们的努力的结果是数字是可点击的,而括号则不可点击。

有一个小问题hyperref正在重新定义可点击的命令,但它会引导我们进入页面,而不是调用\index命令的行。如果我们mal-expex-2.aux进一步探索文件,我们可以看到发生了什么:

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

它存储了所有必要的信息,但它引出了第二章。这不是我们能在这里实现的最佳结果,因为标题本身可以比正文早几页排版。expex示例。好吧,我们有一些改进。我们收到来自xindy关于交叉引用目标不存在,但我们可以忽略它们,我们自己管理那部分。

我们运行以下三行:

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

该文件的内容mal-expex-2.idx如下:

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

我附上了 TeX 代码和结果预览。

% 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,第 2 部分:单向交通


双向交通:文件mal-expex-3.tex备注

一旦我们可以改进某些内容,我们就会去做。我们希望有可点击的文档版本,其中有指向正确位置的交叉引用。此外,我们可以尝试从两个方向进行交叉引用。从到\index索引,从索引中的索引条目到其\index对应项。我们必须记住,索引条目是分组的,一般来说,我们可能会丢失索引中的一些超链接。

为此,我使用了几个\hypertarget\hyperlink命令,确保我为它们提供了唯一的标记,请参阅下面代码中的第 40-47 行。这是修正版本,它会转到原始位置,但没有返回的路径。让我们专注于该功能。

idx为了便于本文,我为下一次实验准备了一个新文件,以便将它们与常规文件区分开来。我将使用myi扩展名(反映idx文件)和iym扩展名(反映ind文件)。

此方法的核心是使用\hypertarget\hyperlink两次:一对处理一个方向,另一对处理返回方向。请参阅代码中的 50-65 行。我需要使用 来\raisebox获取从框的左基线到左上角的位置。

我还准备了一组新的命令供日常使用。我们可以存储页码(这是一种常用方法;纯阿拉伯数字),我们可以存储expex示例(阿拉伯数字点阿拉伯数字括在括号中)和章节编号(阿拉伯数字括在方括号中)。使用这种方法,参见第 68-70 行,我们几乎可以将任何东西存储在那里。

我们唯一要做的就是通知xindy关于这一切。让我们扩展我们的xdy样式文件,请参阅 TeX 代码中的第 20-36 行。

为了使我们的工作更轻松,我又做了一项改进。我已将语句重新定义\ex...\xe为 的形式,只需\ex...将行尾 ( ^^M) 定义为命令并在之后使用它即可。这一步在生产中当然不是必需的,我只是想向您展示它可以完成,我们可以节省 的输入\xe

我们运行以下四行:

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

该文件的内容mal-expex-3.idx与第二部分相同,因为我们在 TeX 级别重新定义了命令。该mal-expex-3.myi文件的内容对我们来说是新的,它看起来像这样:

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

我附上了最后一个例子和我们努力的预览。

% 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,第 3 部分:双向交通

答案2

我想发布一个与此类似但可能更简单的解决方案。它使用包index。您可以指示index使用特定宏(下面,\PageExample)在索引中生成引用。下面我让它以“Page-Example”格式打印条目(例如,2-7)。下面讨论了不同的格式。

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

索引引用中可以出现的标点符号受 限制makeindex。如果您对“2-7”格式感到满意,则上述示例可以完美运行。

如果您使用xindy来处理索引,则灵活性更高。我想要像这样的引用“页码(示例编号)”,即 2(7)。使用\PageExample上面的替代定义很容易生成该定义,但索引文件随后需要通过 进行处理xindy

使用 进行编译后latex,我调用xindy如下:

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

该文件page-example.xdy说明xindy了我的“页码(示例编号)”格式。它只包含一行:

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

答案3

修改 \thepage 并不是一个好主意,原因如下。因此,我现在直接写入 .idx 文件。

剩下的主要问题是 makeindex 仅将 {-} 识别为分隔符,而不是 {.}。此外,计数器 \excnt 在使用后而不是在使用前递增。

根据 Nicoloa Talbot 的建议,我能够修复分隔符问题。请注意,我的 Windows 安装在 G 盘上,其他人可能不是这样。

首先,我从 G:\programfiles\MikTex 2.9\makeindex 复制并重命名了一个 ist 文件,命名为“period.ist”。任何子目录都可以。我还对其进行了编辑,使其包含以下内容

页面合成器 "."

然后我使用 TeXnic Center 的 Build/Define Output Profiles 菜单将 -s "period.ist" 添加到 Makeindex 参数列表中。如果这些步骤中的任何一个没有正确完成(对于您的安装),那么 Makeindex 将无法工作。

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

指数

相关内容