Tex->nroff conversion for GNUEmacs Manuals
George Robbert
ghr at wucs.UUCP
Sat Dec 14 01:41:01 AEST 1985
Several people on the net have asked for the v16 GNU Emacs manuals
in nroff/troff format. I wrote a quicky program to convert from the
TeX it's distributed in to nroff/troff. I'm posting it here after
a couple of requests. It doesn't handle the fancy stuff of TeX changing
fonts and typefaces. It's just a simple lex program to produce a nroff
source for a readable manual. There also is a small C program to handle
the indecies. Btw: the nroff it produces assumes that you are using
the -me package. If you find any bugs or make any improvements on this,
Please let me know. I've also included a makefile, a file of nroff macro
definitions and a trailer file to print out the table of contents for the
GNU manual. You will probably have to modify the makefile to use the
right filenames for the GNU manual(s) and to put the nroff where you
want it.
George Robbert @ Washington University in St. Louis
ghr at wucs or ...!ihnp4!wucs!ghr
---------------------------- cut here --------------------------
#! /bin/sh
# This is a shell archive, meaning:
# 1. Remove everything above the #! /bin/sh line.
# 2. Save the resulting text in a file.
# 3. Execute the file with /bin/sh (not csh) to create the files:
# Makefile
# indexhead
# grindindex.sh
# local.tr
# mkindex.c
# textonr.l
# trailer.me
# This archive created: Sat Dec 7 22:40:25 1985
export PATH; PATH=/bin:$PATH
if test -f 'Makefile'
then
echo shar: will not over-write existing file "'Makefile'"
else
cat << \SHAR_EOF > 'Makefile'
DEV= -Tlp
COL= icol
print: emacs.out index.out
lpr emacs.out index.out
emacs.out emacs.index: emacs.tr ggloss.tr
/bin/sh -c 'nroff $(DEV)-me local.tr emacs.tr trailer.me 1>emacs.out 2>emacs.index'
emacs.nr: textonr
textonr <emacs.tex | sed 's/%\.tm'/%\
.tm/' >emacs.tr
ggloss.tr:
textonr <ggloss.tex >ggloss.tr
index.out: emacs.index mkindex grindindex.sh
cp indexhead index.nr
echo '.+c "Key (Character) Index"' >>index.nr
echo '.sp 2' >>index.nr
echo '.2c' >>index.nr
grindindex.sh kindex >>index.nr
echo '.1c' >>index.nr
echo '.+c "Command Index"' >>index.nr
echo '.sp 2' >>index.nr
echo '.2c' >>index.nr
grindindex.sh cfindex >>index.nr
echo '.1c' >>index.nr
echo '.+c "Variable Index"' >>index.nr
echo '.sp 2' >>index.nr
echo '.2c' >>index.nr
grindindex.sh vindex >>index.nr
echo '.1c' >>index.nr
echo '.+c "Concept Index"' >>index.nr
echo '.sp 2' >>index.nr
echo '.2c' >>index.nr
grindindex.sh cindex >>index.nr
nroff $(DEV) -me index.nr | $(COL) >index.out
textonr: textonr.o
cc -o textonr textonr.o -ll
textonr.o: textonr.c
cc -c textonr.c
textonr.c: textonr.l
lex textonr.l ; mv lex.yy.c textonr.c
mkindex: mkindex.c
cc -o mkindex mkindex.c
SHAR_EOF
fi # end of overwriting check
if test -f 'indexhead'
then
echo shar: will not over-write existing file "'indexhead'"
else
cat << \SHAR_EOF > 'indexhead'
.++ RA "''GNU Emacs Manual'\\\\\\\\n(ch.%'"
SHAR_EOF
fi # end of overwriting check
if test -f 'grindindex.sh'
then
echo shar: will not over-write existing file "'grindindex.sh'"
else
cat << \SHAR_EOF > 'grindindex.sh'
sed -n "s/@$1{ //p" emacs.index | \
sed -e 's/ \([0-9]\)$/ 00\1/' -e \
's/ \([0-9][0-9]\)$/ 0\1/' | sort | mkindex
SHAR_EOF
chmod +x 'grindindex.sh'
fi # end of overwriting check
if test -f 'local.tr'
then
echo shar: will not over-write existing file "'local.tr'"
else
cat << \SHAR_EOF > 'local.tr'
.\" macros for running off the GNU EMACS Manual
.\"
.\" Converted from TeX to nroff by
.\" George Robbert
.if n \
\{\
. nr ps 1v \" set space before paragraph
. nr LS 1v
\}
.if t \
\{\
. nr ps .5v
. nr ls .5v
\}
.nr pi 2n
.\"
.\" this macro prints the section headings.
.\"
.de $0
.(x
.ie '\\$2'' \
\{\
.ti 5
\\$1
\}
.el \
\{\
.ti 5
\\$2. \\$1
\}
.)x
..
.de $C
.(x
\\$1 \\$2 \\$3
.)x
.sx
..
SHAR_EOF
fi # end of overwriting check
if test -f 'mkindex.c'
then
echo shar: will not over-write existing file "'mkindex.c'"
else
cat << \SHAR_EOF > 'mkindex.c'
#include <stdio.h>
main()
{
register char *s,*t;
char topic[80],prevtopic[80];
char stg[80],outstg[2048];
char *osp;
char *head;
int references[2048],i,j,f;
prevtopic[0] = '\0';
i = 0;
topic[0] = '\0';
f = 0;
printf(".in 8\n");
while (gets(stg) != NULL) {
for(s = stg,t = topic;*s != '\t';)
*t++ = *s++;
*t = '\0';
s++;
if (strcmp(topic,prevtopic) != 0) {
output:
if (prevtopic[0] != '\0') {
if (prevtopic[0] == '.')
printf(".ti 0\n\\&%s, ",prevtopic);
else
printf(".ti 0\n%s, ",prevtopic);
if (i > 0)
printf("%d",references[0]);
for(j=1;j < i;j++) {
printf(", %d",references[j]);
}
putchar('\n');
}
strcpy(prevtopic,topic);
references[0] = atoi(s);
i = 1;
if (f) exit(0);
}
else {
references[i++] = atoi(s);
}
}
f = 1;
goto output;
}
SHAR_EOF
fi # end of overwriting check
if test -f 'textonr.l'
then
echo shar: will not over-write existing file "'textonr.l'"
else
cat << \SHAR_EOF > 'textonr.l'
%{
char *sstk[20] = {0};
char *cstk[20] = {0};
char *pstk[20] = {0};
char *estk[20] = {0};
int sptr = 0;
int cptr = 0;
int pptr = 0;
int eptr = 0;
pushstk();
popstk();
char *EOLS = "\n";
char *NULSTG = "";
char *FR = "\\fR";
%}
LB [ \t]*[\133{(]
RB [\135})\n]
%e 2000
%p 6000
%n 1000
%START ITEM ENUM
%%
\\ {printf("\\e");}
"\\input" {printf(".CO %s",yytext);}
\n\n" " {printf("\n.pp\n");}
\n\n/[A-Za-z] {printf("\n.lp\n");}
"@@" {printf("@");}
"@." {printf(".");}
\006"9" {printf("\\s+8");}
\006"*" {printf("\\s-8");}
".el" {printf("\\&.el");}
".signature" {printf("\\&%s",yytext);}
"@menu" {printf(".ig I1");}
"@end menu" {printf(".I1");}
"@ignore" {printf(".ig I2");}
"@end ignore" {printf(".I2");}
"@info" {printf(".ig I3");}
"@end info" {printf(".I3");}
"@node".*$ {printf(".CO %s",yytext);}
"@tex" {printf(".ig I4");}
"@end tex" {printf(".I4");}
"@ifinfo" {printf(".ig I5");}
"@end ifinfo" {printf(".I5");}"
"@example" {printf(".(l");}
"@end example" {printf(".)l\n.sp \\n(psu");}
"@quotation" {printf(".(q");}
"@end quotation" {printf(".)q");}
"@format" {printf(".(q");}
"@end format" {printf(".)q");}
"@dots" {printf("...");}
"@bullet" {printf("\\(bu");}
{RB} {popstk(*yytext);}
"@code"{LB} {printf("\\f3"); pushstk(yytext,FR);}
"@kbd"{LB} {printf("\\f3"); pushstk(yytext,FR);}
"@ctl"{LB} {printf("\\f3"); pushstk(yytext,FR);}
"@dfn"{LB} {printf("\\f3"); pushstk(yytext,FR);}
"@key"{LB} {printf("\\f3"); pushstk(yytext,FR);}
"@samp"{LB} {printf("\\f3"); pushstk(yytext,FR);}
"@var"{LB} {printf("\\fI"); pushstk(yytext,FR);}
"@i"{LB} {printf("\\fI"); pushstk(yytext,FR);}
"@b"{LB} {printf("\\fB"); pushstk(yytext,FR);}
"@w"{LB} {pushstk(yytext,NULSTG);}
"@ttfont"{LB} {pushstk(yytext,NULSTG);}
"@c ".*$ {printf(".CO %s",yytext+2);}
"@comment".*$ {printf(".CO %s",yytext+8);}
"@iftex" {printf(".CO");}
"@end iftex" {printf(".CO");}
"@unnumberedsec " {printf(".uh \"");pushstk(EOLS,"\"\n.sp \\npsu\n");}
"@unnumberedsec"{LB} {printf(".uh \"");pushstk(yytext,"\"\n.sp \\npsu\n");}
"@display" {printf(".(c\n.(l");}
"@end display" {printf(".)l\n.)c");}
"@begin"{LB} {printf(".CO ");pushstk(yytext,NULSTG);}
"@end description" {printf(".CO %s",yytext);}
"@page" {printf(".bp");}
"@TeX" {printf("TeX");}
"@section"{LB} {printf(".sh 1 \"");pushstk(yytext,"\"");}
"@section " {printf(".sh 1 \"");pushstk(EOLS,"\"");}
"@unnumbered"{LB} {printf(".uh \"");pushstk(yytext,"\"");}
"@unnumbered " {printf(".CO %s",yytext);}
"@summarycontents" {printf(".CO %s",yytext);}
"@contents" {printf(".CO %s",yytext);}
"@bye" {printf(".CO %s",yytext);}
"@subsection " {printf(".sh 2 \"");pushstk(EOLS,"\"\n");}
"@subsection"{LB} {printf(".sh 2 \"");pushstk(yytext,"\"\n");}
"@table " {printf(".ba +");}
"@end table" {printf(".ba\n.lp");}
"@exdent 1 " {printf(".ti 0\n");}
"@item " {printf(".ip \"");pushstk(EOLS,"\" 10\n");}
"@itemx " {printf(".ip \"");pushstk(EOLS,"\" 10\n");}
"@itemize" {printf(".ds IC"); BEGIN ITEM;}
<ITEM>"@item"$ {printf(".ip \\*(IC");}
"@end itemize" {printf(".rm IC"); BEGIN 0;}
"@enumerate" {printf(".nr $p 0"); BEGIN ENUM;}
<ENUM>"@item"$ {printf(".np");}
"@end enumerate" {printf(".nr $p 0"); BEGIN 0;}
"@vindex"{LB} {printf(".tm %s ",yytext);pushstk(yytext,"\t\\n%");}
"@cfindex"{LB} {printf(".tm %s ",yytext);pushstk(yytext,"\t\\n%");}
"@cindex"{LB} {printf(".tm %s ",yytext);pushstk(yytext,"\t\\n%");}
"@findex"{LB} {printf(".tm %s ",yytext);pushstk(yytext,"\t\\n%");}
"@kindex"{LB} {printf(".tm %s ",yytext);pushstk(yytext,"\t\\n%");}
"@printindex" {printf(".CO %s",yytext);}
"@chapter"{LB} {printf(".+c \"");pushstk(yytext,"\"");}
"@chapter" {printf(".+c \"");pushstk(EOLS,"\"");}
"@xref"{LB} {printf("See ");pushstk(yytext,NULSTG);}
"@nopara" {printf(".CO nopara");}
"@pxref"{LB} {printf("See ");pushstk(yytext,NULSTG);}
"@sp" {printf(".sp");}
"@center"[ \t]* {printf(".ce 1\n");}
"@setref" {printf(".SR");}
"@lisp" {printf(".(q");}
"@end lisp" {printf(".)q");}
"@settitle"{LB} {printf(".he ''");pushstk(yytext,"'%'");}
"@setchapternewpage" {printf(".CO %s",yytext);}
"@headings" {printf(".CO %s",yytext);}
"@refill" {/* do nothing */}
"@include" {printf(".CO %s",yytext);}
"@include ggloss.tex" {printf(".so ggloss.tr");}
"@lispnarrowing" {printf(".CO %s",yytext);}
"@tableindent" {printf(".CO %s",yytext);}
"@itemindent" {printf(".CO %s",yytext);}
"@baselineskip" {printf(".CO %s",yytext);}
"@aboveenvskipamount" {printf(".CO %s",yytext);}
"@parskip" {printf(".CO %s",yytext);}
"@parindent" {printf(".CO %s",yytext);}
"@hsize" {printf(".CO %s",yytext);}
"@defindex" {printf(".CO %s",yytext);}
"@kern" {printf(".CO %s",yytext);}
%%
char *
substr(s,i)
char *s;
int i;
{
s[strlen(s)-1] = '\0';
return(s+i);
}
pushstk(c,s)
char c[],*s;
{
switch(c[strlen(c)-1]) {
case '[': sstk[sptr++] = s;
break;
case '{': cstk[cptr++] = s;
break;
case '(': pstk[pptr++] = s;
break;
case '\n':estk[eptr++] = s;
break;
}
}
popstk(c)
char c;
{
switch(c) {
case ']': if (sptr <= 0)
printf("]");
else
printf("%s",sstk[--sptr]);
break;
case '}': if (cptr <= 0)
printf("}");
else
printf("%s",cstk[--cptr]);
break;
case ')': if (pptr <= 0)
printf(")");
else
printf("%s",pstk[--pptr]);
break;
case '\n':if (eptr <=0)
printf("\n");
else
printf("%s",estk[--eptr]);
break;
}
}
/* -*- C -*- */
SHAR_EOF
chmod +x 'textonr.l'
fi # end of overwriting check
if test -f 'trailer.me'
then
echo shar: will not over-write existing file "'trailer.me'"
else
cat << \SHAR_EOF > 'trailer.me'
.af % i
.bp 1
.ce 2
CONTENTS
.ce 0
.sp 5v
.xp
SHAR_EOF
fi # end of overwriting check
# End of shell archive
exit 0
More information about the Comp.sources.unix
mailing list