diff -ur dvi2tty-5.3.4.orig/Changelog dvi2tty-5.3.4/Changelog --- dvi2tty-5.3.4.orig/Changelog 2010-11-13 16:36:04.000000000 +0100 +++ dvi2tty-5.3.4/Changelog 2011-11-21 19:56:42.000000000 +0100 @@ -1,4 +1,9 @@ /****************************************************************************** + * Takuji Tanaka: 20111119 (KXD02663@nifty.ne.jp) + * Used ptexenc library for Japanese TeX. + * Enabled UTF8 output for Japanese TeX with option -Eu. + * Added upTeX DVI support with option -U. + * Added auto detected Japanese fonts in japanese-otf package. * Marcel Mol: 20101113 (marcel@mesa.nl) * Version 5.3.4 * Fix VERSION code diff -ur dvi2tty-5.3.4.orig/dvi2tty.1 dvi2tty-5.3.4/dvi2tty.1 --- dvi2tty-5.3.4.orig/dvi2tty.1 2010-11-13 16:30:56.000000000 +0100 +++ dvi2tty-5.3.4/dvi2tty.1 2011-11-21 21:26:24.000000000 +0100 @@ -129,7 +129,7 @@ Note this may interfere with -u. Best not to use -u and -s together. .TP .B \-J -Auto detect NTT JTeX and ASCII pTeX dvi format. +Auto detect NTT JTeX, ASCII pTeX, and upTeX dvi format. .TP .B \-N Display NTT JTeX dvi. @@ -137,6 +137,13 @@ .B \-A Display ASCII pTeX dvi. .TP +.B \-U +Display upTeX dvi. +.TP +.B \-Eenc +Set output Japanese encoding. The enc argument 'e', 's', 'j', and 'u' +denotes EUC-JP, Shift_JIS, ISO-2022-JP, and UTF-8, respectively. +.TP .B \-bdelim Print the name of fonts when switching to it (and ending it). The delim argument is used to delimit the fontname. diff -ur dvi2tty-5.3.4.orig/dvi2tty.c dvi2tty-5.3.4/dvi2tty.c --- dvi2tty-5.3.4.orig/dvi2tty.c 2010-11-13 16:33:50.000000000 +0100 +++ dvi2tty-5.3.4/dvi2tty.c 2011-11-21 22:30:24.000000000 +0100 @@ -55,11 +55,11 @@ #define MAXLEN 100 /* size of char-arrays for strings */ #if defined(MSDOS) || defined(VMS) || defined(AMIGA) -#define OPTSET "haJwepPousltvbcAN" /* legal options */ -#define OPTWARG "wepPovb" /* options with argument */ +#define OPTSET "haJweEpPousltvbcANU" /* legal options */ +#define OPTWARG "weEpPovb" /* options with argument */ #else -#define OPTSET "haJwepPousqlfFtvbcAN"/* legal options */ -#define OPTWARG "wepPoFvb" /* options with argument */ +#define OPTSET "haJweEpPousqlfFtvbcANU" /* legal options */ +#define OPTWARG "weEpPoFvb" /* options with argument */ #endif /* @@ -75,10 +75,9 @@ #define bdopt 7 /* bad option */ #define onepp 8 /* only one page list allowed */ #define noarg 9 /* argument expected */ -#define confl 10 /* -N and -A conflict */ -#define confj 11 /* -J conflicts -N or -A */ +#define confl 10 /* -J, -N, -A, and -U conflict */ #if defined(THINK_C) -#define nored 12 /* if no input file, redirect stdin */ +#define nored 11 /* if no input file, redirect stdin */ #endif @@ -166,6 +165,7 @@ Argc = argc; Argv = argv; + set_enc_string (NULL, "default"); getargs(); /* read command line arguments */ #if defined(THINK_C) if (inputfromfile) { @@ -380,10 +380,35 @@ j = strlen(optarg); break; #endif - /* case 'J' : japan = TRUE; break; */ case 'J' : jautodetect = TRUE; break; - case 'A' : asciip = TRUE; break; /* ASCII pTeX */ - case 'N' : japan = TRUE; break; /* NTT jTeX */ + case 'U' : uptex = TRUE; japan = TRUE; /* upTeX */ + jautodetect = FALSE; + enable_UPTEX(true); + set_enc_string (NULL, UPTEX_INTERNAL_ENC); + break; + case 'A' : asciip = TRUE; japan = TRUE; /* ASCII pTeX */ + jautodetect = FALSE; + set_enc_string (NULL, PTEX_INTERNAL_ENC); + break; + case 'N' : nttj = TRUE; japan = TRUE; /* NTT jTeX */ + jautodetect = FALSE; + set_enc_string (NULL, JTEX_INTERNAL_ENC); + break; + case 'E' : + switch (optarg[0]) { + case 'e' : + set_enc_string ("euc", NULL); break; + case 's' : + set_enc_string ("sjis", NULL); break; + case 'j' : + set_enc_string ("jis", NULL); break; + case 'u' : + set_enc_string ("utf8", NULL); break; + default : + usage(noarg); + } + j++; + break; case 't' : ttfont = TRUE; break; case 'l' : noffd = TRUE; break; case 's' : scascii ^= 1; break; @@ -436,14 +461,12 @@ } /* Option conflict */ - if (japan && asciip) { + if ((asciip && uptex) || + (nttj && (asciip || uptex)) || + (jautodetect && (nttj || asciip || uptex))) { usage(confl); } - if (jautodetect && (japan || asciip)) { - usage(confj); - } - return; } /* setoption */ @@ -707,7 +730,10 @@ void usage(int uerr) { - fprintf(stderr, "%s", Copyright); + if (jautodetect || nttj || asciip || uptex) + fprintf(stderr, "%s (%s) %s", Progname, get_enc_string(), Copyright); + else + fprintf(stderr, "%s %s", Progname, Copyright); if (uerr != ign) { fprintf(stderr,"\n%s: ", progname); @@ -734,9 +760,7 @@ break; case onepp : fprintf(stderr, "only one pagelist allowed"); break; - case confl : fprintf(stderr, "-N and -A are conflicting"); - break; - case confj : fprintf(stderr, "-J conflicts -N or -A"); + case confl : fprintf(stderr, "-J, -N, -A, and -U are mutually exclusive"); break; #if defined(THINK_C) case nored : fprintf(stderr, "\nIf no input file is given in\ @@ -794,12 +818,16 @@ fprintf(stderr, " -u Toggle latin1 support (default %s).\n", DEFLATIN1 ? "on" : "off"); fprintf(stderr, - " -J Enable auto detect for NTT JTeX and ASCII pTeX (japanese fonts).\n"); + " -J Enable auto detect for NTT JTeX, ASCII pTeX, and upTeX (japanese fonts).\n"); fprintf(stderr, " -N Support NTT JTeX dvi.\n"); fprintf(stderr, " -A Support ASCII pTeX dvi.\n"); fprintf(stderr, + " -U Support upTeX dvi.\n"); + fprintf(stderr, + " -Eenc Output Japanese encoding. e:EUC s:SJIS j:JIS, u:UTF8.\n"); + fprintf(stderr, " -c Override -a -u -s and print all characters 0-255.\n"); fprintf(stderr, " -bdelim Print font switch as text: delimcmr10miled\n"); diff -ur dvi2tty-5.3.4.orig/dvi2tty.h dvi2tty-5.3.4/dvi2tty.h --- dvi2tty-5.3.4.orig/dvi2tty.h 2010-11-13 16:33:42.000000000 +0100 +++ dvi2tty-5.3.4/dvi2tty.h 2011-11-21 22:28:42.000000000 +0100 @@ -20,7 +20,8 @@ #define VERSION "5.3.4" -#define Copyright "dvi2tty Copyright (C) 1984, 1985, 1986 Svante Lindahl.\n\ +#define Progname "dvi2tty" +#define Copyright "Copyright (C) 1984, 1985, 1986 Svante Lindahl.\n\ Copyright (C) 1989-2010 M.J.E. Mol, MESA Consulting B.V." @@ -54,6 +55,18 @@ */ #define MAXTERMWIDTH 332 +#include +#include + +/* internal encoding for NTT JTeX : "euc" */ +#define JTEX_INTERNAL_ENC "euc" + +/* internal encoding for ASCII pTeX : "euc" or "sjis" */ +#define PTEX_INTERNAL_ENC "euc" + +/* internal encoding for upTeX : "uptex" */ +#define UPTEX_INTERNAL_ENC "uptex" + /* * ERROR CODES , don't start with 0 */ @@ -109,9 +122,11 @@ extern bool latin1; /* latin1 chars (dvistuff.c) */ extern bool accent; /* Output accent stuff(dvistuff.c) */ extern bool ttfont; /* tt font assumed (dvistuff.c) */ -extern bool japan; /* NTT jTeX font support (dvistuff.c) */ +extern bool jautodetect; /* Autodetect NTT jTeX, ASCII pTeX and upTeX (dvistuff.c) */ +extern bool nttj; /* NTT jTeX font support (dvistuff.c) */ extern bool asciip; /* ASCII pTeX font support (dvistuff.c) */ -extern bool jautodetect; /* Autodetect NTT jTex and ASCII pTeX (dvistuff.c) */ +extern bool uptex; /* upTeX font support (dvistuff.c) */ +extern bool japan; /* japanized TeX font support (dvistuff.c) */ extern bool noffd; /* output ^L or formfeed (dvistuff.c) */ extern bool printfont; /* include font switches (dvistuff.c) */ extern bool allchar; /* output all characters (dvistuff.c */ diff -ur dvi2tty-5.3.4.orig/dvi2tty.tex dvi2tty-5.3.4/dvi2tty.tex --- dvi2tty-5.3.4.orig/dvi2tty.tex 2010-10-30 12:13:29.000000000 +0200 +++ dvi2tty-5.3.4/dvi2tty.tex 2011-11-21 21:26:57.000000000 +0100 @@ -192,11 +192,16 @@ terminals in Scandinavia are mapped to ``\{$|$\}[\bs ]''. Note this may interfere with -u. Best not to use -u and -s together. \item[{{\bf -J}}] -Auto detect NTT JTeX and ASCII pTeX dvi format. +Auto detect NTT JTeX, ASCII pTeX, and upTeX dvi format. \item[{{\bf -N}}] Display NTT JTeX dvi. \item[{{\bf -A}}] Display ASCII pTeX dvi. +\item[{{\bf -U}}] +Display upTeX dvi. +\item[{{\bf -Eenc}}] +Set output Japanese encoding. The enc argument 'e', 's', 'j', and 'u' +denotes EUC-JP, Shift\_JIS, ISO-2022-JP, and UTF-8, respectively. \end{list} % % NOTE --- No other files are used under VMS. diff -ur dvi2tty-5.3.4.orig/dvistuff.c dvi2tty-5.3.4/dvistuff.c --- dvi2tty-5.3.4.orig/dvistuff.c 2011-01-27 13:20:02.000000000 +0100 +++ dvi2tty-5.3.4/dvistuff.c 2011-11-21 22:41:54.000000000 +0100 @@ -87,13 +87,6 @@ #define sget3() snum(3) #define sget4() snum(4) -#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 - /* * Structure and variable definitions @@ -122,7 +115,7 @@ long num; struct _font * next; char * name; - char flags; /* to store font types, to get rid of japan/asciip/ttfont/symbolfon/mifont vars */ + char flags; /* to store font types, to get rid of nttj/asciip/uptex/ttfont/symbolfon/mifont vars */ int fontnum; /* helper for japanese fonts */ } font; @@ -140,8 +133,10 @@ bool accent; /* if true output accents etc: \'{e} etc. */ bool ttfont = FALSE; /* if true we assumed ttfonts, not cmr */ bool symbolfont = FALSE; /* true if font is a symbol font */ -bool japan = FALSE; /* switch to NTT japanese fonts ... */ +bool nttj = FALSE; /* switch to NTT japanese fonts ... */ bool asciip = FALSE; /* switch to ASCII japanese fonts ... */ +bool uptex = FALSE; /* switch to upTeX CJK fonts ... */ +bool japan = FALSE; /* switch to NTT/ASCII/.. japanese fonts ... */ bool jautodetect = FALSE; /* switch if do auto detection of Japanese TeX */ bool jdetect = FALSE; /* switch if Japanese TeX detection is done */ bool mifont = FALSE; /* ASCII japanese font ??? */ @@ -177,14 +172,7 @@ font * fonts = NULL; /* List of fontnames defined */ font * fnt = NULL; /* Current font */ -#if JIS -# define SJIS 0 -int inkanji = 0; /* is in kanji sequence */ -# define KANJIIN "\033$B" /* was $@ in debian 5.1-13 patch.. */ -# define KANJIOUT "\033(J" -#endif -int kanji1 = 0; /* is first kanji character */ -int kanji2 = 0; /* is second kanji character */ +int kanji1 = 0; /* number of rest of trailer bytes in kanji character */ @@ -219,7 +207,7 @@ void setfont (long); void jischar (unsigned long); int compute_jis (int, unsigned int, unsigned int *, unsigned int *); -void dokanji (unsigned long); +void dokanji (long); int getjsubfont (char *); #else @@ -249,7 +237,7 @@ void setfont (long fntnum); void jischar (unsigned long ch); void compute_jis (int f, unsigned int c, unsigned int * ku, unsigned int * ten); -void dokanji (unsigned long ch); +void dokanji (long ch); int getjsubfont (char * s); #if defined(VMS) long vmsseek (); @@ -448,9 +436,9 @@ errorexit(illop); else switch (opcode) { - case SET1 : japan ? jischar(get1()) : setchar(get1());break; - case SET2 : asciip ? dokanji(get2()) : setchar(get2()); break; - case SET3 : setchar(get3()); break; + case SET1 : nttj ? jischar(get1()) : setchar(get1());break; + case SET2 : (asciip || uptex) ? dokanji(get2()) : setchar(get2()); break; + case SET3 : uptex ? dokanji(get3()) : setchar(get3()); break; case SET4 : setchar(get4()); break; case SET_RULE : { long height = sget4(); rule(MOVE, sget4(), height); break; @@ -617,8 +605,9 @@ void printpage(void) { - register int i, j; + register int i, j, k; register unsigned char ch; + unsigned char buff[4]; if (sptr != 0) fprintf(stderr, "dvi2tty: warning - stack not empty at eop.\n"); @@ -637,75 +626,59 @@ i++, j++) { ch = currentline->text[i - leftmargin]; - if (asciip) { - 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 || allchar) - putc(ch, output); + if (japan) { + if (ch > 127) { + for (k = 0; k < 4; k++) { + if (i - leftmargin + k < LINELEN+1) + buff[k] = currentline->text[i - leftmargin + k]; + else buff[k] = '\0'; + } + kanji1 = multistrlen(buff, 4, 0) - 1; + } + else kanji1 = 0; + if (kanji1 && (j + kanji1 > (int) foo) && + (currentline->charactercount > i+1)) { + putc2('*', output); + putc2('\n', output); /* if line to large */ + putc2(' ', output); + putc2('*', output); /* mark output */ + j = 2; + } + } + + if (ch >= SPACE || allchar) { + if (japan) { + for (k = 0; k < kanji1; k++) { + putc2(ch, output); + i++; j++; + ch = currentline->text[i - leftmargin]; + } + putc2(ch, output); + } + else + putc(ch, output); + } if ((j > (int) foo) && (currentline->charactercount > i+1)) { -#if JIS - if (asciip && inkanji) - fprintf(output,KANJIOUT); -#endif - fprintf(output, "*\n"); /* if line to large */ - fprintf(output, " *"); /* mark output */ -#if JIS - if (asciip && inkanji) - fprintf(output, KANJIIN); -#endif - j = 2; - } - if (asciip) - kanji2 = 0; + if (japan) { + putc2('*', output); + putc2('\n', output); /* if line to large */ + putc2(' ', output); + putc2('*', output); /* mark output */ + } + else { + fprintf(output, "*\n"); /* if line to large */ + fprintf(output, " *"); /* mark output */ + } + j = 2; + } } } - putc('\n', output); + if (japan) + putc2('\n', output); + else + putc('\n', output); } -#if JIS - if (asciip && !kanji1 && !kanji2 && inkanji) { - fprintf(output, KANJIOUT); - inkanji = 0; - } -#endif - currentline = firstline; while (currentline->next != nil) { currentline = currentline->next; @@ -988,23 +961,19 @@ * DOKANJI -- Process a kanji character opcode. */ -void dokanji(unsigned long ch) +void dokanji(long ch) { -#if SJIS - register int c1, c2; + long i; - c1 = (ch >> 8) & 0xff; - c2 = ch & 0xff; + i = toBUFF(fromDVI(ch)); + kanji1 = 3; + if (BYTE1(i) != 0) outchar(BYTE1(i)); + kanji1 = 2; + if (BYTE2(i) != 0) outchar(BYTE2(i)); kanji1 = 1; - outchar((((c1 - 1) >> 1) + ((c1 <= 0x5e) ? 0x71 : 0xb1))); + /* always */ outchar(BYTE3(i)); kanji1 = 0; - outchar((c2 + ((c1 & 1) ? ((c2 < 0x60) ? 0x1f : 0x20) : 0x7e))); -#else - kanji1 = 1; - outchar(0x80 | ( ch >> 8 )); - kanji1 = 0; - outchar(ch & 0xff); -#endif + /* always */ outchar(BYTE4(i)); return; @@ -1019,7 +988,7 @@ void dochar(unsigned char ch) { - if (japan && fnt->fontnum) + if (nttj && fnt->fontnum) jischar((long) ch); else if (symbolfont == TRUE) symchar(ch); @@ -1048,8 +1017,8 @@ case 14: ch = 'O'; break; case 15: ch = 'o'; break; case 24: ch = '~'; break; - case 32: ch = japan ? '<' : 32; break; /* really only for japan? */ - case 33: ch = japan ? '>' : 33; break; /* really only for japan? */ + case 32: ch = nttj ? '<' : 32; break; /* really only for japan? */ + case 33: ch = nttj ? '>' : 33; break; /* really only for japan? */ case 102: ch = '{'; break; case 103: ch = '}'; break; case 104: ch = '<'; break; @@ -1284,6 +1253,14 @@ /*----------------- end of 'latin1 / Scandinavian code' ----------------*/ if (foo == leftmargin-1) { + if (japan) { + while (((currentline->text[j - leftmargin] != SPACE) || + (kanji1 && (currentline->text[j+kanji1 - leftmargin] != SPACE))) + && (j < rightmargin)) { + j++; + h += charwidth; + } + } else { while (j < rightmargin && ( (currentline->text[j - leftmargin] != SPACE) || (kanji1 && (currentline->text[j+1 - leftmargin] != SPACE)) @@ -1291,6 +1268,7 @@ j++; h += charwidth; } + } } if ( allchar || ((ch >= SPACE) && (ch != DEL)) || ((latin1 || scascii) && (ch == 23)) ) { @@ -1321,7 +1299,7 @@ register long saveh; saveh = h; - if (japan) + if (nttj) dochar((unsigned char) charnr); else if (allchar || ((charnr >= 0) && (charnr <= LASTCHAR))) outchar((unsigned char) charnr); @@ -1351,6 +1329,43 @@ } /* setchar */ +static const char *ptex_fontchk[] = { + "min", "goth", "jis", + "hmin", "hgoth", "hmgoth", /* japanese-otf package */ + "nmlmin", "nmlgoth", "nmlmgoth", + "hiramin", "hirakaku", "hiramaru", + NULL /* end */ +}; + +static const char *uptex_fontchk[] = { + "umin", "ugoth", "ujis", + "upjis", "upjpn", "upsch", "uptch", "upkor", + "uphmin", "uphgoth", "uphmgoth", /* japanese-otf package */ + "upnmlmin", "upnmlgoth", "upnmlmgoth", + "uphiramin", "uphirakaku", "uphiramaru", + NULL /* end */ +}; + +static const char *jtex_fontchk[] = { + "dmj", "dgj", + NULL /* end */ +}; + +static int checkjfont(const char **jfontlist, const char *name) +{ + int i, len; + const char *tmpfont; + + i=0; + while ( (tmpfont=jfontlist[i]) != NULL ) { + len=strlen(tmpfont); + if ( !strncmp(tmpfont, name, len) ) return 1; + i++; + } + return 0; +} /* checkjfont */ + + /* * FONTDEF -- Process a font definition. @@ -1402,22 +1417,33 @@ */ fonts->flags = 0; - if (jautodetect && asciip == FALSE && japan == FALSE && !jdetect) { - if (!strncmp("min", name, 3) || !strncmp("got", name, 3)) { + if ((asciip == FALSE && nttj == FALSE && uptex == FALSE) + && (!jdetect) && jautodetect) { + if ( checkjfont(ptex_fontchk, name) ) { /* Detect as ASCII TeX */ asciip = TRUE; - japan = FALSE; - jdetect = TRUE; + nttj = uptex = FALSE; + japan = jdetect = TRUE; + fonts->flags |= MIFONT; + set_enc_string (NULL, PTEX_INTERNAL_ENC); + } else if ( checkjfont(uptex_fontchk, name) ) { + /* Detect as upTeX */ + uptex = TRUE; + nttj = asciip = FALSE; + japan = jdetect = TRUE; fonts->flags |= MIFONT; - } else if (!strncmp("dmj", name, 3) || !strncmp("dgj", name, 3)) { + enable_UPTEX(true); + set_enc_string (NULL, UPTEX_INTERNAL_ENC); + } else if ( checkjfont(jtex_fontchk, name) ) { /* Detect as NTT JTeX */ - asciip = FALSE; - japan = TRUE; - jdetect = TRUE; + nttj = TRUE; + asciip = uptex = FALSE; + japan = jdetect = TRUE; fonts->flags |= JAPFONT; + set_enc_string (NULL, JTEX_INTERNAL_ENC); } } - if (japan) + if (nttj) fonts->fontnum = getjsubfont(name); else fonts->fontnum = 0; @@ -1511,7 +1537,9 @@ unsigned int Ku, Ten; compute_jis(fnt->fontnum, (unsigned int) ch, &Ku, &Ten); + kanji1 = 1; outchar(Ku+128); + kanji1 = 0; outchar(Ten+128); return;