
我正在用美洲原住民語言製作一些註釋語言文本。這些句子被標記為,例如,(2.3)——意思是「文本2,句子3」——我希望索引能夠取得這些數字,而不是頁碼。就下圖而言,我想要:
臘腸, (2.1)
酸菜,(2.2)
與顯示的相反(多味臘腸,2;酸菜,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 一般 -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 一般 -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
and\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 一般 -C utf8 -o mal-expex-3.ind mal-expex-3.idx
xindy -M texindy -M expex-3 -L一般-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
)在索引中產生參考。下面我讓它以「頁面範例」格式列印條目(例如,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」。任何子目錄都可以。我還對其進行了編輯,包括
page_compositor“。”
然後我使用 TeXnic Center 中的「建置/定義輸出設定檔」功能表將 -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}