dvi2tty version 5.0 用の ASCII "日本語" TeX 用 unofficial patch です。 1990 年に 中村@京大情報 さんが作成されたものを version 5.0 用に修正しました。 dvi2tty のオリジナルは, char *dvi2tty = "@(#) dvi2tty.c 5.0 29/11/90 M.J.E. Mol (c) 1989, 1990"; #define VERSION 5.0 です。 -- 1993年 8月 2日(月) すぎうら しげき diff -c /dev/null jdvi2tty/jdvi2tty-ascii.patch.header *** /dev/null Mon Aug 2 18:10:01 1993 --- jdvi2tty/jdvi2tty-ascii.patch.header Mon Aug 2 18:12:58 1993 *************** *** 0 **** --- 1,30 ---- + From: motonori@kutsuda.kuis.kyoto-u.ac.jp (Motonori Nakamura) + Newsgroups: fj.sources + Subject: jdvi2tty (patch to dvi2tty) + Message-ID: <46@boots.kutsuda.kuis.kyoto-u.ac.jp> + Date: 10 May 90 07:45:29 GMT + + 中村@京大情報です。 + + もう、どなたかやっておられるかも知れませんが、以前 + comp.sources.misc に流れていた dvi2tty を ASCII-JTeX 対応に + 日本語化しました。UNIX で TeX を使おうという人は、X で preview + するでしょうし、98 上で動く previewer も出ていることですから、 + 需要は少ないとは思いますが、TTY 端末でチョコチョコと書いて、 + チラッと確認するのには、なかなか便利だとの評判です。 + (私に、「ね、日本語化しようよ。」と、言った人の弁 :-) + + 所詮 TTY なので複雑な図は見にくいですし、表も微妙にずれます。 + (ずれるのは元のプログラムの仕様です、念のため :-p ) + + という訳で、パッチをポストします。 + + いちおう、JIS,SJIS,EUC には対応してあります。 + dvistuff.c の中の JIS, SJIS の define を変えると(または、 + Makefile で define すると)お望みの漢字コードになるはずです。 + + ちなみに、元記事は次の通りです。 + (省略) + ========= + 中村 素典 @京都大学 工学研究科 情報工学専攻 津田研究室 + motonori@kuis.kyoto-u.ac.jp diff -c dvi2tty5.0/Makefile jdvi2tty/Makefile *** dvi2tty5.0/Makefile Sun Dec 16 02:06:02 1990 --- jdvi2tty/Makefile Mon Aug 2 17:38:09 1993 *************** *** 8,17 **** # CFLAGS = -s ! all: dvi2tty disdvi ! dvi2tty:dvi2tty.o dvistuff.o ! cc -o dvi2tty dvi2tty.o dvistuff.o disdvi:disdvi.o cc -o disdvi disdvi.o --- 8,17 ---- # CFLAGS = -s ! all: jdvi2tty disdvi ! jdvi2tty:dvi2tty.o dvistuff.o ! cc -o jdvi2tty dvi2tty.o dvistuff.o disdvi:disdvi.o cc -o disdvi disdvi.o diff -c dvi2tty5.0/dvi2tty.c jdvi2tty/dvi2tty.c *** dvi2tty5.0/dvi2tty.c Sun Dec 16 01:59:34 1990 --- jdvi2tty/dvi2tty.c Mon Aug 2 17:36:53 1993 *************** *** 105,110 **** --- 105,113 ---- #if defined(VMS) #include unixio #endif + #if defined(MSDOS) + #include + #endif *************** *** 578,587 **** --- 581,598 ---- if (i == 0) usage(ign); strcpy(DVIfilename, str); + #if defined(MSDOS) + if (!((i >= 5) && (tolower(str[i-1]) == 'i') && + (tolower(str[i-2]) == 'v') && + (tolower(str[i-3]) == 'd') && (str[i-4] == '.'))) { + strcat(DVIfilename, ".dvi"); + } + #else if (!((i >= 5) && (str[i-1] == 'i') && (str[i-2] == 'v') && (str[i-3] == 'd') && (str[i-4] == '.'))) { strcat(DVIfilename, ".dvi"); } + #endif return; diff -c dvi2tty5.0/dvistuff.c jdvi2tty/dvistuff.c *** dvi2tty5.0/dvistuff.c Fri Dec 14 17:47:57 1990 --- jdvi2tty/dvistuff.c Mon Aug 2 17:46:47 1993 *************** *** 1,6 **** --- 1,12 ---- /* * Include files */ + #if !defined(JIS) + #define JIS 1 /* if 0 then EUC or SJIS */ + #endif + #if !defined(SJIS) + #define SJIS 0 /* if !JIS, 0 then EUC */ + #endif #include "dvi2tty.h" *************** *** 128,135 **** --- 134,150 ---- font * fonts = NULL; /* List of fontnames defined */ int symbolfont = FALSE; /* true if font is a symbol font */ + #if JIS + #define SJIS 0 + int inkanji = 0; /* is in kanji sequence */ + #define KANJIIN "\033$@" + #define KANJIOUT "\033(J" + #endif + int kanji1 = 0; /* is first kanji character */ + int kanji2 = 0; /* is second kanji character */ + /* * Function definitions */ *************** *** 152,157 **** --- 167,173 ---- unsigned long num (int); long snum (int); void dochar (char); + void dokanji (char); void symchar (char); void normchar (char); void outchar (char); *************** *** 177,182 **** --- 193,199 ---- unsigned long num (); long snum (); void dochar (); + void dokanji (); void symchar (); void normchar (); void outchar (); *************** *** 373,379 **** else switch (opcode) { case SET1 : setchar(get1()); break; ! case SET2 : setchar(get2()); break; case SET3 : setchar(get3()); break; case SET4 : setchar(get4()); break; case SET_RULE : { long height = sget4(); --- 390,396 ---- else switch (opcode) { case SET1 : setchar(get1()); break; ! case SET2 : dokanji(get2()); break; case SET3 : setchar(get3()); break; case SET4 : setchar(get4()); break; case SET_RULE : { long height = sget4(); *************** *** 542,548 **** void printpage() { register int i, j; ! register char ch; if (sptr != 0) fprintf(stderr, "dvi2tty: warning - stack not empty at eop.\n"); --- 559,565 ---- void printpage() { register int i, j; ! register unsigned char ch; if (sptr != 0) fprintf(stderr, "dvi2tty: warning - stack not empty at eop.\n"); *************** *** 559,573 **** --- 576,646 ---- for (i = firstcolumn, j = 1; i <= currentline->charactercount; i++, j++) { ch = currentline->text[i - leftmargin]; + if (kanji1) { + #if !JIS && !SJIS + ch |= 0x80; + #endif + kanji2 = 1; + kanji1 = 0; + } + if (!kanji2 && ch > 127) { + kanji1 = 1; + #if JIS + if (!inkanji) { + inkanji = 1; + fprintf(output,KANJIIN); + } + ch &= 0x7f; + #endif + } + #if JIS + if (!kanji1 && !kanji2 && inkanji) { + fprintf(output,KANJIOUT); + inkanji = 0; + } + #endif + if (kanji1 && (j >= (int) foo) && + (currentline->charactercount > i+1)) { + #if JIS + if(inkanji) { + fprintf(output,KANJIOUT); + } + #endif + fprintf(output, "*\n"); /* if line to large */ + fprintf(output, " *"); /* mark output */ + #if JIS + if(inkanji) { + fprintf(output,KANJIIN); + } + #endif + j = 2; + } if (ch >= SPACE) putc(ch, output); if ((j > (int) foo) && (currentline->charactercount > i+1)) { + #if JIS + if(inkanji) { + fprintf(output,KANJIOUT); + } + #endif fprintf(output, "*\n"); /* if line to large */ fprintf(output, " *"); /* mark output */ + #if JIS + if(inkanji) { + fprintf(output,KANJIIN); + } + #endif j = 2; } + kanji2 = 0; } } + #if JIS + if (!kanji1 && !kanji2 && inkanji) { + fprintf(output,KANJIOUT); + inkanji = 0; + } + #endif putc('\n', output); } *************** *** 876,881 **** --- 949,985 ---- /* + * DOKANJI -- Process a kanji character opcode. + */ + + void dokanji(ch) + register long ch; + { + + #if SJIS + register int c1, c2; + + c1 = (ch >> 8) & 0xff; + c2 = ch & 0xff; + kanji1 = 1; + outchar((((c1 - 1) >> 1) + ((c1 <= 0x5e) ? 0x71 : 0xb1))); + kanji1 = 0; + outchar((c2 + ((c1 & 1) ? ((c2 < 0x60) ? 0x1f : 0x20) : 0x7e))); + #else + kanji1 = 1; + outchar(0x80 | ( ch >> 8 )); + kanji1 = 0; + outchar(ch & 0xff); + #endif + + return; + + + } /* dokanji */ + + + + /* * SYMCHAR -- Process a character opcode for a symbol font. */ *************** *** 1003,1009 **** */ void outchar(ch) ! register char ch; { register int i, j; --- 1107,1113 ---- */ void outchar(ch) ! register unsigned char ch; { register int i, j; *************** *** 1075,1081 **** /*----------------- end of 'Scandinavian code' ----------------*/ if (foo == leftmargin-1) ! while ((currentline->text[j - leftmargin] != SPACE) && (j < rightmargin)) { j++; h += charwidth; --- 1179,1186 ---- /*----------------- end of 'Scandinavian code' ----------------*/ if (foo == leftmargin-1) ! while (((currentline->text[j - leftmargin] != SPACE) ! || kanji1 && (currentline->text[j+1 - leftmargin] != SPACE)) && (j < rightmargin)) { j++; h += charwidth;