1段索引と2段索引との並存

1段索引と2段索引との並存

- 前田 やえの の投稿
返信数: 13


2つ索引が要るTeX原稿があります.最初は1段,2つ目は2段としたいのです.
ところが最初の段が後に影響してしまって1段,1段または2段,2段
となってしまいます.
クラスファイル は jsbook.clsです.\theindex環境をいじってみてやってみましたが
うまくいきません.
CTANにいってimakeidx.styをダウンロードしましたが
jsbook.clsの下ではマクロ不足で動きませんでした.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\documentclass{jsarticle}
% \usepackage{makeidx}
\usepackage{index}
\usepackage{amsmath,amssymb,amsthm}%これは必要です
\makeindex
\newindex{aut}{adx}{and}{著者索引}
\begin{document}
これは索引の練習です.
\index{しゅうそく@収束}
\index[aut]{Leibniz@Leibniz(1646-1716)}
\newindex{aut}{adx}{and}{著者索引}
\printindex[aut]
\printindex
\end{document}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
外側のDosコマンド
%%%%%%%%%%%%%%%%%
platex -src -jobname=2つのprintindexの実験 2つのprintindexの実験.tex
mendex -o 2つのprintindexの実験.ind 2つのprintindexの実験.idx
mendex -o 2つのprintindexの実験.and 2つのprintindexの実験.adx
platex -src 2つのprintindexの実験.tex
%%%%%%%%%%%%%%%%%
1番良いのはユーザーTeXプログラムの方で段数を任意に与えて
どこの個所でも使えたら幸せです.
jsbook.clsにはお世話になってます.いつも愛用させていただいています.

前田 やえの への返信

Re: 1段索引と2段索引との並存

- 北見 けん の投稿
コメントがつかないですね。

> ところが最初の段が後に影響してしまって1段,1段または2段,2段
> となってしまいます.
> クラスファイル は jsbook.clsです.\theindex環境をいじってみてやってみましたが
> うまくいきません.

どのようにやってみてうまくいかなかったのか、
やったことをもう少し具体的に書いてみては?

> 1番良いのはユーザーTeXプログラムの方で段数を任意に与えて
> どこの個所でも使えたら幸せです.

このあたりも、どのようになさりたいのか、
もう少し具体的に書いたほうがよいかと。

「どこの個所でも」とありますが、
一つの文書中のいろいろな場所に索引が入るのかしら?とか、
ちょっと具体的なイメージがわきません。
北見 けん への返信

Re: 1段索引と2段索引との並存

- 和田 勇 の投稿
> コメントがつかないですね。

北見さんが指摘されるように「どのように。。」「どうやりたいのか」に同様悶々としていました。

索引の数が少なし、1行一杯になるような索引項目になりそうなものとして百人一首を題材に索引をでっち上げて、試してみたものを添付します。

PDF やソースを見て、どうカスタマイズしたいか、意見を言ってくださればと思います。

なお、windows 用のスクリプトまで手が回りませんが、 macOS であれば bash typeset.bash test とタイプしていただければ pdf は出来ます。
和田 勇 への返信

Re: 1段索引と2段索引との並存

- TONE Kozaburo の投稿
Windowsだと以下を typeset.bat として保存して、コマンドプロンプトから「typeset test」とするかドラッグ&ドロップすれば pdf は出来ます。


rem t=$(basename $1 .tex)
rem %~n1 は拡張子無しのファイル名を示す
del /q %~n1.adx
del /q %~n1.and
del /q %~n1.aux
del /q %~n1.dvi
del /q %~n1.idx
del /q %~n1.alg
del /q %~n1.ilg
del /q %~n1.ind
del /q %~n1.log
del /q %~n1.pdf
platex -src -jobname=%~n1 %~n1.tex
mendex -o %~n1.ind %~n1.idx
mendex -t %~n1.alg -o %~n1.and %~n1.adx
platex -src %~n1.tex
dvipdfmx %~n1
start %~n1.pdf
TONE Kozaburo への返信

Re: 1段索引と2段索引との並存

- 和田 勇 の投稿
ありがとうございます。

set t=%~n1

をしておいて %~n1 を %t% に置き換えたやつをアップしようとしていました。 
でも W32TEX も入っている環境だったので rm → del に気がつかなかった :-< 多謝
和田 勇 への返信

Re: 1段索引と2段索引との並存

- TONE Kozaburo の投稿
W32TeX の bin には rm.exe が入っているようです。(^_^;)

C:\Users\tony\Documents>dir \usr\local\bin\r*.*
ドライブ C のボリューム ラベルがありません。
ボリューム シリアル番号は 2E8A-CB98 です

C:\usr\local\bin のディレクトリ

2020/05/28  15:12            1,536 r-mpost.exe
2020/05/28  15:12            1,536 r-pmpost.exe
2020/05/28  15:12            1,536 r-upmpost.exe
2018/01/13  16:13            9,728 rdjpgcom.exe
2021/02/18  12:18            10,752 rebar.exe
2021/02/18  12:20            8,704 repairt1.exe
2015/04/26  22:46            1,536 repstopdf.exe
2000/10/10  00:00            65,536 rm.exe
2015/04/26  22:46            1,536 rpdfcrop.exe
2020/03/02  08:30            7,168 rungs.exe
2021/02/18  12:20            11,776 runscr.dll
2020/05/28  15:12            1,536 runscr.exe
              12 個のファイル            122,880 バイト
              0 個のディレクトリ  133,476,089,856 バイトの空き領域

C:\Users\tony\Documents>\usr\local\bin\rm --help
Usage: \usr\local\bin\rm [OPTION]... FILE...
Remove (unlink) the FILE(s).

  -d, --directory      unlink directory, even if non-empty (super-user only)
  -f, --force          ignore nonexistent files, never prompt
  -i, --interactive    prompt before any removal
  -r, -R, --recursive  remove the contents of directories recursively
  -v, --verbose        explain what is being done
      --help            display this help and exit
      --version        output version information and exit

Report bugs to fileutils-bugs@gnu.ai.mit.edu

C:\Users\tony\Documents>
TONE Kozaburo への返信

Re: 1段索引と2段索引との並存

- TONE Kozaburo の投稿
自分は GoW (Gnu on Windows)使っていたので気が付きませんでした。

rm.exe は、W32TeX の次のアーカイブ内ですね。

【texinfo-w32.tar.xz】
bin/
bin/basename.exe
bin/cat.exe
bin/cmp.exe
bin/cp.exe
bin/diff.exe
bin/dirname.exe
bin/egrep.exe
bin/expr.exe
bin/grep.exe
bin/iconv.exe
bin/mkdir.exe
bin/msvcr100.dll
bin/ptexindex.exe
bin/rm.exe
bin/sed.exe
bin/sort.exe
bin/texi2dvi.exe
bin/texindex.exe
bin/txishell.exe
bin/uniq.exe
(後略)
北見 けん への返信

Re: 1段索引と2段索引との並存

- 前田 やえの の投稿
北見さま,和田さま
返信ありがとうございます,
とりあえずもう少し頑張ってみます.
前田 やえの への返信

Re: 1段索引と2段索引との並存

- ut の投稿

手元では一見うまくいっているように見えますけれど、すごく適当なので、飽くまでご参考までです。

   \ProvidesClass{jsbook}
     [2020/02/02 jsclasses (okumura, texjporg)]

の theindex 環境の定義にちょっとだけ手を入れてみました(IndexColNum というカウンタを新設して場合分けをしてみただけです)。

※ 試される場合には、ファイル名が test.tex だとして、test.ind と test.and が必要です(和田さんがご用意してくださったファイルを流用しました)。

※ \chapter*{\indexname} としているので、索引間で改ページされてしまいます。

※ 汎用性を求めなければ、単純に multicol.sty で段数を決め打ちでよさそうな気もするのですけれど…。


----- test.tex -----

\documentclass[dvipdfmx]{jsbook}

\setlength{\textwidth}{\fullwidth}
\setlength{\evensidemargin}{\oddsidemargin}

\usepackage{multicol}

\usepackage{index}
\makeindex
\newindex{aut}{adx}{and}{著者索引}

\makeatletter
\newcounter{IndexColNum}
\setcounter{IndexColNum}{2}% set default

\newcommand{\setIndexColNum}[1]{%
\setcounter{IndexColNum}{#1}
% from: jsbook.cls
\renewenvironment{theindex}{% -- \begin{theindex} --
    \edef\indexname{\the\@nameuse{idxtitle@\@indextype}}% from: index.sty
    %\if@twocolumn
    %  \onecolumn\@restonecolfalse
    %\else
    %  \clearpage\@restonecoltrue
    %\fi
    \columnseprule.4pt \columnsep 2zw
    \ifx\multicols\@undefined
      \twocolumn[\@makeschapterhead{\indexname}%
      \addcontentsline{toc}{chapter}{\indexname}]%
    \else
      \ifnum\value{IndexColNum}=1\relax
        \chapter*{\indexname}
        \addcontentsline{toc}{chapter}{\indexname}
      \else
        \ifdim\textwidth<\fullwidth
          \setlength{\evensidemargin}{\oddsidemargin}
          \setlength{\textwidth}{\fullwidth}
          \setlength{\linewidth}{\fullwidth}
          \begin{multicols}{\value{IndexColNum}}[\chapter*{\indexname}%
          \addcontentsline{toc}{chapter}{\indexname}]%
        \else
          \begin{multicols}{\value{IndexColNum}}[\chapter*{\indexname}%
          \addcontentsline{toc}{chapter}{\indexname}]%
        \fi
      \fi
    \fi
    \@mkboth{\indexname}{}%
    \plainifnotempty % \thispagestyle{plain}
    \parindent\z@
    \parskip\z@ \@plus .3\jsc@mpt\relax
    \let\item\@idxitem
    \raggedright
    \footnotesize\narrowbaselines
  }{% -- \end{theindex} --
    \ifx\multicols\@undefined
      \if@restonecol\onecolumn\fi
    \else
      \ifnum\value{IndexColNum}=1\relax
      \else
        \end{multicols}
      \fi
    \fi
    %\clearpage
  }%
}
\makeatother


\begin{document}

\setIndexColNum{1}
\printindex

\setIndexColNum{2}
\printindex[aut]

\end{document}
前田 やえの への返信

Re: 1段索引と2段索引との並存

- 前田 やえの の投稿
1段索引と2段索引との並存

一応なんとか解決しました。
解決ファイル index_example を梱包しました。
見ての通りプログラム論理がきれいでなく
「オーソドックス」な解決でないかも。

前田 やえの への返信

Re: 1段索引と2段索引との並存

- 和田 勇 の投稿
◆カスタマイズされた時の参照されたものは article クラスなのかしら?それとお使いの LaTeX のバージョンは何を使われていますか?

jsbook を使うと宣言されているものの、カスタマイズに参考にされたものを見ると 「% \twocolumn[\section*{\indexname}]% 」とarticle クラスのものを
参照されているように見受けられます。この影響か否か調べていませんが、「数学者達」の扉ページにタイトルが表示できていないようです。

また、TeXLive のバージョンも 2015 以前のようなところも見受けられます。

「索引2段に戻す.tex」のカスタマイズされた情報を 2020 の jsbook.cls を見ると以下のような差があります。

    \@mkboth{\indexname}{}%
    \plainifnotempty % \thispagestyle{plain}
    \parindent\z@
   - \parskip\z@ \@plus .3\jsc@mpt\relax   ← texlive2020 のもの
   + \parskip\z@ \@plus .3\p@\relax     ←前田さんのカスタマイズ内容のもの
    \let\item\@idxitem
    \raggedright
    \footnotesize\narrowbaselines

できれば article book どちらかで統一して参照・カスタマイズされる方が良いと思います。
&業務の都合で等がなければ新しいものを使うことをお勧めします。


◆「数学者達」の索引開始ページにタイトルが表示されていません(上述すみ)

前田さんの方法ですと「数学者達」の情報がヘッダーには反映されるものの、開始ページにそのタイトルが表示されませんが、それで構いませんか?

それとも同梱されていなかった「題字をcentering.tex」のなかで何か対応しているのかな?

添付の「2つのprintindexの実験-前田案.tex」を参考にして下さい。

(前田さんの案をベースに、 printindex の部分を一段組・二段組に切り替えるマクロも採用してあります)
(先日の百人一首のデータも使っています)

◆ printindex に関わるマクロ作成してみました。
multicol を直接使って索引を読み込む方法もありますが....

呼び方 \索引{1}{数学者達}
    \索引{2}{事項索引}
前提  以下のように newindex を二つ定義する(索引の種類を見分けやすいように日本語にしてみました)
      \newindex{数学者達}{adx}{and}{数学者達}
      \newindex{事項索引}{idx}{ind}{事項索引}
   その上で以下のように index を作成する
     \index[数学者達]{Leibniz@Leibniz(1646-1716)}
\index[事項索引]{しゅうそく@収束}

添付の「2つのprintindexの実験-わだ案.tex」を参考にして下さい。
先日と同じ jsbook ベースでカスタマイズしたもの。

◆ LaTeX で「{」と「}」のブロック構造の効果

ご存知かもしれませんが、他のコンピュータ言語と同様に「{」と「}」でブロック構造を書くことがあります。
この意味するところはその内側で変更した情報は、ブロックを抜け出たらその効果は、ブロックに入る前の状態に戻ります。

\def\コマンド{\typeout{外側の定義}}
\コマンド
{
\typeout{ブロックの中に入った}
\def\コマンド{\typeout{ブロック内の定義}}
\コマンド
\typeout{ブロックから出る}
}
\コマンド

    外側の定義            ← jsbook.cls で \newenvironment{theindex} と定義される
    ブロックの中に入った       ← {
    ブロック内の定義         ← 一段組用 \renewenvironment{theindex} & 一段組索引
    ブロックから出る         ← }
    外側の定義            ←二段組索引

当初たたき台にあげたカスタマイズでは、この仕組みを使って、二段組の定義を再定義しないようにしていました。

◆添付ファイル情報
updating: index_exampl2/2つのprintindexの実験-前田案.tex (deflated 62%)
updating: index_exampl2/2つのprintindexの実験-わだ案.tex (deflated 55%)
updating: index_exampl2/100-nin-1-syu.tex (deflated 68%)
北見 けん への返信

Re: 1段索引と2段索引との並存

- 前田 やえの の投稿
% 何回もお世話になっています。そもそも1段組の索引のtheindex環境
%がよくわかっていなかった自分に気がつきました。
\documentclass{jsbook}
%
%これは
% Re: 索引の段組
% 2011年 07月 14日(木曜日) 19:21 - TONE Kozaburo の投稿
% から借用させていただいております
% から持ってきたものです。
% 1.題字の「索引」が行の中でcenteringするにはどうすれば良いのか
% 2.ページ上端右(左)端に「索引」を出したい
% 3.本の目次に載せたい
%すみませんがよろしく、
\usepackage{makeidx}
\makeatletter
\renewenvironment{theindex}% renew
{\if@twocolumn
\@restonecolfalse
\else
\@restonecoltrue
\fi
% \twocolumn[\section*{\indexname}]% original
\section*{\indexname}%
\@mkboth{\MakeUppercase\indexname}%
{\MakeUppercase\indexname}%
\thispagestyle{plain}\parindent\z@
\parskip\z@ \@plus .3\p@\relax
\columnseprule \z@
\columnsep 35\p@
\let\item\@idxitem}
{\if@restonecol\onecolumn\else\clearpage\fi}
\makeatother
\makeindex
\begin{document}

hoge\index{hogehogehogehogehogehogehogehogehogehogehogehogehoge}

fuga\index{fugafuga}

\printindex

\end{document}

前田 やえの への返信

Re: 1段索引と2段索引との並存

- 和田 勇 の投稿
◆1.題字の「索引」が行の中でcenteringするにはどうすれば良いのか

\section*{\indexname}
↓↓↓↓
\section*{\centering{\indexname}}

◆2.ページ上端右(左)端に「索引」を出したい

jsbook の場合、章(chapter) や節 (section) の開始扉のページには通常ヘッダー・フッターは表示されません。ヘッダーと扉ページのタイトルが重複・冗長的になるることを避けるためだと思います。それでも扉ページにヘッダーを表示したい場合は再度その旨質問して下さい。

またご希望の「ページ上端右(左)端」ようにするには索引ページが二ページ以上になるよう index 項目を作成する必要があります。

◆3.本の目次に載せたい
1) 再定義した theindex に記述された 「sectin*{...} 」という指示にある「*」は番号などを非表示にする他、目次対象外の指示でもあるので、以下のように addcontentsline で目次項目を明示的に追加指定します。

  \section*{\centering{\indexname}}%
  \addcontentsline{toc}{section}{\indexname}

2) 目次を表示したい場所に \tableofcontents を記述する
3) 索引の前に chapter や section があると、「索引」が最後のものの付属のように表示されてしまう恐れがあるので printindex の直前に以下のような対処が必要になる場合もあります。

  \chapter*{付録}
  \addcontentsline{toc}{chapter}{付録}
  \printindex

4) 目次出力のために dvipdfmx 直前にも追う一回 platex を実行

  t=$(basename $1 .tex)
  rm -f ${t}.adx ${t}.and ${t}.aux ${t}.dvi ${t}.idx ${t}.ilg ${t}.ind ${t}.log ${t}.pdf

  platex -src -jobname=${t} ${t}.tex
  mendex -o ${t}.ind ${t}.idx
  mendex -o ${t}.and ${t}.adx # 今回はここ不要?
  platex -src ${t}.tex
  platex -src ${t}.tex # 目次出力用
  dvipdfmx ${t}