ページ番号ではなく例番号を拾う索引

ページ番号ではなく例番号を拾う索引

私はネイティブアメリカンの言語で注釈付きの言語テキストを作成しています。文には、たとえば (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

長い投稿

私の調査結果を皆さんと共有させてください。私の回答は、トラフィックなし、一方通行、双方向の 3 つの部分に分かれており、各部分は独自のコンパイル可能な TeX ファイルになります。

利用したジンディなぜならインデックス作成英語以外の言語ではかなり制限があります。一方、私はかなり古いmakeidxパッケージですが、imakeidxパッケージの最後の部分で 1 つの I/O 書き込みスロットを節約できるためです。メソッドを比較したかったので、その方法を使用しました。

私はlualatexTeX ファイルの処理に を使用していますが、主要なlatexエンジンであればどれでも使用できます。


輸送なし:mal-expex-1.texファイルに関するコメント

すでに指摘したように、\@wrindexこれはコマンドによって呼び出される重要な部分なので、再定義することができます\index。 を呼び出すことで情報を直接保存することができます\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コードと3ページの切り抜きプレビューを同封します。最後のページからわかるように、これが要求された形式ですが、ヒューストン、問題が発生しました!クリック可能なバージョンのドキュメントが必要な場合、インデックスの相互参照は機能しません。

% 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このコマンドに を追加することでした。参照情報を保存し、参照を印刷するので、2 回入力する必要がありません。

インデックス プロセッサに新しいコマンドを通知しdefine-attributes、最初の例のように新しいクラスを定義します。この努力の結果、数字はクリック可能になりますが、括弧はクリックできなくなります。

ちょっとした問題がありますhyperrefクリック可能なコマンドを再定義していますが、コマンドが呼び出された行ではなくページに移動します\index。ファイルをさらに調べると、mal-expex-2.aux何が起こっているかがわかります。

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

必要な情報はすべて保存されていますが、第2章につながります。タイトル自体は本文よりも数ページ早くタイプセットできるため、ここで達成できる最良の結果ではありません。expex例。まあ、改善はありました。エラーメッセージが表示されるようになりました。xindy相互参照ターゲットが存在しないという問題がありますが、無視できます。その部分は私たち自身で管理します。

次の 3 つのラインを実行します。

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。インデックス エントリはグループ化されており、一般的に、インデックス内のハイパーリンクが一部失われる可能性があることに留意する必要があります。

このため、私はいくつかの\hypertargetand\hyperlinkコマンドを使用して、それらに一意のマーカーを確実に提供できるようにしました。以下のコードの 40 行目から 47 行目を参照してください。これは修正されたバージョンで、元の場所に移動しますが、戻る方法はありません。その機能に焦点を当ててみましょう。

idxこの投稿の目的のために、次の実験用に通常のファイルから分離する新しいファイルを用意しました。myi拡張子 (idxファイルを反映) とiym拡張子 (indファイルを反映) を使用します。

このメソッドの核となるのは、 と\hypertarget\hyperlink2 回使用することです。1 つのペアは片道を処理し、もう 1 つのペアは戻りを処理します。コードの 50 行目から 65 行目を参照してください。\raiseboxボックスの左ベースラインから左上隅までの位置を取得するために、 を使用する必要がありました。

また、通常の使用のために新しいコマンドセットも用意しました。ページ番号を保存できます(これは一般的な方法であり、アラビア数字です)、expexたとえば、(アラビア数字のドットと括弧で囲まれたアラビア数字) と章番号 (角括弧で囲まれたアラビア数字) です。この方法を使用すると (68 行目から 70 行目を参照)、ほぼ何でもそこに保存できます。

残された唯一のことは、通知することだxindyこれらすべてについて。xdyスタイル ファイルを拡張してみましょう。TeX コードの 20 行目から 36 行目を参照してください。

作業を簡単にするために、もう 1 つ改善を加えました。行末 ( ) をコマンドとして定義し、その後それを使用することで、\ex...\xeステートメントを の形式に再定義しました。この手順は、もちろん本番環境では必要ありませんが、これが実行可能であり、 の入力を節約できることを示したかっただけです。\ex...^^M\xe

次の 4 つのラインを実行します。

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 レベルでコマンドを再定義したため、2 番目の部分と同じです。ファイルの内容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指示できます。 以下では、エントリを「Page-Example」(例: 2-7) の形式で出力しています。 別の形式については以下で説明します。index\PageExample

\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説明があります。内容は 1 行だけです。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 の [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}

索引

関連情報