mendexk2.6e/0040755017777600000030000000000010671462056012025 5ustar nobodysysmendexk2.6e/.libs/0040775017777600000030000000000010242253524013026 5ustar nobodysysmendexk2.6e/COPYRIGHT.jis0100664017777600000030000000335610242253524014102 0ustar nobodysys($BCm(B) $B0J2<$O!"1QJ8$N7@Ls>r9`$rF|K\8l$KK]Lu$7$?$b$N$G$"$k!#F|K\8lLu$H1Q(B $B8lI=5-$N4V$Ksrsw$,$"$C$?>l9g$K$O!"7@Ls>r7o$O1Q8lI=5-$K$h$k7@Ls>r9`$K=>(B $B$&!#(B $B!ZCx:n8"I=<(![(B Copyright (C) 1995 ASCII Corporation. All rights reserved. $B!Z7@Ls>r7o![(B $B2~JQ$NM-L5$K$+$+$o$i$:!"K\%=%U%H%&%'%"$N%=!<%9%3!<%I5Z$S%P%$%J%j!<%3!<(B $B%I7A<0$K$h$k:FHRI[5Z$S;HMQ$O!"r7o$N2<$K5vBz$5$l$k!#(B 1. $B%=!<%9%3!<%I$N:FHRI[$K:]$7$F$O!">e5-$N!ZCx:n8"I=<(![!"$3$N!Z7@Ls>r(B $B7o![5Z$Sr9`![$NI=5-$r!"0z$-B3$-0];}$7$FL@5-$7$J$1$l$P$J(B $B$i$J$$!#(B 2. $B%P%$%J%j!<7A<0$K$h$k:FHRI[$K:]$7$F$O!">e5-$N!ZCx:n8"I=<(![!"$3$N(B $B!Z7@Ls>r7o![5Z$Sr9`![$r!":FHRI[$K:]$7Ds6!$9$k@bL@=q5Z$S(B $B$=$NB>$N4XO";qNA$K2~$a$FL@5-$7$J$1$l$P$J$i$J$$!#(B 3. $BFCJL$J;vA0$N=qLL$K$h$k5vBz$,$J$$8B$j!"K\%=%U%H%&%'%"$+$iGI@8$7$?@=(B $BIJ$r?d>)Kt$O@kEA$9$k$?$a$K!"Cx:n8"$O;HMQ$7$F$O$J$i$J$$!#(B $B!ZLH@U>r9`![(B $BK\%=%U%H%&%'%"$O!"Cx:n8"uM-;Q$N$^$^!J$=$N$^$^$N7A$G!K!W(B $BDs6!$5$l$k$b$N$G$"$j!">&IJ@-Kt$OFCDjL\E*$X$NE,9g@-$K4X$9$kL[<(E*J]>Z$J(B $B$I!"L@<(Kt$OL[<($NJ]>Z$rLd$o$:!"$$$+$J$kJ]>Z$r$b9T$&$b$N$G$O$J$$!#(B $B$$$+$J$kM}M3$K$h$C$F$b!"$^$?!"7@Ls@UG$!"873J@UG$Kt$O!J2a<:$K$h$k$b$N$r(B $B4^$`!KITK!9T0Y@UG$$rLd$o$:$I$N$h$&$J@UG$$NM}O@$K$h$C$F$b!"Cx:n8"l9g$b!"K\%=%U%H%&%'%"$r;HMQ$9$k$3$H$K$h$jH/@8$9$k!"$"$i$f$kD>(B $B@\B;32!"4V@\B;32!"6vH/B;32!"FCJLB;32!"D(H3E*B;32$"$k$$$OGI@8E*B;32!JBe(B $BBX@=IJ!&BeBX%5!<%S%9$ND4C#!";HMQMx1W!"%G!<%?Kt$O<}1W$K4X$9$kB;<:!"1D6H(B $BCfCG$K$h$kB;<:$J$I!K$K$D$$$F2?$i$N@UG$$bIi$o$J$$!#$3$l$O!"K\%=%U%H%&%'(B $B%"$r;HMQ$9$k$3$H$K$h$j!"$3$l$i$NB;32$,H/@8$9$k2DG=@-$K$D$$$F!"$"$i$+$8(B $B$a<(:6$5$l$F$$$?>l9g$G$"$C$F$bF1MM$G$"$k!#(B mendexk2.6e/COPYRIGHT0100664017777600000030000000257210242253524013315 0ustar nobodysysCopyright (C) 1995 ASCII Corporation. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. Neither the name of the author may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. mendexk2.6e/ChangeLog0100644017777600000030000000636410671461557013612 0ustar nobodysysmendex 変更履歴 2.3c->2.3e ・同じ索引語が64個までしか処理できなかった制限をなくした。また、EUCのコンパイラ でSJIS対応のバイナリを作れるように修正。 2.3e->2.3f ・preamble,postambleが複数行にわたるとおかしくなるバグを修正。また、索引項目中 の"\"の処理がおかしかった箇所を修正。 2.3f->2.3g ・同じ索引項目の上限が128個であったのを2147483648個(int型の上限)まで拡張。 ・*.indファイル生成用の文字列領域を拡張。 2.3g->2.3h ・全索引項目数が4096個までになっていたのでこの制限をなくした。 ・ページ範囲の処理にバグがあったので修正。 2.3h->2.4a ・ページのソート処理にバグがあったので修正。 ・ページ範囲の処理にまだ問題があったので修正。 ・kpathsea-3.0へ対応(kpathsea-2.6, kpathseaなしでも可)。 ・makeindexに合わせるために環境変数名を変更。 INDEXSTYLE -> INDEXDEFAULTSTYLE INDEXSTYLES -> INDEXSTYLE MENDEX_DICTIONARY -> INDEXDEFAULTDICTIONARY INDEXDICTS -> INDEXDICTIONARY 2.4a->2.4b ・ページ範囲の始めと終わりが同じ場合には範囲表現をしないように修正。 ・ページ番号にコマンドを付ける場合の動作についてmakeindexとの互換性を向上。 2.4b->2.4c ・「ぬ」の後の音引きの変換に失敗するバグを修正。 2.4c->2.4d ・ページ番号のソート処理にバグがあったので修正。 2.4d->2.4e ・主索引項目の下に2つ以上の副索引項目がある場合に、副索引間のコマンド文字列が おかしい場合があったので修正。 2.4e->2.4f ・主索引項目の下に2つ以上の副索引項目がある場合に、副索引間のコマンド文字列が おかしい場合があったので修正。 ・Shift-JIS処理時に、ページ番号に付加するコマンドに2バイト文字が使用された場合に 動作がおかしくなるので修正。 2.4f->2.5 ・-s オプション使用時にスタイルパラメータ escape の値がおかしくなっていたので 修正。 ・makeindexに合わせるため、以下ように仕様を変更。 1. -c オプション時の動作を修正。makeindex では索引語の前後の空きを削除するが、 mendex では空きが残っていたので、削除するようにした。 2. makeindex で使用されているスタイルパラメータのうち、mendexでサポートされて いなかったものを追加サポート。 delim_t suffix_2p suffix_3p suffix_mp heading_flag heading_prefix symhead_positive symhead_negative ただし、以下の makeindex 用パラメータは無視される。 numhead_positive numhead_negative 3. escape の仕様を変更。arg_open, arg_close をエスケープ可能にした。このため、 escape が1つだけの項目は受け付けられなくなった。 4. エントリ中で actual の後に項目が無い場合に、actual の前の文字列を項目とする ように変更。 5. エントリ中で level の後に項目が無い場合、level を無視するように変更。 2.5->2.5a ・引数の入力ファイル名から拡張子(.idx)を省略した場合にエラーが発生するバグを 修正。 2.5a->2.6 ・不正な索引行の読み込みを禁止するよう修正。 ・インストールにconfigureを使用するように変更。 ・漢字コードオプションを追加。 2.6->2.6a ・kana.h, ktable.h中の漢字コード記述をEUCに変更。 ・usageおよび読み込みエラー表示時の漢字コードを修正。 2.6a->2.6b ・読み展開時のエラー表示の漢字コードを修正。 ・非漢字部の範囲を厳密化。 2.6b->2.6c ・SJISモード時の出力の文字化けを修正。 ・出力メッセージ中のaccept、rejectの数値を修正。 ・teTeXのconfigureで指定されたコンパイラを使用するようにMakefile.inを修正。 2.6c->2.6d ・非GNU環境でのインストールのためにMakefile.inを修正。 ・ページ番号部に漢字がある場合の文字化けを修正(ただしページ番号としては処理 されない)。 2.6d->2.6e ・行長制限を1024バイトから65536バイトへ変更 mendexk2.6e/Makefile.in0100644017777600000030000000161010242253745014062 0ustar nobodysys# Makefile for mendex PROGRAM = mendex KANJI = @KANJI@ ac_include ../make/paths.mk ac_include ../make/common.mk CFLAGS = @CFLAGS@ @KFLAGS@ -D$(KANJI) PROGLINK = @KPATHLINK@ $(OBJS) @LIBKPATHSEA@ OBJS = main.o convert.o sort.o fread.o fwrite.o styfile.o pageread.o kp.o LIBTOOL = @KLIBTOOL@ link_command = $(CC) -o $(PROGRAM) $(LDFLAGS) kpathsea_link = $(LIBTOOL) @LINKMODE@ $(link_command) $(PROGRAM): $(OBJS) @LIBKPATHSEA@ $(PROGLINK) main.o:main.c var.h kana.h kp.h convert.o:convert.c exvar.h exkana.h ktable.h kp.h sort.o:sort.c exvar.h exkana.h fread.o:fread.c exvar.h exkana.h fwrite.o:fwrite.c exvar.h exkana.h styfile.o:styfile.c exvar.h kp.h pageread.o:pageread.c kp.o: kp.c kp.h install: $(PROGRAM) $(INSTALL_LIBTOOL_PROG) $? $(bindir) clean: $(RM) *.o mendex distclean: $(RM) *.o *.core *.idx *.ind *.sty *.ist *.tex *.log *.aux *.dvi *.dic *.ilg $(PROGRAM) Makefile config.sed mendexk2.6e/README0100644017777600000030000000645310671462013012703 0ustar nobodysys<索引整形ツール mendex ver.2.6e> 株式会社アスキー www-ptex@ascii.co.jp mendex は makeindex 互換のLaTeX用索引整形ツールです。 makeindexは基本的に欧文用であり、和文を扱う上で色々と手間が掛かります。 それらの手間を減らすように新たに作成されたのがmendexです。 <特徴> ・基本的にmakeindex互換だが、以下の点で非互換。 1. makeindexには索引項目の分類として「記号」、「アルファベット」の他に、 数字のみの項目として「数字」という分類がある。mendexでは数字は「記号」に 含まれる。 また、以下のmakeindex用スタイルパラメータは認識されない。 numhead_positive numhead_negative 2. makeindexの項目の並び順は、頭文字は「記号」「数字」「アルファベット」に 分けて並べられるが、2文字目以降は単純にASCIIコード順となり、記号より アルファベットが先になる場合もある。 mendexの英数字の並びは、2文字目以降も「記号」「数字」「アルファベット」の 分類が考慮される。 3. makeindexには -g オプションでドイツ語辞書順(記号->アルファベット小文字-> アルファベット大文字->数字)で並べるようにできるが、mendexではサポート しない。 -g は和文頭文字の区切りを切り換えるオプションとして扱う。 ・和文索引の読みの入力を減らすために、読みと熟語を対応させる辞書ファイルを使用。 ・和文の読みは辞書順に自動変換。 ・数字・記号->欧文->和文の順にこだわらない索引の作成が可能。 ・makeindexと比べて実行速度が非常に遅い。 <動作環境> FreeBSD 5.3 にて動作確認。 <プログラムのコンパイル/インストール> このmendexにはTeX ver.3のディレクトリ検索に対応するために、淺山 和典氏 (asayama@vid.cpg.sony.co.jp)によるkpathseaライブラリ対応差分をあててあります。 対応している検索ライブラリは kpathsea-2.6, 3.3, 3.4, 3.5 です。 1. このディレクトリを tetex-src の texk ディレクトリの下に展開します。 tetex-3.0 の場合は tetex-src-3.0/texk/mendexk2.6e ディレクトリになります。 tetex-src は全体をあらかじめ make しておいてください。 2. configure を実行します。その際、デフォルトの漢字コードを指定します。 対応している漢字コードは JIS, SJIS, EUC です。 例: EUCで使用する場合 ./configure EUC 3. make ; make install を実行します。 コンパイル時にkpathseaライブラリを使用した場合、texmf.cnf や環境変数で以下の 変数を設定すればそれを参照します。 ・INDEXSTYLE 索引スタイルファイルがあるディレクトリ ・INDEXDEFAULTSTYLE デフォルトで参照する索引スタイルファイル ・INDEXDICTIONARY 辞書があるディレクトリ ・INDEXDEFAULTDICTIONARY 常に参照する辞書ファイル これらは、ディレクトリ名を ':' (Windows では ';') で区切って並べます(TEXINPUTS などと同じ)。TEXINPUTS と同様、"//" は再帰的な検索を意味します。 これらの変数がどこにも設定されていなければコンパイル時に main.c 冒頭の DEFAULT_INDEXSTYLES、DEFAULT_INDEXDICTS で指定したディレクトリを用います (デフォルトでは、双方 "." が指定してあります)。 これらの環境変数が設定されていなければ texmf.cnf に設定された変数を検索します。 texmf.cnf 内では、TeXなどと同様に、INDEXSTYLE.mendex のようにプログラム名を 限定して指定することも出来ます。 また、INDEXDEFAULTDICTIONARY に辞書ファイル名を設定しておけば常にその辞書を 参照します。 <配布条件等> mendexの使用および配布に関しては、付属のCOPYRIGHTファイルを参照してください。 <問い合わせ先> mendexについてのお問い合わせは、電子メールで www-ptex@ascii.co.jp 宛てにお願い します。 mendexk2.6e/configure0100755017777600000030000000364410356653213013735 0ustar nobodysys#!/bin/sh # progname=`basename $0` termcode= configopt= printUsage () { echo "Usage: $progname {EUC|JIS|SJIS}" exit 1 } if [ ! -f ../config.status ]; then echo "../config.status not found." echo "please make orignal Web2c programs before make mendex." exit 1 fi # 引数チェック test -z "$*" && printUsage case $1 in [Ss][Jj][Ii][Ss]) termcode="SJIS" ;; [Jj][Ii][Ss]) termcode="JIS" ;; [Ee][Uu][Cc]) termcode="EUC" ;; *) echo "unknown option $1"; printUsage ;; esac CONFIGSED=config.sed echo "s%@configopt@%$*%g" > $CONFIGSED echo "s%@TERMCODE@%$termcode%g" >> $CONFIGSED case $termcode in "SJIS") echo "s%@KANJI@%SJIS%g" >> $CONFIGSED ;; "JIS") echo "s%@KANJI@%JIS%g" >> $CONFIGSED ;; *) echo "s%@KANJI@%EUC%g" >> $CONFIGSED ;; esac # kpathseaライブラリチェック if [ -f ../kpathsea/libkpathsea.la ]; then echo "s%@KFLAGS@%-DKPATHSEA -DKPATHSEA3%" >> $CONFIGSED ; echo "s%@KPATHLINK@%\\\$(kpathsea_link)%" >> $CONFIGSED ; echo "s%@LIBKPATHSEA@%../kpathsea/libkpathsea.la%" >> $CONFIGSED ; elif [ -f ../kpathsea/kpathsea.a ]; then echo "s%@KFLAGS@%-DKPATHSEA%" >> $CONFIGSED ; echo "s%@KPATHLINK@%\\\$(kpathsea_link)%" >> $CONFIGSED ; echo "s%@LIBKPATHSEA@%../kpathsea/kpathsea.a%" >> $CONFIGSED ; else echo "s%@KFLAGS@%%" >> $CONFIGSED ; echo "s%@KPATHLINK@%%" >> $CONFIGSED ; echo "s%@LIBKPATHSEA@%%" >> $CONFIGSED ; fi if [ -f ../kpathsea/libtool ]; then echo "s%@KLIBTOOL@%../kpathsea/libtool%" >> $CONFIGSED ; echo "s%@LINKMODE@%--mode=link%" >> $CONFIGSED ; elif [ -f ../kpathsea/klibtool]; then echo "s%@KLIBTOOL@%../kpathsea/klibtool%" >> $CONFIGSED ; echo "s%@LINKMODE@%link%" >> $CONFIGSED ; else echo "s%@KLIBTOOL@%%" >> $CONFIGSED ; echo "s%@LINKMODE@%%" >> $CONFIGSED ; fi # Makefile の作成 CONFIG_FILES=Makefile CONFIG_HEADERS=.. export CONFIG_FILES CONFIG_HEADERS ../config.status TMPFILE=makefile.tmp sed -f $CONFIGSED Makefile > $TMPFILE mv -f $TMPFILE Makefile exit 0 mendexk2.6e/convert.c0100644017777600000030000002570010242253524013642 0ustar nobodysys #include #include #include #include "exkana.h" #include "ktable.h" #include "exvar.h" #ifdef KPATHSEA #include "kp.h" extern KpathseaSupportInfo kp_dict; #endif extern char *mfgets(); extern int convputs(); struct dictionary{ unsigned char dic[2][50]; }; struct dictionary *dictable,*envdic; int dlines=0,elines=0; int initkanatable() /* initialize kana table */ { int i,j,cc; for (i=0xa4a1;i<=0xa4f3;i++) { cc=i-0xa4a1; hiragana[cc*2]=(unsigned char)((i>>8)&0xff); hiragana[cc*2+1]=(unsigned char)(i&0xff); } hiragana[(i-0xa4a1)*2]=0; for (i=0xa5a1;i<=0xa5f6;i++) { cc=i-0xa5a1; katakana[cc*2]=(unsigned char)((i>>8)&0xff); katakana[cc*2+1]=(unsigned char)(i&0xff); } katakana[(i-0xa5a1)*2]=0; akasatana=strdup(AKASATANA); for (i=0;;i++) { if (akasatana[i*2]==0) break; akasatana[i*2]++; } aiueo=strdup(AIUEO); for (i=0;;i++) { if (aiueo[i*2]==0) break; aiueo[i*2]++; } strcpy(atama,akasatana); } int dicread(filename) /* get dictionary */ char *filename; { int i,j,k,l,ecount=0; char *envfile,buff[4096]; FILE *fp; if (filename!=NULL) { #ifdef KPATHSEA filename = KP_find_file(&kp_dict,filename); #endif fp=fopen(filename,"r"); if (fp==NULL) { fprintf(stderr,"Warning: Couldn't find dictionary file %s.\n",filename); if (efp!=stderr) fprintf(efp,"Warning: Couldn't find dictionary file %s.\n",filename); warn++; goto ENV; } if (verb!=0) fprintf(stderr,"Scanning dictionary file %s.",filename); if (efp!=stderr) fprintf(efp,"Scanning dictionary file %s.",filename); for (i=0;;i++) { if (mfgets(buff,4095,fp)==NULL) break; if ((buff[0]=='\n')||(buff[0]=='\0')) i--; } fclose(fp); dictable=(struct dictionary *)malloc(sizeof(struct dictionary)*i); dlines=dicvalread(filename,dictable,i); if (verb!=0) fprintf(stderr,"...done.\n"); if (efp!=stderr) fprintf(efp,"...done.\n"); } ENV: #ifdef KPATHSEA #ifdef KPATHSEA3 envfile=KP_get_value("INDEXDEFAULTDICTIONARY",NULL); #else envfile=KP_get_value("INDEXDEFAULTDICTIONARY","INDEXDEFAULTDICTIONARY",NULL); #endif #else envfile=getenv("INDEXDEFAULTDICTIONARY"); #endif if ((envfile!=NULL)&&(strlen(envfile)!=0)) { #ifdef KPATHSEA envfile = KP_find_file(&kp_dict,envfile); #endif fp=fopen(envfile,"r"); if (fp==NULL) { fprintf(stderr,"Warning: Couldn't find environment dictionary file %s.\n",envfile); if (efp!=stderr) fprintf(efp,"Warning: Couldn't find environment dictionary file %s.\n",envfile); warn++; return ecount; } if (verb!=0) fprintf(stderr,"Scanning environment dictionary file %s.",envfile); if (efp!=stderr) fprintf(efp,"Scanning environment dictionary file %s.",envfile); for (i=0;;i++) { if (mfgets(buff,255,fp)==NULL) break; if ((buff[0]=='\n')||(buff[0]=='\0')) i--; } fclose(fp); envdic=(struct dictionary *)malloc(sizeof(struct dictionary)*i); elines=dicvalread(envfile,envdic,i); if (verb!=0) fprintf(stderr,"...done.\n"); if (efp!=stderr) fprintf(efp,"...done.\n"); } } int dicvalread(filename,dicval,line) /* read dictionary file */ char *filename; struct dictionary *dicval; int line; { int i,j,k,l,cc; unsigned char buff[256]; FILE *fp; int dcomp(); fp=fopen(filename,"r"); for (i=0;i(*buff2).dic[0][i]) return -1; } return 0; } int convert(buff1,buff2) /* convert to capital-hiragana character */ unsigned char *buff1,*buff2; { int i=0,j=0,k,l,cc; unsigned char str[2]; char errbuff[4096]; while(1) { if (buff1[i]=='\0') { buff2[j]='\0'; break; } else { if ((buff1[i]>='a')&&(buff1[i]<='z')) { buff2[j]=buff1[i]-32; i++; j++; } else if ((lorder==1)&&((buff1[i]==' ')||(buff1[i]=='\t'))) { i++; } else if (buff1[i]<0x80) { buff2[j]=buff1[i]; i++; j++; } else if ((strncmp(&buff1[i],KATATOP,2)>=0)&&(strncmp(&buff1[i],KATAEND,2)<=0)) { /* katakana */ for (k=0;k=0)&&(strncmp(&buff1[i],HIRAEND,2)<=0)) { /* hiragana */ for (k=0;k=2) { for (k=0;k<20;k+=2) { for (l=0;l<6;l++) { if (strncmp(&buff2[j-2],&btable[l][k],2)==0) { strncpy(&buff2[j],&btable[l][0],2); goto MATCH3; } } } } sprintf(errbuff,"\nError: %s is Illegal line ",buff1); convputs(errbuff,efp); if (efp!=stderr) convputs(errbuff,stderr); return -1; MATCH3: i+=2; j+=2; } else if (buff1[i]>=0x80) { if ((strncmp(&buff1[i],SPACE,2)>=0)&&(strncmp(&buff1[i],ALPHAEND,2)<=0)) { /* alpha-numeric,symbols */ for (k=0;k='a')&&(buff2[j]<='z')) buff2[j]-=32; j++; i+=2; break; } } if (k==strlen(symboltable)) { buff2[j++]=buff1[i++]; buff2[j++]=buff1[i++]; } } else { for (k=0;k>8) & 0xff; low = c & 0xff; nh = ((high-0x21)>>1) + 0x81; if (nh>0x9f) nh += 0x40; if (high & 1) { nl = low + 0x1f; if (low>0x5f) nl++; } else nl = low + 0x7e; if (((nh >= 0x81 && nh <= 0x9f) || (nh >= 0xe0 && nh <= 0xfc)) && (nl >= 0x40 && nl <= 0xfc && nl != 0x7f)) return (nh<<8) | nl; else return 0x813f; } int SJIStoJIS(c) int c; { int byte1,byte2; byte1 = (c>>8) & 0xff; byte2 = c & 0xff; byte1 -= ( byte1>=0xa0 ) ? 0xc1 : 0x81; c = ((byte1<<1) + 0x21)<<8; if( byte2>=0x9f ) { c += 0x0100; c |= (byte2 - 0x7e) & 0xff; } else { c |= (byte2 - ((byte2<=0x7e) ? 0x1f : 0x20 )) & 0xff; } return c; } mendexk2.6e/exkana.h0100644017777600000030000000053510242253524013435 0ustar nobodysysextern unsigned char AKASATANA[]; extern unsigned char *akasatana; extern unsigned char AIUEO[]; extern unsigned char *aiueo; extern unsigned char ONBIKI[]; extern unsigned char SPACE[]; extern unsigned char ALPHAEND[]; extern unsigned char HIRATOP[]; extern unsigned char HIRAEND[]; extern unsigned char KATATOP[]; extern unsigned char KATAEND[]; mendexk2.6e/exvar.h0100644017777600000030000000304110354111446013306 0ustar nobodysysstruct page { char *page; char *enc; char attr[3]; }; struct index { int num; char words; unsigned char *org[3]; unsigned char *dic[3]; unsigned char *idx[3]; struct page *p; int lnum; }; extern FILE *efp; #define Euc 0 #define Jis 1 #define Sjis 2 extern int kanji; extern int lines,idxcount,acc,reject; extern int prange,fsti,lorder,bcomp,force,fpage,gflg,verb,debug; extern int warn,scount,pattr[3]; extern struct index *ind; extern char keyword[2048]; extern char arg_open,arg_close; extern char range_open,range_close; extern char level,actual,encap,quote,escape; extern char preamble[2048],postamble[2048]; extern char setpage_prefix[2048],setpage_suffix[2048]; extern char group_skip[2048]; extern char lethead_prefix[2048],lethead_suffix[2048]; extern int lethead_flag; extern char item_0[2048],item_1[2048],item_2[2048]; extern char item_01[2048],item_x1[2048],item_12[2048],item_x2[2048]; extern char delim_0[2048],delim_1[2048],delim_2[2048],delim_n[2048],delim_r[2048],delim_t[2048]; extern char suffix_2p[2048],suffix_3p[2048],suffix_mp[2048]; extern char encap_prefix[2048],encap_infix[2048],encap_suffix[2048]; extern int line_max; extern char indent_space[2048]; extern int indent_length; extern int priority; extern char symbol[2048]; extern char symhead_positive[2048],symhead_negative[2048]; extern char numhead_positive[2048],numhead_negative[2048]; extern int symbol_flag; extern int letter_head; extern unsigned char atama[2048]; extern unsigned char page_compositor[2048],page_precedence[2048]; extern char character_order[2048]; mendexk2.6e/fread.c0100644017777600000030000003620710671461360013254 0ustar nobodysys#include #include #include #include "exkana.h" #include "exvar.h" #define BUFSIZE 65535 char *mfgets(); extern char *convcode(); int idxread(filename,start) /* read idx file */ char *filename; int start; { int i,j,k,l,m,n,cc,indent,wflg,flg,bflg=0,nest,esc,quo,eflg=0,pacc,preject; unsigned char buff[BUFSIZE],wbuff[BUFSIZE],estr[256],table[BUFSIZE],tbuff[256],*tmp1,*tmp2; FILE *fp; pacc=acc; preject=reject; if (filename==NULL) { fp=stdin; if (verb!=0) fputs("Scanning input file stdin.",stderr); if (efp!=stderr) fputs("Scanning input file stdin.",efp); } else { fp=fopen(filename,"r"); if (fp==NULL) { sprintf(buff,"%s.idx",filename); fp=fopen(buff,"r"); if (fp==NULL) { if (verb!=0) fprintf(stderr,"Warning: Couldn't find input file %s.\n",filename); if (efp!=stderr) fprintf(efp,"Warning: Couldn't find input file %s.\n",filename); warn++; return 1; } else strcpy(filename,buff); } if (verb!=0) fprintf(stderr,"Scanning input file %s.",filename); if (efp!=stderr) fprintf(efp,"Scanning input file %s.",filename); } for (i=start,n=1;;i++,n++) { if (!(i%100)) ind=(struct index *)realloc(ind,sizeof(struct index)*(i+100)); LOOP: ind[i].lnum=n; if (mfgets(buff,sizeof(buff)-1,fp)==NULL) break; for (j=bflg=cc=0;j0) { nest--; wbuff[k]=buff[j]; continue; } if (nest==0) { if (buff[j]==level) { esc=0; if (indent>=2) { fprintf(efp,"\nError: Extra `%c\' in %s, line %d.",level,filename,ind[i].lnum); if (efp!=stderr) fprintf(stderr,"\nError: Extra `%c\' in %s, line %d.",level,filename,ind[i].lnum); eflg++; reject++; n++; goto LOOP; } ind[i].idx[indent]=(unsigned char *)malloc(k+1); if (ind[i].idx[indent]==NULL) { fprintf(stderr,"Malloc error.(ind[%d].idx[%d])\n",i,indent); exit(-1); } strncpy(ind[i].idx[indent],wbuff,k); ind[i].idx[indent][k]='\0'; if (!wflg) ind[i].org[indent]=NULL; indent++; wflg=0; k= -1; continue; } else if (buff[j]==actual) { esc=0; if (wflg) { fprintf(efp,"\nError: Extra `%c\' in %s, line %d.",actual,filename,ind[i].lnum); if (efp!=stderr) fprintf(stderr,"\nError: Extra `%c\' in %s, line %d.",actual,filename,ind[i].lnum); eflg++; reject++; n++; goto LOOP; } ind[i].org[indent]=(unsigned char *)malloc(k+1); if (ind[i].org[indent]==NULL) { fprintf(stderr,"Malloc error.(ind[%d].org[%d])\n",i,indent); exit(-1); } strncpy(ind[i].org[indent],wbuff,k); ind[i].org[indent][k]='\0'; wflg=1; k= -1; continue; } else if ((esc==0 && buff[j]==arg_close) || buff[j]==encap) { esc=0; if (buff[j]==encap) { j++; cc=getestr(&buff[j],estr); if (cc<0) { fprintf(efp,"\nBad encap string in %s, line %d.",filename,ind[i].lnum); if (efp!=stderr) fprintf(stderr,"\nBad encap string in %s, line %d.",filename,ind[i].lnum); eflg++; reject++; n++; goto LOOP; } j+=cc; } else estr[0]='\0'; ind[i].idx[indent]=(unsigned char *)malloc(k+1); if (ind[i].idx[indent]==NULL) { fprintf(stderr,"Malloc error.(ind[%d].idx[%d])\n",i,indent); exit(-1); } strncpy(ind[i].idx[indent],wbuff,k); ind[i].idx[indent][k]='\0'; if (strlen(ind[i].idx[indent])==0) { if (wflg) { strcpy(ind[i].idx[indent],ind[i].org[indent]); } else if (indent>0) { indent--; } else { if (verb!=0) fprintf(stderr,"\nWarning: Illegal null field in %s, line %d.",filename,ind[i].lnum); if (efp!=stderr) fprintf(efp,"\nWarning: Illegal null field in %s, line %d.",filename,ind[i].lnum); warn++; n++; goto LOOP; } } if (!wflg) { ind[i].org[indent]=NULL; } break; } } if (bcomp==1) { if (buff[j]==' ' || buff[j]=='\t') { esc=0; if (k==0) { k--; continue; } else if (buff[j+1]==' ' || buff[j+1]=='\t' || buff[j+1]==encap || buff[j+1]==arg_close || buff[j+1]==actual || buff[j+1]==level) { k--; continue; } else if (buff[j]=='\t') { wbuff[k]=' '; continue; } } } } else quo=0; wbuff[k]=buff[j]; if (buff[j]!=escape) esc=0; if (buff[j]>=0x80) { wbuff[k+1]=buff[j+1]; j++; k++; } } ind[i].words=indent+1; /* kana-convert */ for (k=0;k=0x80) { table[k]=buff[j]; j++; k++; } table[k]=buff[j]; } ind[0].p[0].enc=malloc(strlen(estr)+1); if (ind[0].p[0].enc==NULL) { fprintf(stderr,"Malloc error.(ind[0].p[0].enc)\n"); exit(-1); } strcpy(ind[0].p[0].enc,estr); chkpageattr(&ind[0].p[0]); } else { for (l=0;l=0x80) { table[k]=buff[j]; j++; k++; } table[k]=buff[j]; } table[k]='\0'; for (k=0;k<=ind[l].num;k++) { if (strcmp(ind[l].p[k].page,table)==0) { if (strcmp(ind[l].p[k].enc,estr)==0) break; } } if (k>ind[l].num) { ind[l].num++; if (!((ind[l].num)%16)) ind[l].p=(struct page *)realloc(ind[l].p,sizeof(struct page)*((int)((ind[l].num)/16)+1)*16); ind[l].p[ind[l].num].page=malloc(strlen(table)+1); strcpy(ind[l].p[ind[l].num].page,table); ind[l].p[ind[l].num].enc=malloc(strlen(estr)+1); strcpy(ind[l].p[ind[l].num].enc,estr); chkpageattr(&ind[l].p[ind[l].num]); } } else { ind[i].num=0; ind[i].p=(struct page *)malloc(sizeof(struct page)*16); for (;buff[j]!=arg_open && buff[j]!='\n' && buff[j]!='\0';j++); if (buff[j]=='\n' || buff[j]=='\0') { if (verb!=0) fprintf(stderr,"\nWarning: Missing second argument in %s, line %d.",filename,ind[i].lnum); if (efp!=stderr) fprintf(efp,"\nWarning: Missing second argument in %s, line %d.",filename,ind[i].lnum); acc--; reject++; warn++; n++; goto LOOP; } j++; for (k=nest=0;;j++,k++) { if (buff[j]=='\n' || buff[j]=='\0') { if (verb!=0) fprintf(stderr,"\nWarning: Incomplete second argument in %s, line %d.",filename,ind[i].lnum); if (efp!=stderr) fprintf(efp,"\nWarning: Incomplete second argument in %s, line %d.",filename,ind[i].lnum); acc--; reject++; warn++; n++; goto LOOP; } if (buff[j]==arg_open) nest++; if (buff[j]==arg_close) { if (nest==0) { table[k]='\0'; ind[i].p[0].page=malloc(strlen(table)+1); strcpy(ind[i].p[0].page,table); break; } else nest--; } else if (buff[j]>=0x80) { table[k]=buff[j]; j++; k++; } table[k]=buff[j]; } ind[l].p[0].enc=malloc(strlen(estr)+1); strcpy(ind[i].p[0].enc,estr); chkpageattr(&ind[i].p[0]); } } } lines=i; if (verb!=0) { fprintf(stderr,"...done (%d entries accepted, %d rejected).\n",acc-pacc, reject-preject); } if (efp!=stderr) { fprintf(efp,"...done (%d entries accepted, %d rejected).\n",acc-pacc, reject-preject); } return eflg; } int getestr(buff,estr) /* pic up encap string */ unsigned char *buff,*estr; { int i,j,cc,nest=0; for (i=0;i0) { if (buff[i-1]<0x80) { estr[i]=buff[i]; i++; } } else { estr[i]=buff[i]; i++; } } if (nest==0 && buff[i]==arg_close) { estr[i]='\0'; return i; } if (buff[i]==arg_open) nest++; else if (buff[i]==arg_close) nest--; estr[i]=buff[i]; if (buff[i]>0x80) { i++; estr[i]=buff[i]; } } return -1; } int sstrcmp(buff1,buff2) char *buff1,*buff2; { int i; for (i=0;;i++) { if (buff1[i]=='\0' && buff2[i]=='\0') return 0; if (buff1[i]!=buff2[i]) return 1; } } chkpageattr(p) struct page *p; { int i,j,cc=0; for (i=0;ipage);i++) { if (strncmp(page_compositor,&p->page[i],strlen(page_compositor))==0) { p->attr[cc]=pattr[cc]; cc++; i+=strlen(page_compositor)-1; } else { ATTRLOOP: if (!((p->page[i]>='0' && p->page[i]<='9') || (p->page[i]>='A' && p->page[i]<='Z') || (p->page[i]>='a' && p->page[i]<='z'))) { p->attr[cc]= -1; if (cc<2) p->attr[++cc]= -1; return; } switch(page_precedence[pattr[cc]]) { case 'r': if (strchr("ivxlcdm",p->page[i])==NULL) { pattr[cc]++; for (j=cc+1;j<3;j++) pattr[j]=0; goto ATTRLOOP; } break; case 'R': if (strchr("IVXLCDM",p->page[i])==NULL) { pattr[cc]++; for (j=cc+1;j<3;j++) pattr[j]=0; goto ATTRLOOP; } break; case 'n': if (p->page[i]<'0' || p->page[i]>'9') { pattr[cc]++; for (j=cc+1;j<3;j++) pattr[j]=0; goto ATTRLOOP; } break; case 'a': if (p->page[i]<'a' || p->page[i]>'z') { pattr[cc]++; for (j=cc+1;j<3;j++) pattr[j]=0; goto ATTRLOOP; } break; case 'A': if (p->page[i]<'A' || p->page[i]>'Z') { pattr[cc]++; for (j=cc+1;j<3;j++) pattr[j]=0; goto ATTRLOOP; } break; default: break; } } } p->attr[cc]=pattr[cc]; if (cc<2) p->attr[++cc]= -1; } char *mfgets(buf,byte,fp) char *buf; int byte; FILE *fp; { int i,cc,cc2,cc3,jflag=0; for (i=0;i=0x80) { cc2=fgetc(fp); if (kanji==Sjis) { cc=SJIStoJIS((cc<<8)+cc2)+0x8080; } else { cc=(cc<<8)+cc2; } buf[i++]=(cc>>8)&0xff; buf[i]=cc&0xff; } else if (cc==0x1b) { cc2=fgetc(fp); cc3=fgetc(fp); if (cc2==0x24 && (cc3==0x42 || cc3==0x40)) jflag++; else if (cc2==0x28 && (cc3==0x42 || cc3==0x4a)) if (jflag>0) jflag--; else { buf[i++]=cc; buf[i++]=cc2; buf[i++]=cc3; } i--; } else if (jflag) { buf[i]=cc+0x80; } else buf[i]=cc; } buf[i]='\0'; return buf; } mendexk2.6e/fwrite.c0100644017777600000030000003211610347467716013501 0ustar nobodysys#include #include #include #include "exkana.h" #include "exvar.h" int line_length=0; char *convcode(); int convputs(); int indwrite(filename,ind,pagenum) /* write ind file */ char *filename; struct index *ind; int pagenum; { int i,j,k,cc,hpoint=0; unsigned char datama[256],lbuff[4096],tmp[4096]; FILE *fp; if (filename[0]!='\0') fp=fopen(filename,"w"); else fp=stdout; convert(atama,datama); fputs(preamble,fp); if (fpage>0) { fprintf(fp,"%s%d%s",setpage_prefix,pagenum,setpage_suffix); } for (i=line_length=0;i0) { fprintf(fp,"%s%s%s",lethead_prefix,symhead_positive,lethead_suffix); } else if (lethead_flag<0) { fprintf(fp,"%s%s%s",lethead_prefix,symhead_negative,lethead_suffix); } } sprintf(lbuff,"%s%s",item_0,convcode(ind[i].idx[0])); } else if (alphabet(ind[i].dic[0][0])) { if (lethead_flag>0) { fprintf(fp,"%s%c%s",lethead_prefix,ind[i].dic[0][0],lethead_suffix); } else if (lethead_flag<0) { fprintf(fp,"%s%c%s",lethead_prefix,ind[i].dic[0][0]+32,lethead_suffix); } sprintf(lbuff,"%s%s",item_0,convcode(ind[i].idx[0])); } else if (japanese(ind[i].dic[0])) { if (lethead_flag) { fputs(lethead_prefix,fp); for (j=hpoint;j<(strlen(datama)/2);j++) { if (ind[i].dic[0][1]0) { fprintf(fp,"%s%c%s",lethead_prefix,ind[i].dic[0][0],lethead_suffix); } else if (lethead_flag<0) { fprintf(fp,"%s%c%s",lethead_prefix,ind[i].dic[0][0]+32,lethead_suffix); } } } else if (japanese(ind[i].dic[0])) { for (j=hpoint;j<(strlen(datama)/2);j++) { if ((ind[i].dic[0][0]<=datama[j*2])&&(ind[i].dic[0][1]=0)&&(strncmp(ind[i-1].dic[0],ind[i].dic[0],2)!=0)) { fputs(group_skip,fp); if (lethead_flag!=0) { fputs(lethead_prefix,fp); sprintf(tmp,"%c%c",ind[i].dic[0][0],ind[i].dic[0][1]); convputs(tmp,fp); fputs(lethead_suffix,fp); } } } switch (ind[i].words) { case 1: sprintf(&lbuff[strlen(lbuff)],"%s%s%s",item_0,convcode(ind[i].idx[0]),delim_0); break; case 2: if (strcmp(ind[i-1].dic[0],ind[i].dic[0])!=0) { sprintf(&lbuff[strlen(lbuff)],"%s%s%s",item_0,convcode(ind[i].idx[0]),item_x1); } else { if (ind[i-1].words==1) { sprintf(&lbuff[strlen(lbuff)],"%s",item_01); } else { sprintf(&lbuff[strlen(lbuff)],"%s",item_1); } } sprintf(&lbuff[strlen(lbuff)],"%s",convcode(ind[i].idx[1])); sprintf(&lbuff[strlen(lbuff)],"%s",delim_1); break; case 3: if (strcmp(ind[i-1].dic[0],ind[i].dic[0])) { sprintf(&lbuff[strlen(lbuff)],"%s%s",item_0,convcode(ind[i].idx[0])); sprintf(&lbuff[strlen(lbuff)],"%s%s%s",item_x1,convcode(ind[i].idx[1]),item_x2); } else if (ind[i-1].words==1) { sprintf(&lbuff[strlen(lbuff)],"%s%s%s",item_01,convcode(ind[i].idx[1]),item_x2); } else if (strcmp(ind[i-1].dic[1],ind[i].dic[1])) { if (ind[i-1].words==2) sprintf(&lbuff[strlen(lbuff)],"%s%s%s",item_1,convcode(ind[i].idx[1]),item_12); else sprintf(&lbuff[strlen(lbuff)],"%s%s%s",item_1,convcode(ind[i].idx[1]),item_x2); } else { sprintf(&lbuff[strlen(lbuff)],"%s",item_2); } sprintf(&lbuff[strlen(lbuff)],"%s%s",convcode(ind[i].idx[2]),delim_2); break; default: break; } printpage(ind,fp,i,lbuff); } } fputs(postamble,fp); if (filename[0]!='\0') fclose(fp); } int printpage(ind,fp,num,lbuff) /* write page block */ struct index *ind; FILE *fp; int num; char *lbuff; { int i,j,k,cc,eflg,cflg; char buff[4096],tmpbuff[4096],errbuff[4096],tmp[4096]; buff[0]=tmpbuff[0]='\0'; crcheck(lbuff,fp); line_length=strlen(lbuff); for(j=0;jj) { if (pnumconv(ind[num].p[j].page,ind[num].p[j].attr[0])==pnumconv(ind[num].p[cc].page,ind[num].p[cc].attr[0])) { j=cc-1; continue; } /* range process */ if (ind[num].p[j].enc[0]==range_open || ind[num].p[j].enc[0]==range_close) ind[num].p[j].enc++; if (strlen(ind[num].p[j].enc)>0) { sprintf(buff,"%s%s%s",encap_prefix,convcode(ind[num].p[j].enc),encap_infix); } if (strlen(suffix_3p)>0 && (pnumconv(ind[num].p[cc].page,ind[num].p[cc].attr[0])-pnumconv(ind[num].p[j].page,ind[num].p[j].attr[0]))==2) { sprintf(&buff[strlen(buff)],"%s%s",convcode(ind[num].p[j].page),suffix_3p); } else if (strlen(suffix_mp)>0 && (pnumconv(ind[num].p[cc].page,ind[num].p[cc].attr[0])-pnumconv(ind[num].p[j].page,ind[num].p[j].attr[0]))>=2) { sprintf(&buff[strlen(buff)],"%s%s",convcode(ind[num].p[j].page),suffix_mp); } else if (strlen(suffix_2p)>0 && (pnumconv(ind[num].p[cc].page,ind[num].p[cc].attr[0])-pnumconv(ind[num].p[j].page,ind[num].p[j].attr[0]))==1) { sprintf(&buff[strlen(buff)],"%s%s",convcode(ind[num].p[j].page),suffix_2p); } else { sprintf(&buff[strlen(buff)],"%s%s",convcode(ind[num].p[j].page),delim_r); sprintf(&buff[strlen(buff)],"%s",convcode(ind[num].p[cc].page)); } sprintf(&tmpbuff[strlen(tmpbuff)],"%s",buff); buff[0]='\0'; if (strlen(ind[num].p[j].enc)>0) { sprintf(&tmpbuff[strlen(tmpbuff)],"%s",encap_suffix); } linecheck(lbuff,tmpbuff); j=cc; if (j==ind[num].num) { goto PRINT; } else { sprintf(&tmpbuff[strlen(tmpbuff)],"%s",delim_n); linecheck(lbuff,tmpbuff); } } else if (strlen(ind[num].p[j].enc)>0) { /* normal encap */ if (ind[num].p[j].enc[0]==range_close) { sprintf(errbuff,"Warning: Unmatched range closing operator \'%c\',",range_close); for (i=0;i0) { sprintf(&tmpbuff[strlen(tmpbuff)],"%s%s%s",encap_prefix,convcode(ind[num].p[j].enc),encap_infix); sprintf(&tmpbuff[strlen(tmpbuff)],"%s%s%s",convcode(ind[num].p[j].page),encap_suffix,delim_n); linecheck(lbuff,tmpbuff); } else { sprintf(&tmpbuff[strlen(tmpbuff)],"%s%s",convcode(ind[num].p[j].page),delim_n); linecheck(lbuff,tmpbuff); } } else { /* no encap */ sprintf(&tmpbuff[strlen(tmpbuff)],"%s%s",convcode(ind[num].p[j].page),delim_n); linecheck(lbuff,tmpbuff); } } if (ind[num].p[j].enc[0]==range_open) { sprintf(errbuff,"Warning: Unmatched range opening operator \'%c\',",range_open); for (k=0;k0) { sprintf(&tmpbuff[strlen(tmpbuff)],"%s%s%s",encap_prefix,convcode(ind[num].p[j].enc),encap_infix); sprintf(&tmpbuff[strlen(tmpbuff)],"%s%s",convcode(ind[num].p[j].page),encap_suffix); } else { sprintf(&tmpbuff[strlen(tmpbuff)],"%s",convcode(ind[num].p[j].page)); } linecheck(lbuff,tmpbuff); PRINT: fputs(lbuff,fp); fputs(delim_t,fp); lbuff[0]='\0'; } int range_check(ind,count,lbuff) struct index ind; int count; char *lbuff; { int i,j,k,cc1,cc2,start,force=0; char buff[4096],tmpbuff[4096],errbuff[4096],tmp[4096]; for (i=count;i0) { sprintf(tmpbuff,"%s%s%s",encap_prefix,convcode(ind.p[j].enc),encap_infix); sprintf(tmpbuff,"%s%s%s",convcode(ind.p[j].page),encap_suffix,delim_n); linecheck(lbuff,tmpbuff); } } } if (j==ind.num+1) { sprintf(errbuff,"Warning: Unmatched range opening operator \'%c\',",range_open); for (k=0;k=cc2+2 || (cc1>=cc2+1 && strlen(suffix_2p)) || force) { return i-1; } else return count; } int linecheck(lbuff,tmpbuff) /* check line length */ char *lbuff,*tmpbuff; { if (line_length+strlen(tmpbuff)>line_max) { sprintf(&lbuff[strlen(lbuff)],"\n%s%s",indent_space,tmpbuff); line_length=indent_length+strlen(tmpbuff); tmpbuff[0]='\0'; } else { sprintf(&lbuff[strlen(lbuff)],"%s",tmpbuff); line_length+=strlen(tmpbuff); tmpbuff[0]='\0'; } } int crcheck(lbuff,fp) char *lbuff; FILE *fp; { int i,j,cc; char buff[4096]; for (i=strlen(lbuff);i>=0;i--) { if (lbuff[i]=='\n') { strncpy(buff,lbuff,i+1); buff[i+1]='\0'; fputs(buff,fp); strcpy(buff,&lbuff[i+1]); strcpy(lbuff,buff); break; } } } char *convcode(buff) /* convert kanji code from EUC to output code */ unsigned char *buff; { int i,j,cc,jflag=0; static unsigned char buff2[4096]; for (i=j=0;i=0x80) { if (kanji==Jis) { if (!jflag) { buff2[j++]=0x1b; buff2[j++]=0x24; buff2[j++]=0x42; jflag=1; } buff2[j++]=buff[i++]-0x80; buff2[j]=buff[i]-0x80; } else if (kanji==Sjis) { cc=buff[i]*256+buff[i+1]-0x8080; i++; cc=JIStoSJIS(cc); buff2[j++]=(cc>>8)&0xff; buff2[j]=cc&0xff; } else { buff2[j++]=buff[i++]; buff2[j]=buff[i]; } } else { if (jflag) { buff2[j++]=0x1b; buff2[j++]=0x28; buff2[j++]=0x42; jflag=0; } buff2[j]=buff[i]; } } if (jflag) { buff2[j++]=0x1b; buff2[j++]=0x28; buff2[j++]=0x42; jflag=0; } buff2[j]='\0'; return buff2; } int convputs(buff,fp) /* fputs width convert kanji code */ char *buff; FILE *fp; { fputs(convcode(buff),fp); } mendexk2.6e/indexsty0100644017777600000030000000051210242253524013602 0ustar nobodysyspreamble "\\documentclass{index} \\begin{document}\n \\chapter{索 引}[index0001]\n \\begin{theindex}\n\n" postamble "\n\n\\end{theindex}\n\n\\end{document}\n" lethead_prefix "\n\\letter{" lethead_suffix "}\n" lethead_flag 1 delim_0 "\\delimi " delim_1 "\\delimii " delim_2 "\\delimiii " delim_r "\\delimr " delim_n "\\delimn " mendexk2.6e/kana.h0100644017777600000030000000321410242253524013075 0ustar nobodysysunsigned char AKASATANA[]={ 0xa4,0xa2, /* あ */ 0xa4,0xab, /* か */ 0xa4,0xb5, /* さ */ 0xa4,0xbf, /* た */ 0xa4,0xca, /* な */ 0xa4,0xcf, /* は */ 0xa4,0xde, /* ま */ 0xa4,0xe4, /* や */ 0xa4,0xe9, /* ら */ 0xa4,0xef, /* わ */ 0 }; unsigned char *akasatana; unsigned char AIUEO[]={ 0xa4,0xa2, /* あ */ 0xa4,0xa4, /* い */ 0xa4,0xa6, /* う */ 0xa4,0xa8, /* え */ 0xa4,0xaa, /* お */ 0xa4,0xab, /* か */ 0xa4,0xad, /* き */ 0xa4,0xaf, /* く */ 0xa4,0xb1, /* け */ 0xa4,0xb3, /* こ */ 0xa4,0xb5, /* さ */ 0xa4,0xb7, /* し */ 0xa4,0xb9, /* す */ 0xa4,0xbb, /* せ */ 0xa4,0xbd, /* そ */ 0xa4,0xbf, /* た */ 0xa4,0xc1, /* ち */ 0xa4,0xc4, /* つ */ 0xa4,0xc6, /* て */ 0xa4,0xc8, /* と */ 0xa4,0xca, /* な */ 0xa4,0xcb, /* に */ 0xa4,0xcc, /* ぬ */ 0xa4,0xcd, /* ね */ 0xa4,0xce, /* の */ 0xa4,0xcf, /* は */ 0xa4,0xd2, /* ひ */ 0xa4,0xd5, /* ふ */ 0xa4,0xd8, /* へ */ 0xa4,0xdb, /* ほ */ 0xa4,0xde, /* ま */ 0xa4,0xdf, /* み */ 0xa4,0xe0, /* む */ 0xa4,0xe1, /* め */ 0xa4,0xe2, /* も */ 0xa4,0xe4, /* や */ 0xa4,0xe6, /* ゆ */ 0xa4,0xe8, /* よ */ 0xa4,0xe9, /* ら */ 0xa4,0xea, /* り */ 0xa4,0xeb, /* る */ 0xa4,0xec, /* れ */ 0xa4,0xed, /* ろ */ 0xa4,0xef, /* わ */ 0xa4,0xf0, /* ゐ */ 0xa4,0xf1, /* ゑ */ 0xa4,0xf2, /* を */ 0xa4,0xf3, /* ん */ 0 }; unsigned char *aiueo; unsigned char ONBIKI[]={0xa1,0xbc,0}; /* ー */ unsigned char SPACE[]={0xa1,0xa1,0}; /* 全角スペース */ unsigned char ALPHAEND[]={0xa3,0xfa,0}; /* z */ unsigned char HIRATOP[]={0xa4,0xa1,0}; /* ぁ */ unsigned char HIRAEND[]={0xa4,0xf3,0}; /* ん */ unsigned char KATATOP[]={0xa5,0xa1,0}; /* ァ */ unsigned char KATAEND[]={0xa5,0xf6,0}; /* ヶ */ mendexk2.6e/kp.c0100644017777600000030000000510010242253524012564 0ustar nobodysys/* Written by K.Asayayam Sep. 1995 */ #ifdef KPATHSEA #include #include "kp.h" /* C library functions. */ extern char *getenv(); /* Functions in kpathsea lib. */ extern kpse_set_progname(); extern char *kpse_cnf_get(); extern char *kpse_path_expand(); extern char *kpse_expand_default(); extern char *kpse_path_search(); extern char *find_suffix(); extern char *concat3(); #ifdef KPATHSEA3 extern char *kpse_var_value(); #endif int KP_init(prog) char *prog; { kpse_set_progname(prog); return 0; } #ifdef KPATHSEA3 /* KP_get_value(char *var,char *def_val) ARGUMENTS: char *var: name of variable. char *def_val: default value. */ char *KP_get_value(var,def_val) char *var,*def_val; { char *p = kpse_var_value(var); return p ? p : def_val; } #else /* KP_get_value(char *env,char *cnf,char *def_val) ARGUMENTS: char *env: name of environment variable. char *cnf: name of variable in `texmf.cnf'. char *def_val: default value. */ char *KP_get_value(env,cnf,def_val) char *env,*cnf,*def_val; { char *val; char *cnf_val,*env_val; val = def_val ? def_val : ""; cnf_val = kpse_cnf_get(cnf); env_val = getenv(env); if (cnf_val) val = kpse_expand_default(cnf_val,val); if (env_val) val = kpse_expand_default(env_val,val); return val[0] ? val : ((cnf_val || env_val) ? val : (char *)0); } #endif /* KP_get_path(char *var, char *def_val) ARGUMENTS: char *var: name of variable. char *def_val: default value. */ char *KP_get_path(var,def_val) char *var,*def_val; { char avar[50]; char *p; strcpy(avar, "${"); strcat(avar, var); strcat(avar, "}"); p = kpse_path_expand(avar); return (p && *p) ? p : def_val; } /* */ int KP_entry_filetype(info) KpathseaSupportInfo *info; { #ifdef KPATHSEA3 info->path = KP_get_path(info->var_name,info->path); #else char *path; path = KP_get_value(info->var_name,info->var_name,info->path); info->path = kpse_path_expand(path); #endif return 0; } /* KP_find_file(KpathseaSupportInfo *info, char *name) ARGUMENTS: KpathseaSupportInfo *info: Informations about the type of files. char *name: Name of file. */ char *KP_find_file(info,name) KpathseaSupportInfo *info; char *name; { char *ret; ret = kpse_path_search(info->path,name,1); if (!ret && info->suffix && !find_suffix(name)) { char *suff_name; suff_name = concat3(name,".",info->suffix); ret = kpse_path_search(info->path,suff_name,1); free(suff_name); } return ret ? ret : name; } #else int KP_dummy_variable; #endif mendexk2.6e/kp.h0100644017777600000030000000061510242253524012577 0ustar nobodysys/* Written by K.Asayayam Sep. 1995 */ #ifndef KSUPPORT_H_INCLUDED #define KSUPPORT_H_INCLUDED #ifdef KPATHSEA typedef struct { char *var_name; char *path; char *suffix; } KpathseaSupportInfo; extern int KP_init(); extern int KP_entry_filetype(); extern char *KP_find_file(); extern char *KP_get_value(); extern char *KP_get_path(); #endif /* KPATHSEA */ #endif /* ! KSUPPORT_H_INCLUDED */ mendexk2.6e/ktable.h0100644017777600000030000001157610242253524013437 0ustar nobodysysunsigned char hiragana[200]; unsigned char katakana[200]; unsigned char kanatable[]={ 0xa4,0xa2, /* あ */ 0xa4,0xa2, /* あ */ 0xa4,0xa4, /* い */ 0xa4,0xa4, /* い */ 0xa4,0xa6, /* う */ 0xa4,0xa6, /* う */ 0xa4,0xa8, /* え */ 0xa4,0xa8, /* え */ 0xa4,0xaa, /* お */ 0xa4,0xaa, /* お */ 0xa4,0xab, /* か */ 0xa4,0xab, /* か */ 0xa4,0xad, /* き */ 0xa4,0xad, /* き */ 0xa4,0xaf, /* く */ 0xa4,0xaf, /* く */ 0xa4,0xb1, /* け */ 0xa4,0xb1, /* け */ 0xa4,0xb3, /* こ */ 0xa4,0xb3, /* こ */ 0xa4,0xb5, /* さ */ 0xa4,0xb5, /* さ */ 0xa4,0xb7, /* し */ 0xa4,0xb7, /* し */ 0xa4,0xb9, /* す */ 0xa4,0xb9, /* す */ 0xa4,0xbb, /* せ */ 0xa4,0xbb, /* せ */ 0xa4,0xbd, /* そ */ 0xa4,0xbd, /* そ */ 0xa4,0xbf, /* た */ 0xa4,0xbf, /* た */ 0xa4,0xc1, /* ち */ 0xa4,0xc1, /* ち */ 0xa4,0xc4, /* つ */ 0xa4,0xc4, /* つ */ 0xa4,0xc4, /* つ */ 0xa4,0xc6, /* て */ 0xa4,0xc6, /* て */ 0xa4,0xc8, /* と */ 0xa4,0xc8, /* と */ 0xa4,0xca, /* な */ 0xa4,0xcb, /* に */ 0xa4,0xcc, /* ぬ */ 0xa4,0xcd, /* ね */ 0xa4,0xce, /* の */ 0xa4,0xcf, /* は */ 0xa4,0xcf, /* は */ 0xa4,0xcf, /* は */ 0xa4,0xd2, /* ひ */ 0xa4,0xd2, /* ひ */ 0xa4,0xd2, /* ひ */ 0xa4,0xd5, /* ふ */ 0xa4,0xd5, /* ふ */ 0xa4,0xd5, /* ふ */ 0xa4,0xd8, /* へ */ 0xa4,0xd8, /* へ */ 0xa4,0xd8, /* へ */ 0xa4,0xdb, /* ほ */ 0xa4,0xdb, /* ほ */ 0xa4,0xdb, /* ほ */ 0xa4,0xde, /* ま */ 0xa4,0xdf, /* み */ 0xa4,0xe0, /* む */ 0xa4,0xe1, /* め */ 0xa4,0xe2, /* も */ 0xa4,0xe4, /* や */ 0xa4,0xe4, /* や */ 0xa4,0xe6, /* ゆ */ 0xa4,0xe6, /* ゆ */ 0xa4,0xe8, /* よ */ 0xa4,0xe8, /* よ */ 0xa4,0xe9, /* ら */ 0xa4,0xea, /* り */ 0xa4,0xeb, /* る */ 0xa4,0xec, /* れ */ 0xa4,0xed, /* ろ */ 0xa4,0xef, /* わ */ 0xa4,0xef, /* わ */ 0xa4,0xf0, /* ゐ */ 0xa4,0xf1, /* ゑ */ 0xa4,0xf2, /* を */ 0xa4,0xf3, /* ん */ 0xa4,0xa6, /* う */ 0xa4,0xab, /* か */ 0xa4,0xab, /* か */ 0 }; unsigned char symboltable[]={ 0xa1,0xa1, /* スペース */ 0xa1,0xaa, /* ! */ 0xa1,0xc9, /* ” */ 0xa1,0xf4, /* # */ 0xa1,0xf0, /* $ */ 0xa1,0xf3, /* % */ 0xa1,0xf5, /* & */ 0xa1,0xc7, /* ’ */ 0xa1,0xca, /* ( */ 0xa1,0xcb, /* ) */ 0xa1,0xf6, /* * */ 0xa1,0xdc, /* + */ 0xa1,0xa4, /* , */ 0xa1,0xdd, /* − */ 0xa1,0xa5, /* . */ 0xa1,0xbf, /* / */ 0xa3,0xb0, /* 0 */ 0xa3,0xb1, /* 1 */ 0xa3,0xb2, /* 2 */ 0xa3,0xb3, /* 3 */ 0xa3,0xb4, /* 4 */ 0xa3,0xb5, /* 5 */ 0xa3,0xb6, /* 6 */ 0xa3,0xb7, /* 7 */ 0xa3,0xb8, /* 8 */ 0xa3,0xb9, /* 9 */ 0xa1,0xa7, /* : */ 0xa1,0xa8, /* ; */ 0xa1,0xe3, /* < */ 0xa1,0xe1, /* = */ 0xa1,0xe4, /* > */ 0xa1,0xa9, /* ? */ 0xa1,0xf7, /* @ */ 0xa3,0xc1, /* A */ 0xa3,0xc2, /* B */ 0xa3,0xc3, /* C */ 0xa3,0xc4, /* D */ 0xa3,0xc5, /* E */ 0xa3,0xc6, /* F */ 0xa3,0xc7, /* G */ 0xa3,0xc8, /* H */ 0xa3,0xc9, /* I */ 0xa3,0xca, /* J */ 0xa3,0xcb, /* K */ 0xa3,0xcc, /* L */ 0xa3,0xcd, /* M */ 0xa3,0xce, /* N */ 0xa3,0xcf, /* O */ 0xa3,0xd0, /* P */ 0xa3,0xd1, /* Q */ 0xa3,0xd2, /* R */ 0xa3,0xd3, /* S */ 0xa3,0xd4, /* T */ 0xa3,0xd5, /* U */ 0xa3,0xd6, /* V */ 0xa3,0xd7, /* W */ 0xa3,0xd8, /* X */ 0xa3,0xd9, /* Y */ 0xa3,0xda, /* Z */ 0xa1,0xce, /* [ */ 0xa1,0xef, /* ¥ */ 0xa1,0xcf, /* ] */ 0xa1,0xb0, /* ^ */ 0xa1,0xb2, /* _ */ 0xa1,0xc6, /* ‘ */ 0xa3,0xe1, /* a */ 0xa3,0xe2, /* b */ 0xa3,0xe3, /* c */ 0xa3,0xe4, /* d */ 0xa3,0xe5, /* e */ 0xa3,0xe6, /* f */ 0xa3,0xe7, /* g */ 0xa3,0xe8, /* h */ 0xa3,0xe9, /* i */ 0xa3,0xea, /* j */ 0xa3,0xeb, /* k */ 0xa3,0xec, /* l */ 0xa3,0xed, /* m */ 0xa3,0xee, /* n */ 0xa3,0xef, /* o */ 0xa3,0xf0, /* p */ 0xa3,0xf1, /* q */ 0xa3,0xf2, /* r */ 0xa3,0xf3, /* s */ 0xa3,0xf4, /* t */ 0xa3,0xf5, /* u */ 0xa3,0xf6, /* v */ 0xa3,0xf7, /* w */ 0xa3,0xf8, /* x */ 0xa3,0xf9, /* y */ 0xa3,0xfa, /* z */ 0xa1,0xd0, /* { */ 0xa1,0xc3, /* | */ 0xa1,0xd1, /* } */ 0xa1,0xc1, /* 〜 */ 0 }; unsigned char btable[6][21]={ {0xa4,0xa2, /* あ */ 0xa4,0xab, /* か */ 0xa4,0xb5, /* さ */ 0xa4,0xbf, /* た */ 0xa4,0xca, /* な */ 0xa4,0xcf, /* は */ 0xa4,0xde, /* ま */ 0xa4,0xe4, /* や */ 0xa4,0xe9, /* ら */ 0xa4,0xef, /* わ */ 0}, {0xa4,0xa4, /* い */ 0xa4,0xad, /* き */ 0xa4,0xb7, /* し */ 0xa4,0xc1, /* ち */ 0xa4,0xcb, /* に */ 0xa4,0xd2, /* ひ */ 0xa4,0xdf, /* み */ 0xa4,0xea, /* り */ 0xa4,0xf0, /* ゐ */ 0}, {0xa4,0xa6, /* う */ 0xa4,0xaf, /* く */ 0xa4,0xb9, /* す */ 0xa4,0xc4, /* つ */ 0xa4,0xcc, /* ぬ */ 0xa4,0xd5, /* ふ */ 0xa4,0xe0, /* む */ 0xa4,0xe6, /* ゆ */ 0xa4,0xeb, /* る */ 0}, {0xa4,0xa8, /* え */ 0xa4,0xb1, /* け */ 0xa4,0xbb, /* せ */ 0xa4,0xc6, /* て */ 0xa4,0xcd, /* ね */ 0xa4,0xd8, /* へ */ 0xa4,0xe1, /* め */ 0xa4,0xec, /* れ */ 0xa4,0xf1, /* ゑ */ 0}, {0xa4,0xaa, /* お */ 0xa4,0xb3, /* こ */ 0xa4,0xbd, /* そ */ 0xa4,0xc8, /* と */ 0xa4,0xce, /* の */ 0xa4,0xdb, /* ほ */ 0xa4,0xe2, /* も */ 0xa4,0xe8, /* よ */ 0xa4,0xed, /* ろ */ 0}, {0xa4,0xf3, /* ん */ 0} }; mendexk2.6e/main.c0100644017777600000030000002043310671461661013115 0ustar nobodysys#include #include #include #include "kana.h" #include "var.h" #ifdef KPATHSEA #include "kp.h" #endif char *styfile,*idxfile[256],indfile[256],*dicfile,logfile[256]; #ifdef KPATHSEA /* default paths */ #ifndef DEFAULT_INDEXSTYLES #define DEFAULT_INDEXSTYLES "." #endif #ifndef DEFAULT_INDEXDICTS #define DEFAULT_INDEXDICTS "." #endif KpathseaSupportInfo kp_ist,kp_dict; #endif #define VERSION "version 2.6e [11-Sep-2007]" main(argc,argv) int argc; char **argv; { int i,j,k,cc,dd,startpagenum,ecount=0; char buff[256],*envbuff; FILE *fp; char *convcode(); #ifdef KPATHSEA KP_init(argv[0]); kp_ist.var_name = "INDEXSTYLE"; kp_ist.path = DEFAULT_INDEXSTYLES; /* default path. */ kp_ist.suffix = "ist"; KP_entry_filetype(&kp_ist); kp_dict.var_name = "INDEXDICTIONARY"; kp_dict.path = DEFAULT_INDEXDICTS; /* default path */ kp_dict.suffix = "dict"; KP_entry_filetype(&kp_dict); #endif /* check options */ for (i=1,j=0;i=2)) { switch (argv[i][1]) { case 'c': bcomp=1; break; case 'd': if ((argv[i][2]=='\0')&&(i+1.\n",convcode(AKASATANA)); fprintf(stderr,"-f force to output kanji.\n"); fprintf(stderr,"-s sty take sty as style file.\n"); fprintf(stderr,"-d dic take dic as dictionary file.\n"); fprintf(stderr,"-o ind take ind as the output index file.\n"); fprintf(stderr,"-t log take log as the error log file.\n"); fprintf(stderr,"-p no set the starting page number of index.\n"); fprintf(stderr,"-E EUC mode.\n"); fprintf(stderr,"-J JIS mode.\n"); fprintf(stderr,"-S ShiftJIS mode.\n"); fprintf(stderr,"idx... input files.\n"); exit(0); break; } } else { cc=strlen(argv[i]); if (cc<4) cc+=4; else if (strcmp(&argv[i][cc-4],".idx")) cc+=4; idxfile[j]=malloc(cc+1); strcpy(idxfile[j++],argv[i]); } } idxcount=j+fsti; /* check option errors */ if (idxcount==0) idxcount=fsti=1; if (styfile==NULL) { #ifdef KPATHSEA #ifdef KPATHSEA3 envbuff=KP_get_value("INDEXDEFAULTSTYLE",NULL); #else envbuff=KP_get_value("INDEXDEFAULTSTYLE","INDEXDEFAULTSTYLE",NULL); #endif #else envbuff=getenv("INDEXDEFAULTSTYLE"); #endif if (envbuff!=NULL) { styfile=malloc(strlen(envbuff)+1); strcpy(styfile,envbuff); } } if (styfile!=NULL) styread(styfile); if ((indfile[0]=='\0')&&(idxcount-fsti>0)) { for (i=strlen(idxfile[0]);i>=0;i--) { if (idxfile[0][i]=='.') { strncpy(indfile,idxfile[0],i); sprintf(&indfile[i],".ind"); break; } } if (i==-1) sprintf(indfile,"%s.ind",idxfile[0]); } if (logfile[0]=='\0') { if (idxcount-fsti>0) { for (i=strlen(idxfile[0]);i>=0;i--) { if (idxfile[0][i]=='.') { strncpy(logfile,idxfile[0],i); sprintf(&logfile[i],".ilg"); break; } } if (i==-1) sprintf(logfile,"%s.ilg",idxfile[0]); efp=fopen(logfile,"w"); } else { efp=stderr; strcpy(logfile,"stderr"); } } else efp=fopen(logfile,"w"); if (strcmp(argv[0],"makeindex")==0) { if (verb!=0) fprintf(stderr,"This is Not `MAKEINDEX\', But `MENDEX\' %s.\n",VERSION); } else { if (verb!=0) fprintf(stderr,"This is mendex %s.\n",VERSION); } if (efp!=stderr) fprintf(efp,"This is mendex %s.\n",VERSION); /* init kanatable */ initkanatable(); /* read dictionary */ ecount+=dicread(dicfile); switch (letter_head) { case 0: case 1: if (gflg==1) { strcpy(atama,akasatana); } else { strcpy(atama,aiueo); } break; case 2: if (gflg==1) { strcpy(atama,AKASATANA); } else { strcpy(atama,AIUEO); } break; default: break; } /* read idx file */ lines=0; ecount=0; ind=(struct index *)malloc(sizeof(struct index)); for (i=0;i1)&&(idxcount-fsti>0)) cc=lastpage(idxfile[0]); switch (fpage) { case 2: startpagenum=cc+1; break; case 3: if ((cc+1)%2==0) startpagenum=cc+2; else startpagenum=cc+1; break; case 4: if ((cc+1)%2==1) startpagenum=cc+2; else startpagenum=cc+1; break; default: break; } /* write indfile */ if (verb!=0) fprintf(stderr,"Making index file."); if (efp!=stderr) fprintf(efp,"Making index file."); indwrite(indfile,ind,startpagenum); if (verb!=0) fprintf(stderr,"...done.\n"); if (efp!=stderr) fprintf(efp,"...done.\n"); if (idxcount-fsti==0) strcpy(indfile,"stdout"); if (verb!=0) { fprintf(stderr,"%d warnings, written in %s.\n",warn,logfile); fprintf(stderr,"Output written in %s.\n",indfile); } if (efp!=stderr) { fprintf(efp,"%d warnings, written in %s.\n",warn,logfile); fprintf(efp,"Output written in %s.\n",indfile); fclose(efp); } exit(0); } Fprintf(buff) char *buff; { if (debug) fprintf(stderr,"CHECK:%s",buff); } mendexk2.6e/mendex.10100644017777600000030000002705710354111705013365 0ustar nobodysys.if t .ds TX "T\h'-.15m'\v'.2v'E\v'-.2v'\h'-.12m'X .if t .ds LX L\v'-.22m'a\v'.22m'T\h'-.1667m'\v'.22m'E\h'-.125m'\v'-.22m'X .TH MENDEX L .SH 名称 mendex \- 索引整形ツール .SH 使用法 \fBmendex\fR [-ilqrcg] [\fB-s\fI sty\fR] [\fB-d\fI dic\fR] [\fB-o\fI ind\fR] [\fB-d\fI dic\fR] [\fB-t\fI log\fR] [\fB-p\fI no\fR] [\fI idx0 idx1 idx2 ...\fR] .SH 解説 .PP \fImendex\fR は文書の索引を作成するツールです。 LaTeX により抽出された索引リストファイル(\fI.idx\fR)を並べ替え、実際の索引のソースファイルの形に整形します。 \fImakeindex\fR と互換性があり、さらに「読み」の扱いの手間を減らすように特殊化されています。 .RE 出力される索引の形式は、スタイルファイルに従って決定されます。また、辞書ファイルを与えることにより、索引中の熟語の読みが登録されます。 .RE 索引の階層は3段階まで作成することができます。 .SH オプション .PP .TP 10 \fB-i\fR 索引リストファイルが指定されている場合でも、標準入力を索引リストとして使用します。 .TP 10 \fB-l\fR 索引のソートを文字順で行います。指定されなければ単語順のソートになります(ソート方法については後述)。 .TP 10 \fB-q\fR 静粛モードです。エラーおよび警告以外は標準エラー出力に出力しません。 .TP 10 \fB-r\fR ページ範囲表現を無効にします。指定しないと、連続して出てくる索引については "1--5" のようにページ範囲で表現されます。 .TP 10 \fB-c\fR スペースやタブといったブランクを短縮して、すべて1個の半角スペースにします。また、前後のブランクは削除されます。 .TP 10 \fB-g\fR 日本語の頭文字の区切りを "あかさた・・・わ" にします。指定しないと "あいうえ・・・わをん" になります。 .TP 10 \fB-f\fR 辞書ファイルにない漢字も強制的に出力するモードです。 .TP 10 \fB-s\fI sty\fR \fIsty\fR ファイルをスタイルファイルと見なします。スタイルファイルを指定しなければ、デフォルトの索引形式で作成します。 .TP 10 \fB-d\fI dic\fR \fIdic\fR ファイルを辞書ファイルと見なします。辞書ファイルは日本語の <\fI熟語\fR\ \fI読み\fR> のリストで構成されます。 .TP 10 \fB-o\fI ind\fR \fIind\fR ファイルを出力ファイルと見なします。指定がない場合は最初の入力ファイルの拡張子を.indとしたもの、入力ファイルが標準入力のみであれば標準出力に出力します。 .TP 10 \fB-t\fI log\fR \fIlog\fR ファイルをログファイルと見なします。指定がない場合は最初の入力ファイルの拡張子を.ilgとしたもの、入力ファイルが標準入力のみであれば標準エラー出力のみに出力されます。 .TP 10 \fB-p\fI no\fR \fIno\fR を索引ページの先頭ページとして指定します。また、TeXの.log ファイルを参照することにより \fIany\fR(最終ページの次のページから)、\fIodd\fR(最終ページの次の奇数ページから)、\fIeven\fR(最終ページの次の偶数ページから)といった指定の仕方も可能です。 .TP 10 \fB-E\fR 漢字コードをEUCに指定します。入力ファイル、出力ファイルともEUCとして扱います。 .TP 10 \fB-J\fR 漢字コードをJISに指定します。入力ファイル、出力ファイルともJISとして扱います。 .TP 10 \fB-S\fR 漢字コードをShiftJISに指定します。入力ファイル、出力ファイルともShiftJISとして扱います。 .SH スタイルファイル スタイルファイルは makeindex のものと上位互換です。 形式は <\fIスタイルパラメータ\fR\ \fI引数\fR> のリストで構成されます。パラメータの順序は自由です。 以下にスタイルパラメータの一覧を示します。 `%'以降はコメントと見なされます。 .PP \fB 入力ファイルスタイルパラメータ\fR .TP 30 \fBkeyword\fR <文字列> "\\\\indexentry" .RS 索引エントリを引数として持つコマンド。 .RE .TP 30 \fBarg_open\fR <文字> \'{\' .RS 索引エントリ文字列開始を表す文字。 .RE .TP 30 \fBarg_close\fR <文字> \'}\' .RS 索引エントリ文字列終了を表す文字。 .RE .TP 30 \fBrange_open\fR <文字> \'(\' .RS ページ範囲の開始を示す文字。 .RE .TP 30 \fBrange_close\fR <文字> \')\' .RS ページ範囲の終了を示す文字。 .RE .TP 30 \fBlevel\fR <文字> \'!\' .RS 従属レベルであることを示す文字。 .RE .TP 30 \fBactual\fR <文字> \'@\' .RS このシンボルに続く文字列が実際の索引文字列として出力ファイルに書かれる。 .RE .TP 30 \fBencap\fR <文字> \'|\' .RS このシンボルに続く文字列が、ページ番号に付くコマンド名として使われる。 .RE .TP 30 \fBpage_compositor\fR <文字列> "-" .RS 階層化されたページ番号における階層間の区切り文字。 .RE .TP 30 \fBpage_precedence\fR <文字列> "rnaRA" .RS ページ番号の記法の優先順位。\'R\'および\'r\'はローマ数字、\'n\'はアラビア数字、\'A\'および\'a\'はアルファベットによる記法を表す。 .RE .TP 30 \fBquote\fR <文字> \'"\' .RS mendexのパラメータ文字に対するエスケープキャラクタ。 .RE .TP 30 \fBescape\fR <文字> \'\\\\\' .RS 一般的な文字に対するエスケープキャラクタ。 .RE \fB 出力ファイルスタイルパラメータ\fR \fBpreamble\fR <文字列> "\\\\begin{theindex}\\n" .RS 出力ファイルの文字列。 .RE .TP 30 \fBpostamble\fR <文字列> "\\n\\n\\\\end{theindex}\\n" .RS 出力ファイルの末尾の文字列。 .RE .TP 30 \fBsetpage_prefix\fR <文字列> "\\n \\\\setcounter{page}{" .RS 開始ページを設定するときの、ページ番号の前に付ける文字列。 .RE .TP 30 \fBsetpage_suffix\fR <文字列> "}\\n" .RS 開始ページを設定するときの、ページ番号の後に付ける文字列。 .RE .TP 30 \fBgroup_skip\fR <文字列> "\\n\\n \\\\indexsapce\\n" .RS 新項目(頭文字)の前に挿入する縦スペースを表す文字列。 .RE .TP 30 \fBlethead_prefix\fR <文字列> "" .RS 頭文字の前に付けるコマンド文字列。 .RE .TP 30 \fBheading_prefix\fR <文字列> "" .RS lethead_prefixと同じ。 .RE .TP 30 \fBlethead_suffix\fR <文字列> "" .RS 頭文字の後に付けるコマンド文字列。 .RE .TP 30 \fBheading_suffix\fR <文字列> "" .RS lethead_suffixと同じ。 .RE .TP 30 \fBlethead_flag\fR <文字列> 0 .RS 頭文字の出力のフラグ。0のとき出力しない。0より大きいときは英字を大文字で、0より小さいときは小文字で出力する。 .RE .TP 30 \fBheading_flag\fR <文字列> 0 .RS lethead_flagと同じ。 .RE .TP 30 \fBitem_0\fR <文字列> "\\n \\\\item " .RS 主エントリ間に挿入するコマンド。 .RE .TP 30 \fBitem_1\fR <文字列> "\\n \\\\subitem " .RS サブエントリ間に挿入するコマンド。 .RE .TP 30 \fBitem_2\fR <文字列> "\\n \\\\subsubitem " .RS サブサブエントリ間に挿入するコマンド。 .RE .TP 30 \fBitem_01\fR <文字列> "\\n \\\\subitem " .RS 主〜サブエントリ間に挿入するコマンド。 .RE .TP 30 \fBitem_x1\fR <文字列> "\\n \\\\subitem " .RS 主〜サブエントリ間に挿入するコマンド。(主エントリにページ番号がないとき) .RE .TP 30 \fBitem_12\fR <文字列> "\\n \\\\subsubitem " .RS サブ〜サブサブエントリ間に挿入するコマンド。 .RE .TP 30 \fBitem_x2\fR <文字列> "\\n \\\\subsubitem " .RS サブ〜サブサブエントリ間に挿入するコマンド。(サブエントリにページ番号がないとき) .RE .TP 30 \fBdelim_0\fR <文字列> ", " .RS 主エントリと最初のページ番号の間の区切り文字列。 .RE .TP 30 \fBdelim_1\fR <文字列> ", " .RS サブエントリと最初のページ番号の間の区切り文字列。 .RE .TP 30 \fBdelim_2\fR <文字列> ", " .RS サブサブエントリと最初のページ番号の間の区切り文字列。 .RE .TP 30 \fBdelim_n\fR <文字列> ", " .RS ページ番号間の区切り文字列。どのエントリレベルにも共通。 .RE .TP 30 \fBdelim_r\fR <文字列> "--" .RS ページ範囲を示すときの、ページ番号間の区切り文字列。 .RE .TP 30 \fBdelim_t\fR <文字列> "" .RS ページ番号のリストの終端に出力する文字列。 .RE .TP 30 \fBsuffix_2p\fR <文字列> "" .RS ページ番号が2ページ連続する場合に、delim_n と2ページ目の番号の代わりに付加する文字列。 .RE 文字列が定義されている場合にのみ有効。 .RE .TP 30 \fBsuffix_3p\fR <文字列> "" .RS ページ番号が3ページ連続する場合に、delim_r と3ページ目の番号の代わりに付加する文字列。suffix_mp より優先される。 .RE 文字列が定義されている場合にのみ有効。 .RE .TP 30 \fBsuffix_mp\fR <文字列> "" .RS ページ番号が3ページまたはそれ以上連続する場合に、delim_r と末尾のページ番号の代わりに付加する文字列。 .RE 文字列が定義されている場合にのみ有効。 .RE .TP 30 \fBencap_prefix\fR <文字列> "\\\\" .RS ページ番号にコマンドを付けるときの、コマンド名の前に付ける文字列。 .RE .TP 30 \fBencap_infix\fR <文字列> "{" .RS ページ番号にコマンドを付けるときの、ページ番号の前に付ける文字列。 .RE .TP 30 \fBencap_suffix\fR <文字列> "}". .RS ページ番号にコマンドを付けるときの、ページ番号の後に付ける文字列。 .RE .TP 30 \fBline_max\fR <数値> 72 .RS 1行の最大文字数。それを超えると折り返す。 .RE .TP 30 \fBindent_space\fR <文字列> "\t\t" .RS 折り返した行の頭に挿入するスペース。 .RE .TP 30 \fBindent_length\fR <数値> 16 .RS 折り返した行の頭に挿入されるスペースの長さ。 .RE .TP 30 \fBsymhead_positive\fR <文字列> "Symbols" .RS lethead_flag または heading_flag が正数の場合に数字・記号の頭文字として出力する文字列。 .RE .TP 30 \fBsymhead_negative\fR <文字列> "symbols" .RS lethead_flag または heading_flag が負数の場合に数字・記号の頭文字として出力する文字列。 .RE .TP 30 \fBsymbol\fR <文字列> "" .RS symbol_flag が0でない場合に、数字・記号の頭文字として出力する文字列。 .RE 文字列が定義されていれば、symhead_positive および symhead_negative より優先される。(mendex専用) .RE このパラメータが定義された場合、symhead_positive および symhead_negative より優先される。(mendex専用) .RE .TP 30 \fBsymbol_flag\fR <数値> 1 .RS 数字・記号の頭文字の出力フラグ。0のとき出力しない。(mendex専用) .RE .TP 30 \fBletter_head\fR <数値> 1 .RS 日本語の頭文字の出力のフラグ。0のとき出力しない。1のときカタカナ、2のときひらがなで出力する。(mendex専用) .RE .TP 30 \fBpriority\fR <数値> 0 .RS 英字と日本語との混在した索引語のソート方法についてのフラグ。0でなければ英字と日本語との間に半角スペースを入れた状態でソートする。(mendex専用) .RE .TP 30 \fBcharacter_order\fR <文字列> "SEJ" .RS 記号、英字、日本語の優先順位。\'S\'は記号、\'E\'は英字、\'J\'は日本語を表す。(mendex専用) .RE .PP .SH 日本語の扱いについて .PP \fImendex\fR は日本語の索引をできるだけ楽に扱えるようになっています。 .RE makeindexでは日本語の索引が正しく辞書順にソートするためにはひらがなまたはカタカナに揃え、拗音、撥音、濁点を除いた読みを付けなければなりませんでした(自動的に揃えるバージョンもある)。 .RE mendexではカナについてはすべて自動的に揃え、また漢字については辞書ファイルを設定することにより各索引語ごとに読みを付ける作業をかなり解消できます。 .LP 以下に内部でのカナの変換例を示します。 .PP .RS .br かぶしきがいしゃ かふしきかいしや .br マッキントッシュ まつきんとつしゆ .br ワープロ わあふろ .RE .LP 辞書ファイルは<\fI熟語\ \ 読み\fR>のリストで構成されます。 熟語と読みの区切りはタブまたはスペースです。 .RE 以下に辞書の例を示します。 .PP .RS .br 漢字 かんじ .br 読み よみ .br 環境 かんきょう .br α アルファ .RE .LP 辞書に登録する熟語については、読み方が1通りになるよう送り仮名を付けてください。 「表」、「性質」のように送り仮名によらず2通りの読み方ができる語についてはどちらか1つしか登録できません。他の読み方については各索引語へ読みを付けることで対応してください。 .RE また、環境変数<\fIINDEXDEFAULTDICTIONARY\fR>に辞書ファイルを登録することにより、自動的に辞書を参照します。環境変数に登録した辞書は -d で指定した辞書と併用できます。 .PP .SH ソート方法について .PP \fImendex\fR は通常は入力された索引語をそのままソートします。\fI-l\fRオプションが付けられた場合、複数の単語で構成される索引語については、ソートするときに単語と単語の間のスペースを詰めてソートします。 ここでは前者を単語順ソート、後者を文字順ソートと呼ぶことにします。 .RE 文字順ソートの場合、実際に出力される文字列はスペースを含んだ状態のものですので、索引語自体が変化することはありません。 .RE 以下に例を示します。 .PP .RS \fI単語順ソート 文字順ソート\fR .br X Window Xlib .br Xlib XView .br XView X Window .RE .LP また、日本語〜英字間でも似たようなソート方法があります。スタイルファイルで\fIpriority\fRを0以外に指定した場合、隣接した日本語と英字の間にスペースを入れてソートします。 .RE 以下に例を示します。 .PP .RS \fIpriority=0 priority=1\fR .br index sort indファイル .br indファイル index sort .RE .PP .SH 環境変数 \fImendex\fR では以下のような環境変数を使用しています。 .PP .TP 10 \fIINDEXSTYLE\fR 索引スタイルファイルがあるディレクトリ .TP 10 \fIINDEXDEFAULTSTYLE\fR デフォルトで参照する索引スタイルファイル .TP 10 \fIINDEXDICTIONARY\fR 辞書があるディレクトリ .TP 10 \fIINDEXDEFAULTDICTIONARY\fR 常に参照する辞書ファイル .PP .SH 詳細について その他、詳細については \fImakeindex\fR に準拠。 .PP .SH 問題点等 ファイル名の先頭の文字が '-' であるファイルは扱えません。 複数のページ記法を使用する場合、ページ順に.idxファイルを与えないとページ番号を誤認することがあります。 .PP .SH 参照 tex(l), latex(l), makeindex(l) .RE mendexk2.6e/mendex.doc0100644017777600000030000002611210354111725013763 0ustar nobodysysmendex - 索引整形ツール 株式会社アスキー 出版技術グループ www-ptex@ascii.co.jp 使用法 mendex [-ilqrcgEJS] [-s sty] [-d dic] [-o ind] [-d dic] [-t log] [-p no] [idx0 idx1 idx2 ...] 解説 mendex は文書の索引を作成するツールです。 LaTeX により抽出された索引リストファ イル(.idx)を並べ替え、実際の索引のソースファイルの形に整形します。makeindex と互 換性があり、さらに「読み」の扱いの手間を減らすように特殊化されています。 出力される索引の形式は、スタイルファイルに従って決定されます。また、辞書ファイ ルを与えることにより、索引中の熟語の読みが登録されます。 索引の階層は3段階まで作成することができます。 オプション -i 索引リストファイルが指定されている場合でも、標準入力を索引リストとし て使用します。 -l 索引のソートを文字順で行います。指定されなければ単語順のソートになり ます(ソート方法については後述)。 -q 静粛モードです。エラーおよび警告以外は標準エラー出力に出力しません。 -r ページ範囲表現を無効にします。指定しないと、連続して出てくる索引につ いては "1--5" のようにページ範囲で表現されます。 -c スペースやタブといったブランクを短縮して、すべて1個の半角スペースに します。また、前後のブランクは削除されます。 -g 日本語の頭文字の区切りを "あかさた・・・わ" にします。指定しないと "あいうえ・・・わをん" になります。 -f 辞書ファイルにない漢字も強制的に出力するモードです。 -s sty sty ファイルをスタイルファイルと見なします。スタイルファイルを指定し なければ、デフォルトの索引形式で作成します。 -d dic dic ファイルを辞書ファイルと見なします。辞書ファイルは日本語の <熟語 読み> のリストで構成されます。 -o ind ind ファイルを出力ファイルと見なします。指定がない場合は最初の入力 ファイルの拡張子を.indとしたもの、入力ファイルが標準入力のみであれば 標準出力に出力します。 -t log log ファイルをログファイルと見なします。指定がない場合は最初の入力 ファイルの拡張子を.ilgとしたもの、入力ファイルが標準入力のみであれば 標準エラー出力のみに出力されます。 -p no no を索引ページの先頭ページとして指定します。また、TeXの.log ファイル を参照することにより any (最終ページの次のページから)、odd (最終ペー ジの次の奇数ページから)、even (最終ページの次の偶数ページから)といっ た指定も可能です。 -E 漢字コードをEUCに指定します。 入力ファイル、出力ファイルともEUCとして扱います。 -J 漢字コードをJISに指定します。 入力ファイル、出力ファイルともJISとして扱います。 -S 漢字コードをShiftJISに指定します。 入力ファイル、出力ファイルともShiftJISとして扱います。 スタイルファイル スタイルファイルは makeindex のものと上位互換です。 形式は <スタイルパラメータ 引数> のリストで構成されます。パラメータの順序は自由です。 以下にスタイルパラメータの一覧を示します。 `%'以降はコメントと見なされます。 入力ファイルスタイルパラメータ keyword <文字列> "\\indexentry" 索引エントリを引数として持つコマンド。 arg_open <文字> '{' 索引エントリ文字列開始を表す文字。 arg_close <文字> '}' 索引エントリ文字列終了を表す文字。 range_open <文字> '(' ページ範囲の開始を示す文字。 range_close <文字> ')' ページ範囲の終了を示す文字。 level <文字> '!' 従属レベルであることを示す文字。 actual <文字> '@' このシンボルに続く文字列が実際の索引文字列として出力ファイルに書かれる。 encap <文字> '|' このシンボルに続く文字列が、ページ番号に付くコマンド名として使われる。 page_compositor <文字列> "-" 階層化されたページ番号における階層間の区切り文字。 page_precedence <文字列> "rnaRA" ページ番号の記法の優先順位。'R'および'r'はローマ数字、'n'はアラビア数字、 'A'および'a'はアルファベットによる記法を表す。 quote <文字> '"' mendex のパラメータ文字に対するエスケープキャラクタ。 escape <文字> '\\' 一般的な文字に対するエスケープキャラクタ。 出力ファイルスタイルパラメータ preamble <文字列> "\\begin{theindex}\n" 出力ファイルの文字列。 postamble <文字列> "\n\n\\end{theindex}\n" 出力ファイルの末尾の文字列。 setpage_prefix <文字列> "\n \\setcounter{page}{" 開始ページを設定するときの、ページ番号の前に付ける文字列。 setpage_suffix <文字列> "}\n" 開始ページを設定するときの、ページ番号の後に付ける文字列。 group_skip <文字列> "\n\n \\indexsapce\n" 新項目(頭文字)の前に挿入する縦スペースを表す文字列。 lethead_prefix <文字列> "" 頭文字の前に付けるコマンド文字列。 heading_prefix <文字列> "" lethead_prefixと同じ。 lethead_suffix <文字列> "" 頭文字の後に付けるコマンド文字列。 heading_suffix <文字列> "" lethead_suffixと同じ。 lethead_flag <文字列> 0 頭文字の出力のフラグ。0のとき出力しない。0より大きいときは英字を大文字で、 0より小さいときは小文字で出力する。 heading_flag <文字列> 0 lethead_flagと同じ。 item_0 <文字列> "\n \\item " 主エントリ間に挿入するコマンド。 item_1 <文字列> "\n \\subitem " サブエントリ間に挿入するコマンド。 item_2 <文字列> "\n \\subsubitem " サブサブエントリ間に挿入するコマンド。 item_01 <文字列> "\n \\subitem " 主〜サブエントリ間に挿入するコマンド。 item_x1 <文字列> "\n \\subitem " 主〜サブエントリ間に挿入するコマンド。(主エントリにページ番号がないとき) item_12 <文字列> "\n \\subsubitem " サブ〜サブサブエントリ間に挿入するコマンド。 item_x2 <文字列> "\n \\subsubitem " サブ〜サブサブエントリ間に挿入するコマンド。(サブエントリにページ番号が ないとき) delim_0 <文字列> ", " 主エントリと最初のページ番号の間の区切り文字列。 delim_1 <文字列> ", " サブエントリと最初のページ番号の間の区切り文字列。 delim_2 <文字列> ", " サブサブエントリと最初のページ番号の間の区切り文字列。 delim_n <文字列> ", " ページ番号間の区切り文字列。どのエントリレベルにも共通。 delim_r <文字列> "--" ページ範囲を示すときの、ページ番号間の区切り文字列。 delim_t <文字列> "" ページ番号のリストの終端に出力する文字列。 suffix_2p <文字列> "" ページ番号が2ページ連続する場合に、delim_n と2ページ目の番号の代わりに 付加する文字列。 文字列が定義されている場合にのみ有効。 suffix_3p <文字列> "" ページ番号が3ページ連続する場合に、delim_r と3ページ目の番号の代わりに 付加する文字列。suffix_mp より優先される。 文字列が定義されている場合にのみ有効。 suffix_mp <文字列> "" ページ番号が3ページまたはそれ以上連続する場合に、delim_r と末尾のページ 番号の代わりに付加する文字列。 文字列が定義されている場合にのみ有効。 encap_prefix <文字列> "\\" ページ番号にコマンドを付けるときの、コマンド名の前に付ける文字列。 encap_infix <文字列> "{" ページ番号にコマンドを付けるときの、ページ番号の前に付ける文字列。 encap_suffix <文字列> "}" ページ番号にコマンドを付けるときの、ページ番号の後に付ける文字列。 line_max <数値> 72 1行の最大文字数。それを超えると折り返す。 indent_space <文字列> "\t\t" 折り返した行の頭に挿入するスペース。 indent_length <数値> 16 折り返した行の頭に挿入されるスペースの長さ。 symhead_positive <文字列> "Symbols" lethead_flag または heading_flag が正数の場合に数字・記号の頭文字として 出力する文字列。 symhead_negative <文字列> "symbols" lethead_flag または heading_flag が負数の場合に数字・記号の頭文字として 出力する文字列。 symbol <文字列> "" symbol_flag が0でない場合に、数字・記号の頭文字として出力する文字列。 文字列が定義されていれば、symhead_positive および symhead_negative より 優先される。(mendex専用) symbol_flag <数値> 1 symbol の出力フラグ。0のとき出力しない。(mendex専用) letter_head <数値> 1 日本語の頭文字の出力のフラグ。0のとき出力しない。1のときカタカナ、2のとき ひらがなで出力する。(mendex専用) priority <数値> 0 英字と日本語との混在した索引語のソート方法についてのフラグ。0でなければ 英字と日本語との間に半角スペースを入れた状態でソートする。(mendex専用) character_order <文字列> "SEJ" 記号、英字、日本語の優先順位。'S'は記号、'E'は英字、'J'は日本語を表す。 (mendex専用) 日本語の扱いについて mendex は日本語の索引をできるだけ楽に扱えるようになっています。 makeindex では日本語の索引が正しく辞書順にソートするためにはひらがなまたはカタ カナに揃え、拗音、撥音、濁点を除いた読みを付けなければなりませんでした(自動的に 揃えるバージョンもある)。 mendex ではカナについてはすべて自動的に揃え、また漢字については辞書ファイルを 設定することにより各索引語ごとに読みを付ける作業をかなり解消できます。 以下に内部でのカナの変換例を示します。 かぶしきがいしゃ かふしきかいしや マッキントッシュ まつきんとつしゆ ワープロ わあふろ 辞書ファイルは <熟語 読み> のリストで構成されます。熟語と読みの区切りはタブま たはスペースです。 以下に辞書の例を示します。 漢字 かんじ 読み よみ 環境 かんきょう α アルファ 辞書に登録する熟語は、読み方が1通りになるよう送り仮名を付けてください。 「表」、「性質」のように送り仮名によらず2通りの読み方ができる語についてはどち らか1つしか登録できません。他の読み方については各索引語へ読みを付けることで対応 してください。 また、環境変数 INDEXDEFAULTDICTIONARY に辞書ファイルを登録することにより、 自動的に辞書を参照します。環境変数に登録した辞書は -d で指定した辞書と併用できま す。 ソート方法について mendex は通常は入力された索引語をそのままソートします。-l オプションが付けられ た場合、複数の単語で構成される索引語については、ソートするときに単語と単語の間の スペースを詰めてソートします。 ここでは前者を単語順ソート、後者を文字順ソートと呼ぶことにします。 文字順ソートの場合、実際に出力される文字列はスペースを含んだ状態のものなので、 索引語自体が変化することはありません。 以下に例を示します。 単語順ソート 文字順ソート X Window Xlib Xlib XView XView X Window また、日本語〜英字間でも似たようなソート方法があります。スタイルファイルで priority に0以外を指定した場合、隣接した日本語と英字の間にスペースを入れてソート します。 以下に例を示します。 priority=0 priority=1 index sort indファイル indファイル index sort 環境変数 mendex では以下のような環境変数を使用しています。 INDEXSTYLE 索引スタイルファイルがあるディレクトリ INDEXDEFAULTSTYLE デフォルトで参照する索引スタイルファイル INDEXDICTIONARY 辞書があるディレクトリ INDEXDEFAULTDICTIONARY 常に参照する辞書ファイル 詳細について その他、仕様の詳細については makeindex と同じです。 問題点等 先頭の文字が '-' であるファイル名は直接扱えません。ファイル名の前に './' を付 加するなどして対応してください。 複数のページ記法を使用する場合、ページ順に.idxファイルを与えないとページ番号を 誤認することがあります。 mendexk2.6e/pageread.c0100644017777600000030000000145010242253524013726 0ustar nobodysys#include #include #include int lastpage(filename) /* checking last page */ char *filename; { int i,j,cc,num= -1; char logfile[32],numbuff[16]; FILE *fp; for (i=strlen(filename);i>=0;i--) { if (filename[i]=='.') { strncpy(logfile,filename,i); sprintf(&logfile[i],".log"); break; } } if (i==-1) sprintf(logfile,"%s.log",filename); fp=fopen(logfile,"r"); if (fp==NULL) { fprintf(stderr,"No log file, %s.\n",logfile); exit(0); } while (1) { cc=fgetc(fp); if (cc==EOF) break; else if (cc=='[') { for (i=0;;i++) { cc=fgetc(fp); if (((i==0)&&(cc=='-'))||((cc>='0')&&(cc<='9'))) numbuff[i]=cc; else { numbuff[i]='\0'; break; } } if (strlen(numbuff)>0) num=atoi(numbuff); } } fclose(fp); return num; } mendexk2.6e/sort.c0100644017777600000030000001374110347467745013175 0ustar nobodysys#include #include #include #include "exkana.h" #include "exvar.h" int sym,number,alpha,kana; wsort(ind,num) /* sort index */ struct index *ind; int num; { int i,j,order,wcomp(); for (order=1,i=0;;i++) { switch (character_order[i]) { case '\0': goto BREAK; break; case 'S': case 's': sym=order++; break; case 'N': case 'n': number=order++; break; case 'E': case 'e': alpha=order++; break; case 'J': case 'j': kana=order++; break; default: break; } } BREAK: if (sym==0) sym=order++; if (number==0) number=order++; if (alpha==0) alpha=order++; if (kana==0) kana=order++; qsort(ind,num,sizeof(struct index),wcomp); } int wcomp(index1,index2) /* compare for sorting index */ struct index *index1,*index2; { int i,j,k,cc,prechar,pri1,pri2; scount++; for (j=0;j<3;j++) { /* check level */ if (((*index1).words==j)&&((*index2).words!=j)) return -1; else if (((*index1).words!=j)&&((*index2).words==j)) return 1; for(i=0;;i++) { /* even */ if (((*index1).dic[j][i]=='\0')&&((*index2).dic[j][i]=='\0')) break; /* index1 is shorter */ if ((*index1).dic[j][i]=='\0') return -1; /* index2 is shorter */ if ((*index2).dic[j][i]=='\0') return 1; /* priority */ if ((priority!=0)&&(i>0)) { if (prechar==0) { if ((japanese(&(*index1).dic[j][i])) &&(!japanese(&(*index2).dic[j][i]))) return -1; if ((japanese(&(*index2).dic[j][i])) &&(!japanese(&(*index1).dic[j][i]))) return 1; } else { if ((japanese(&(*index1).dic[j][i])) &&(!japanese(&(*index2).dic[j][i]))) return 1; if ((japanese(&(*index2).dic[j][i])) &&(!japanese(&(*index1).dic[j][i]))) return -1; } } /* compare group */ if (ordering(&(*index1).dic[j][i])ordering(&(*index2).dic[j][i])) return 1; /* symbol pattern */ if ((!numeric((*index1).dic[j][i]))&&(numeric((*index2).dic[j][i]))) return -1; if ((!numeric((*index2).dic[j][i]))&&(numeric((*index1).dic[j][i]))) return 1; /* simple compare */ if ((*index1).dic[j][i]<(*index2).dic[j][i]) return -1; else if ((*index1).dic[j][i]>(*index2).dic[j][i]) return 1; /* 2byte character */ if (((*index1).dic[j][i]>=0x80)&&((*index2).dic[j][i]>=0x80)) { prechar=1; i++; if ((*index1).dic[j][i]<(*index2).dic[j][i]) return -1; else if ((*index1).dic[j][i]>(*index2).dic[j][i]) return 1; } else prechar=0; } /* compare index */ for (i=0;;i++) { if (((*index1).idx[j][i]=='\0')&&((*index2).idx[j][i]=='\0')) break; else if ((*index1).idx[j][i]=='\0') return -1; else if ((*index2).idx[j][i]=='\0') return 1; else if ((*index1).idx[j][i]<(*index2).idx[j][i]) return -1; else if ((*index1).idx[j][i]>(*index2).idx[j][i]) return 1; } } return 0; } int pagesort(ind,num) /* sort page */ struct index *ind; int num; { int i,j,k,cc; struct page *buff; int pcomp(); for (i=0;iattr[i]<0)&&(page2->attr[i]<0)) return 0; else if ((page1->attr[i]<0)&&(page2->attr[i]>=0)) return -1; else if ((page2->attr[i]<0)&&(page1->attr[i]>=0)) return 1; if (page1->attr[i]>page2->attr[i]) return 1; if (page1->attr[i]attr[i]) return -1; for (j=cc;jpage);j++) { if (strncmp(&page1->page[j],page_compositor,strlen(page_compositor))==0) break; } strncpy(buff,&page1->page[cc],j-cc); buff[j-cc]='\0'; num1=pnumconv(buff,page1->attr[i]); for (j=cc;jpage);j++) { if (strncmp(&page2->page[j],page_compositor,strlen(page_compositor))==0) break; } strncpy(buff,&page2->page[cc],j-cc); buff[j-cc]='\0'; num2=pnumconv(buff,page2->attr[i]); if (num1>num2) return 1; else if (num1enc[0]=='(' || page2->enc[0]==')') return -1; if (page1->enc[0]==')' || page2->enc[0]=='(') return 1; cc=j+strlen(page_compositor); } return 0; } int ordering(buff) unsigned char *buff; { if ((*buff)<0x80) { if (alphabet(*buff)) return alpha; else if (numeric(*buff)) return number; else return sym; } else { if (japanese(buff)) return kana; else return sym; } } int alphanumeric(c) unsigned char c; { if (((c>='A')&&(c<='Z'))||((c>='a')&&(c<='z'))||((c>='0')&&(c<='9'))) return 1; else return 0; } int alphabet(c) unsigned char c; { if (((c>='A')&&(c<='Z'))||((c>='a')&&(c<='z'))) return 1; else return 0; } int numeric(c) unsigned char c; { if ((c>='0')&&(c<='9')) return 1; else return 0; } int japanese(buff) unsigned char *buff; { if (strncmp(buff,HIRATOP,2)>=0) return 1; else return 0; } int chkcontinue(p,num) struct page *p; int num; { int i,j,cc=0,num1,num2; char buff[16]; for (i=0;i<3;i++) { if ((p[num].attr[i]<0)&&(p[num+1].attr[i]<0)) return 1; else if (p[num].attr[i]!=p[num+1].attr[i]) return 0; for (j=cc;j #include #include #include "exvar.h" #ifdef KPATHSEA #include "kp.h" extern KpathseaSupportInfo kp_ist; #endif FILE *fp; int styread(filename) /* read style file */ char *filename; { int i,j,k,cc; char buff[4096]; #ifdef KPATHSEA filename = KP_find_file(&kp_ist,filename); #endif fp=fopen(filename,"r"); if (fp==NULL) { fprintf(stderr,"%s does not exist.\n",filename); exit(0); } for (i=0;;i++) { if (fgets(buff,4095,fp)==NULL) break; if (getparam(buff,"keyword",keyword)) continue; if (getparachar(buff,"arg_open",&arg_open)) continue; if (getparachar(buff,"arg_close",&arg_close)) continue; if (getparachar(buff,"range_open",&range_open)) continue; if (getparachar(buff,"range_close",&range_close)) continue; if (getparachar(buff,"level",&level)) continue; if (getparachar(buff,"actual",&actual)) continue; if (getparachar(buff,"encap",&encap)) continue; if (getparachar(buff,"quote","e)) continue; if (getparachar(buff,"escape",&escape)) continue; if (getparam(buff,"preamble",preamble)) continue; if (getparam(buff,"postamble",postamble)) continue; if (getparam(buff,"group_skip",group_skip)) continue; if (getparam(buff,"lethead_prefix",lethead_prefix)) continue; if (getparam(buff,"heading_prefix",lethead_prefix)) continue; if (getparam(buff,"lethead_suffix",lethead_suffix)) continue; if (getparam(buff,"heading_suffix",lethead_suffix)) continue; if (getparam(buff,"symhead_positive",symhead_positive)) continue; if (getparam(buff,"symhead_negative",symhead_negative)) continue; if (getparam(buff,"numhead_positive",numhead_positive)) continue; if (getparam(buff,"numhead_negative",numhead_negative)) continue; cc=scompare(buff,"lethead_flag"); if (cc!= -1) { lethead_flag=atoi(&buff[cc]); continue; } cc=scompare(buff,"heading_flag"); if (cc!= -1) { lethead_flag=atoi(&buff[cc]); continue; } cc=scompare(buff,"priority"); if (cc!= -1) { priority=atoi(&buff[cc]); continue; } if (getparam(buff,"item_0",item_0)) continue; if (getparam(buff,"item_1",item_1)) continue; if (getparam(buff,"item_2",item_2)) continue; if (getparam(buff,"item_2",item_2)) continue; if (getparam(buff,"item_01",item_01)) continue; if (getparam(buff,"item_x1",item_x1)) continue; if (getparam(buff,"item_12",item_12)) continue; if (getparam(buff,"item_x2",item_x2)) continue; if (getparam(buff,"delim_0",delim_0)) continue; if (getparam(buff,"delim_1",delim_1)) continue; if (getparam(buff,"delim_2",delim_2)) continue; if (getparam(buff,"delim_n",delim_n)) continue; if (getparam(buff,"delim_r",delim_r)) continue; if (getparam(buff,"delim_t",delim_t)) continue; if (getparam(buff,"suffix_2p",suffix_2p)) continue; if (getparam(buff,"suffix_3p",suffix_3p)) continue; if (getparam(buff,"suffix_mp",suffix_mp)) continue; if (getparam(buff,"encap_prefix",encap_prefix)) continue; if (getparam(buff,"encap_infix",encap_infix)) continue; if (getparam(buff,"encap_suffix",encap_suffix)) continue; cc=scompare(buff,"line_max"); if (cc!= -1) { line_max=atoi(&buff[cc]); continue; } if (getparam(buff,"indent_space",indent_space)) continue; cc=scompare(buff,"indent_length"); if (cc!= -1) { indent_length=atoi(&buff[cc]); continue; } if (getparam(buff,"symbol",symbol)) continue; cc=scompare(buff,"symbol_flag"); if (cc!= -1) { symbol_flag=atoi(&buff[cc]); continue; } cc=scompare(buff,"letter_head"); if (cc!= -1) { letter_head=atoi(&buff[cc]); continue; } if (getparam(buff,"atama",atama)) continue; if (getparam(buff,"page_compositor",page_compositor)) continue; if (getparam(buff,"page_precedence",page_precedence)) continue; if (getparam(buff,"character_order",character_order)) continue; } } int convline(buff1,start,buff2) /* analize string parameter of style file */ char *buff1,*buff2; int start; { int i,j,k,cc; for (i=start,j=cc=0;;i++) { if (buff1[i]=='\"') { if (cc==0) { cc=1; } else { buff2[j]='\0'; break; } } else if ((buff1[i]=='\n')||(buff1[i]=='\0')) { if (cc==1) { buff2[j++]='\n'; } if (fgets(buff1,4095,fp)==NULL) { buff2[j]='\0'; break; } i= -1; } else if (cc==1) { if ((unsigned char)buff1[i]>0x80) { buff2[j++]=buff1[i++]; buff2[j]=buff1[i]; } else if (buff1[i]=='\\') { i++; if (buff1[i]=='\\') buff2[j]='\\'; else if (buff1[i]=='n') buff2[j]='\n'; else if (buff1[i]=='t') buff2[j]='\t'; else if (buff1[i]=='r') buff2[j]='\r'; else if (buff1[i]=='\"') buff2[j]='\"'; } else buff2[j]=buff1[i]; j++; } } } int scompare(buff1,buff2) /* compare strings */ char *buff1,*buff2; { int i,j,k,cc; if (sstrlen(buff1) == sstrlen(buff2)) { if (sstrcmp(buff1,buff2) == 0) { if (fgets(buff1,4095,fp)==NULL) return -1; return 0; } return -1; } for (i=0;i #include #include #include "exkana.h" #include "exvar.h" char *mfgets(); extern char *convcode(); int idxread(filename,start) /* read idx file */ char *filename; int start; { int i,j,k,l,m,n,cc,indent,wflg,flg,bflg=0,nest,esc,quo,eflg=0,pacc,preject; unsigned char buff[1024],wbuff[1024],estr[256],table[1024],tbuff[256],*tmp1,*tmp2; FILE *fp; pacc=acc; preject=reject; if (filename==NULL) { fp=stdin; if (verb!=0) fputs("Scanning input file stdin.",stderr); if (efp!=stderr) fputs("Scanning input file stdin.",efp); } else { fp=fopen(filename,"r"); if (fp==NULL) { sprintf(buff,"%s.idx",filename); fp=fopen(buff,"r"); if (fp==NULL) { if (verb!=0) fprintf(stderr,"Warning: Couldn't find input file %s.\n",filename); if (efp!=stderr) fprintf(efp,"Warning: Couldn't find input file %s.\n",filename); warn++; return 1; } else strcpy(filename,buff); } if (verb!=0) fprintf(stderr,"Scanning input file %s.",filename); if (efp!=stderr) fprintf(efp,"Scanning input file %s.",filename); } for (i=start,n=1;;i++,n++) { if (!(i%100)) ind=(struct index *)realloc(ind,sizeof(struct index)*(i+100)); LOOP: ind[i].lnum=n; if (mfgets(buff,1023,fp)==NULL) break; for (j=bflg=cc=0;j0) { nest--; wbuff[k]=buff[j]; continue; } if (nest==0) { if (buff[j]==level) { esc=0; if (indent>=2) { fprintf(efp,"\nError: Extra `%c\' in %s, line %d.",level,filename,ind[i].lnum); if (efp!=stderr) fprintf(stderr,"\nError: Extra `%c\' in %s, line %d.",level,filename,ind[i].lnum); eflg++; reject++; n++; goto LOOP; } ind[i].idx[indent]=(unsigned char *)malloc(k+1); if (ind[i].idx[indent]==NULL) { fprintf(stderr,"Malloc error.(ind[%d].idx[%d])\n",i,indent); exit(-1); } strncpy(ind[i].idx[indent],wbuff,k); ind[i].idx[indent][k]='\0'; if (!wflg) ind[i].org[indent]=NULL; indent++; wflg=0; k= -1; continue; } else if (buff[j]==actual) { esc=0; if (wflg) { fprintf(efp,"\nError: Extra `%c\' in %s, line %d.",actual,filename,ind[i].lnum); if (efp!=stderr) fprintf(stderr,"\nError: Extra `%c\' in %s, line %d.",actual,filename,ind[i].lnum); eflg++; reject++; n++; goto LOOP; } ind[i].org[indent]=(unsigned char *)malloc(k+1); if (ind[i].org[indent]==NULL) { fprintf(stderr,"Malloc error.(ind[%d].org[%d])\n",i,indent); exit(-1); } strncpy(ind[i].org[indent],wbuff,k); ind[i].org[indent][k]='\0'; wflg=1; k= -1; continue; } else if ((esc==0 && buff[j]==arg_close) || buff[j]==encap) { esc=0; if (buff[j]==encap) { j++; cc=getestr(&buff[j],estr); if (cc<0) { fprintf(efp,"\nBad encap string in %s, line %d.",filename,ind[i].lnum); if (efp!=stderr) fprintf(stderr,"\nBad encap string in %s, line %d.",filename,ind[i].lnum); eflg++; reject++; n++; goto LOOP; } j+=cc; } else estr[0]='\0'; ind[i].idx[indent]=(unsigned char *)malloc(k+1); if (ind[i].idx[indent]==NULL) { fprintf(stderr,"Malloc error.(ind[%d].idx[%d])\n",i,indent); exit(-1); } strncpy(ind[i].idx[indent],wbuff,k); ind[i].idx[indent][k]='\0'; if (strlen(ind[i].idx[indent])==0) { if (wflg) { strcpy(ind[i].idx[indent],ind[i].org[indent]); } else if (indent>0) { indent--; } else { if (verb!=0) fprintf(stderr,"\nWarning: Illegal null field in %s, line %d.",filename,ind[i].lnum); if (efp!=stderr) fprintf(efp,"\nWarning: Illegal null field in %s, line %d.",filename,ind[i].lnum); warn++; n++; goto LOOP; } } if (!wflg) { ind[i].org[indent]=NULL; } break; } } if (bcomp==1) { if (buff[j]==' ' || buff[j]=='\t') { esc=0; if (k==0) { k--; continue; } else if (buff[j+1]==' ' || buff[j+1]=='\t' || buff[j+1]==encap || buff[j+1]==arg_close || buff[j+1]==actual || buff[j+1]==level) { k--; continue; } else if (buff[j]=='\t') { wbuff[k]=' '; continue; } } } } else quo=0; wbuff[k]=buff[j]; if (buff[j]!=escape) esc=0; if (buff[j]>=0x80) { wbuff[k+1]=buff[j+1]; j++; k++; } } ind[i].words=indent+1; /* kana-convert */ for (k=0;k=0x80) { table[k]=buff[j]; j++; k++; } table[k]=buff[j]; } ind[0].p[0].enc=malloc(strlen(estr)+1); if (ind[0].p[0].enc==NULL) { fprintf(stderr,"Malloc error.(ind[0].p[0].enc)\n"); exit(-1); } strcpy(ind[0].p[0].enc,estr); chkpageattr(&ind[0].p[0]); } else { for (l=0;l=0x80) { table[k]=buff[j]; j++; k++; } table[k]=buff[j]; } table[k]='\0'; for (k=0;k<=ind[l].num;k++) { if (strcmp(ind[l].p[k].page,table)==0) { if (strcmp(ind[l].p[k].enc,estr)==0) break; } } if (k>ind[l].num) { ind[l].num++; if (!((ind[l].num)%16)) ind[l].p=(struct page *)realloc(ind[l].p,sizeof(struct page)*((int)((ind[l].num)/16)+1)*16); ind[l].p[ind[l].num].page=malloc(strlen(table)+1); strcpy(ind[l].p[ind[l].num].page,table); ind[l].p[ind[l].num].enc=malloc(strlen(estr)+1); strcpy(ind[l].p[ind[l].num].enc,estr); chkpageattr(&ind[l].p[ind[l].num]); } } else { ind[i].num=0; ind[i].p=(struct page *)malloc(sizeof(struct page)*16); for (;buff[j]!=arg_open && buff[j]!='\n' && buff[j]!='\0';j++); if (buff[j]=='\n' || buff[j]=='\0') { if (verb!=0) fprintf(stderr,"\nWarning: Missing second argument in %s, line %d.",filename,ind[i].lnum); if (efp!=stderr) fprintf(efp,"\nWarning: Missing second argument in %s, line %d.",filename,ind[i].lnum); acc--; reject++; warn++; n++; goto LOOP; } j++; for (k=nest=0;;j++,k++) { if (buff[j]=='\n' || buff[j]=='\0') { if (verb!=0) fprintf(stderr,"\nWarning: Incomplete second argument in %s, line %d.",filename,ind[i].lnum); if (efp!=stderr) fprintf(efp,"\nWarning: Incomplete second argument in %s, line %d.",filename,ind[i].lnum); acc--; reject++; warn++; n++; goto LOOP; } if (buff[j]==arg_open) nest++; if (buff[j]==arg_close) { if (nest==0) { table[k]='\0'; ind[i].p[0].page=malloc(strlen(table)+1); strcpy(ind[i].p[0].page,table); break; } else nest--; } else if (buff[j]>=0x80) { table[k]=buff[j]; j++; k++; } table[k]=buff[j]; } ind[l].p[0].enc=malloc(strlen(estr)+1); strcpy(ind[i].p[0].enc,estr); chkpageattr(&ind[i].p[0]); } } } lines=i; if (verb!=0) { fprintf(stderr,"...done (%d entries accepted, %d rejected).\n",acc-pacc, reject-preject); } if (efp!=stderr) { fprintf(efp,"...done (%d entries accepted, %d rejected).\n",acc-pacc, reject-preject); } return eflg; } int getestr(buff,estr) /* pic up encap string */ unsigned char *buff,*estr; { int i,j,cc,nest=0; for (i=0;i0) { if (buff[i-1]<0x80) { estr[i]=buff[i]; i++; } } else { estr[i]=buff[i]; i++; } } if (nest==0 && buff[i]==arg_close) { estr[i]='\0'; return i; } if (buff[i]==arg_open) nest++; else if (buff[i]==arg_close) nest--; estr[i]=buff[i]; if (buff[i]>0x80) { i++; estr[i]=buff[i]; } } return -1; } int sstrcmp(buff1,buff2) char *buff1,*buff2; { int i; for (i=0;;i++) { if (buff1[i]=='\0' && buff2[i]=='\0') return 0; if (buff1[i]!=buff2[i]) return 1; } } chkpageattr(p) struct page *p; { int i,j,cc=0; for (i=0;ipage);i++) { if (strncmp(page_compositor,&p->page[i],strlen(page_compositor))==0) { p->attr[cc]=pattr[cc]; cc++; i+=strlen(page_compositor)-1; } else { ATTRLOOP: if (!((p->page[i]>='0' && p->page[i]<='9') || (p->page[i]>='A' && p->page[i]<='Z') || (p->page[i]>='a' && p->page[i]<='z'))) { p->attr[cc]= -1; if (cc<2) p->attr[++cc]= -1; return; } switch(page_precedence[pattr[cc]]) { case 'r': if (strchr("ivxlcdm",p->page[i])==NULL) { pattr[cc]++; for (j=cc+1;j<3;j++) pattr[j]=0; goto ATTRLOOP; } break; case 'R': if (strchr("IVXLCDM",p->page[i])==NULL) { pattr[cc]++; for (j=cc+1;j<3;j++) pattr[j]=0; goto ATTRLOOP; } break; case 'n': if (p->page[i]<'0' || p->page[i]>'9') { pattr[cc]++; for (j=cc+1;j<3;j++) pattr[j]=0; goto ATTRLOOP; } break; case 'a': if (p->page[i]<'a' || p->page[i]>'z') { pattr[cc]++; for (j=cc+1;j<3;j++) pattr[j]=0; goto ATTRLOOP; } break; case 'A': if (p->page[i]<'A' || p->page[i]>'Z') { pattr[cc]++; for (j=cc+1;j<3;j++) pattr[j]=0; goto ATTRLOOP; } break; default: break; } } } p->attr[cc]=pattr[cc]; if (cc<2) p->attr[++cc]= -1; } char *mfgets(buf,byte,fp) char *buf; int byte; FILE *fp; { int i,cc,cc2,cc3,jflag=0; for (i=0;i=0x80) { cc2=fgetc(fp); if (kanji==Sjis) { cc=SJIStoJIS((cc<<8)+cc2)+0x8080; } else { cc=(cc<<8)+cc2; } buf[i++]=(cc>>8)&0xff; buf[i]=cc&0xff; } else if (cc==0x1b) { cc2=fgetc(fp); cc3=fgetc(fp); if (cc2==0x24 && (cc3==0x42 || cc3==0x40)) jflag++; else if (cc2==0x28 && (cc3==0x42 || cc3==0x4a)) if (jflag>0) jflag--; else { buf[i++]=cc; buf[i++]=cc2; buf[i++]=cc3; } i--; } else if (jflag) { buf[i]=cc+0x80; } else buf[i]=cc; } buf[i]='\0'; return buf; }