我正在用美洲原住民语言编写一些带注释的语言文本。这些句子被标记为,例如,(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}
单向交通:文件
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}
双向交通:文件
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}
答案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}