|
|
|
|
C=======================================================================
|
|
|
|
|
PROGRAM FORMTEX
|
|
|
|
|
C=======================================================================
|
|
|
|
|
|
|
|
|
|
C Written by Amy Gilkey
|
|
|
|
|
C Last Revised 06/01/88
|
|
|
|
|
|
|
|
|
|
C --FORMTEX formats a TEX file.
|
|
|
|
|
|
|
|
|
|
PARAMETER (MAXCOL = 72)
|
|
|
|
|
|
|
|
|
|
CHARACTER*120 LASTLINE
|
|
|
|
|
CHARACTER*120 THISLINE
|
|
|
|
|
CHARACTER*20 WORD, WORD2
|
|
|
|
|
LOGICAL DONELAST
|
|
|
|
|
LOGICAL DONETHIS
|
|
|
|
|
LOGICAL VERBATIM
|
|
|
|
|
LOGICAL ASIS
|
|
|
|
|
|
|
|
|
|
INTEGER*2 I2
|
|
|
|
|
|
|
|
|
|
C --Open the input and output files
|
|
|
|
|
|
|
|
|
|
NTEX = 20
|
|
|
|
|
|
|
|
|
|
OPEN (NTEX, FILE='INFILE', READONLY, STATUS='OLD', IOSTAT=IERR)
|
|
|
|
|
IF (IERR .NE. 0) THEN
|
|
|
|
|
PRINT *, 'ERROR - Cannot open input file'
|
|
|
|
|
GOTO 120
|
|
|
|
|
END IF
|
|
|
|
|
|
|
|
|
|
NFMT = 30
|
|
|
|
|
|
|
|
|
|
OPEN (NFMT, FILE='OUTFILE', CARRIAGECONTROL='LIST',
|
|
|
|
|
& STATUS='NEW')
|
|
|
|
|
|
|
|
|
|
C --Process the file
|
|
|
|
|
|
|
|
|
|
LASTEND = -1
|
|
|
|
|
VERBATIM = .FALSE.
|
|
|
|
|
|
|
|
|
|
DO WHILE (.TRUE.)
|
|
|
|
|
READ (NTEX, '(A)', IOSTAT=IOSTAT) THISLINE
|
|
|
|
|
IDUM = STR$TRIM (THISLINE, THISLINE, I2)
|
|
|
|
|
IEND = JZEXT (I2)
|
|
|
|
|
DONELAST = .FALSE.
|
|
|
|
|
DONETHIS = .FALSE.
|
|
|
|
|
ASIS = VERBATIM
|
|
|
|
|
|
|
|
|
|
IF (IOSTAT .LT. 0) THEN
|
|
|
|
|
DONELAST = .TRUE.
|
|
|
|
|
IEND = -1
|
|
|
|
|
|
|
|
|
|
ELSE IF (IEND .EQ. 0) THEN
|
|
|
|
|
DONELAST = .TRUE.
|
|
|
|
|
DONETHIS = .TRUE.
|
|
|
|
|
|
|
|
|
|
ELSE IF (THISLINE(1:1) .EQ. '%') THEN
|
|
|
|
|
DONELAST = .TRUE.
|
|
|
|
|
DONETHIS = .TRUE.
|
|
|
|
|
ASIS = .TRUE.
|
|
|
|
|
|
|
|
|
|
ELSE IF (THISLINE(1:1) .EQ. ' ') THEN
|
|
|
|
|
DONELAST = .TRUE.
|
|
|
|
|
|
|
|
|
|
ELSE IF ((THISLINE(1:1) .EQ. '}')
|
|
|
|
|
& .OR. (THISLINE(1:1) .EQ. '{')) THEN
|
|
|
|
|
DONELAST = .TRUE.
|
|
|
|
|
IF (IEND .EQ. 1) DONETHIS = .TRUE.
|
|
|
|
|
|
|
|
|
|
ELSE IF (THISLINE(1:1) .EQ. '&') THEN
|
|
|
|
|
DONELAST = .TRUE.
|
|
|
|
|
|
|
|
|
|
ELSE IF (THISLINE(1:1) .EQ. '\') THEN
|
|
|
|
|
IL = 1
|
|
|
|
|
CALL SCANSLASH (THISLINE, IL, IEND, WORD)
|
|
|
|
|
|
|
|
|
|
IF ((WORD .EQ. '\caps')
|
|
|
|
|
& .OR. (WORD .EQ. '\cmd')
|
|
|
|
|
& .OR. (WORD .EQ. '\param')
|
|
|
|
|
& .OR. (WORD .EQ. '\bold')
|
|
|
|
|
& .OR. (WORD .EQ. '\mbox')
|
|
|
|
|
& .OR. (WORD .EQ. '\ref')
|
|
|
|
|
& .OR. (WORD .EQ. '\ldots')
|
|
|
|
|
& .OR. (WORD .EQ. '\PROGRAM')
|
|
|
|
|
& .OR. (WORD .EQ. '\\')) THEN
|
|
|
|
|
CONTINUE
|
|
|
|
|
ELSE IF (WORD .EQ. '\item') THEN
|
|
|
|
|
DONELAST = .TRUE.
|
|
|
|
|
IF (IL .GE. IEND) DONETHIS = .TRUE.
|
|
|
|
|
ELSE
|
|
|
|
|
DONELAST = .TRUE.
|
|
|
|
|
DONETHIS = .TRUE.
|
|
|
|
|
IF ((WORD .EQ. '\begin') .OR. (WORD .EQ. '\end')) THEN
|
|
|
|
|
CALL SCANPARAM (THISLINE, IL, IEND, WORD2)
|
|
|
|
|
IF (WORD2 .EQ. 'verbatim') THEN
|
|
|
|
|
VERBATIM = (WORD .EQ. '\begin')
|
|
|
|
|
IF (.NOT. VERBATIM) ASIS = .FALSE.
|
|
|
|
|
END IF
|
|
|
|
|
END IF
|
|
|
|
|
END IF
|
|
|
|
|
END IF
|
|
|
|
|
|
|
|
|
|
IF (IEND .GT. 0) THEN
|
|
|
|
|
IF (THISLINE(IEND:IEND) .EQ. '{') THEN
|
|
|
|
|
DONETHIS = .TRUE.
|
|
|
|
|
END IF
|
|
|
|
|
IF (THISLINE(IEND:IEND) .EQ. '\') THEN
|
|
|
|
|
DONETHIS = .TRUE.
|
|
|
|
|
END IF
|
|
|
|
|
END IF
|
|
|
|
|
|
|
|
|
|
IF (ASIS) THEN
|
|
|
|
|
DONELAST = .TRUE.
|
|
|
|
|
DONETHIS = .TRUE.
|
|
|
|
|
END IF
|
|
|
|
|
|
|
|
|
|
IF (DONELAST) THEN
|
|
|
|
|
IF (LASTEND .GE. 0) THEN
|
|
|
|
|
WRITE (NFMT, 10000) LASTLINE(:LASTEND)
|
|
|
|
|
LASTEND = -1
|
|
|
|
|
END IF
|
|
|
|
|
END IF
|
|
|
|
|
|
|
|
|
|
IF (IOSTAT .LT. 0) GOTO 110
|
|
|
|
|
|
|
|
|
|
IF (.NOT. ASIS) THEN
|
|
|
|
|
DO WHILE (.TRUE.)
|
|
|
|
|
I = INDEX (THISLINE, '. ')
|
|
|
|
|
IF ((I .LE. 0) .OR. (I .GE. IEND)) GOTO 100
|
|
|
|
|
THISLINE(I+1:) = THISLINE(I+2:)
|
|
|
|
|
IEND = IEND - 1
|
|
|
|
|
END DO
|
|
|
|
|
100 CONTINUE
|
|
|
|
|
END IF
|
|
|
|
|
|
|
|
|
|
DO WHILE ((.NOT. ASIS) .AND. (IEND .GT. 0))
|
|
|
|
|
IF (LASTEND .LT. 0) LASTEND = 0
|
|
|
|
|
IF (LASTEND .EQ. 0) THEN
|
|
|
|
|
NCH = 0
|
|
|
|
|
ELSE
|
|
|
|
|
NCH = LASTEND + 1
|
|
|
|
|
END IF
|
|
|
|
|
IF ((NCH + IEND) .LE. MAXCOL) THEN
|
|
|
|
|
IF (NCH .GT. 0) LASTLINE(NCH:NCH) = ' '
|
|
|
|
|
LASTLINE(NCH+1:) = THISLINE(1:IEND)
|
|
|
|
|
LASTEND = NCH + IEND
|
|
|
|
|
IEND = -1
|
|
|
|
|
ELSE
|
|
|
|
|
ISTART = LIB$SKPC (' ', THISLINE)
|
|
|
|
|
I = MAXCOL - NCH + 1
|
|
|
|
|
IF (I .LT. ISTART) I = 0
|
|
|
|
|
DO WHILE ((I .GT. 0) .AND. (THISLINE(I:I) .NE. ' '))
|
|
|
|
|
I = I - 1
|
|
|
|
|
END DO
|
|
|
|
|
IF ((LASTEND .EQ. 0) .AND. (I .LE. 0))
|
|
|
|
|
& I = INDEX (THISLINE, ' ')
|
|
|
|
|
IF (I .GT. 0) THEN
|
|
|
|
|
IF (NCH .GT. 0) LASTLINE(NCH:NCH) = ' '
|
|
|
|
|
LASTLINE(NCH+1:) = THISLINE(1:I-1)
|
|
|
|
|
C#???? LASTEND = NCH + I-1
|
|
|
|
|
IDUM = STR$TRIM (LASTLINE, LASTLINE, I2)
|
|
|
|
|
LASTEND = JZEXT (I2)
|
|
|
|
|
THISLINE = THISLINE(I+1:IEND)
|
|
|
|
|
IEND = IEND - I
|
|
|
|
|
END IF
|
|
|
|
|
IF (LASTEND .GE. 0) THEN
|
|
|
|
|
WRITE (NFMT, 10000) LASTLINE(:LASTEND)
|
|
|
|
|
LASTEND = -1
|
|
|
|
|
END IF
|
|
|
|
|
END IF
|
|
|
|
|
END DO
|
|
|
|
|
|
|
|
|
|
IF (DONETHIS) THEN
|
|
|
|
|
IF (LASTEND .GE. 0) THEN
|
|
|
|
|
WRITE (NFMT, 10000) LASTLINE(:LASTEND)
|
|
|
|
|
LASTEND = -1
|
|
|
|
|
END IF
|
|
|
|
|
IF (IEND .GE. 0) THEN
|
|
|
|
|
WRITE (NFMT, 10000) THISLINE(:IEND)
|
|
|
|
|
IEND = -1
|
|
|
|
|
END IF
|
|
|
|
|
END IF
|
|
|
|
|
END DO
|
|
|
|
|
|
|
|
|
|
110 CONTINUE
|
|
|
|
|
|
|
|
|
|
CLOSE (NTEX)
|
|
|
|
|
CLOSE (NFMT)
|
|
|
|
|
|
|
|
|
|
120 CONTINUE
|
|
|
|
|
10000 FORMAT (10A)
|
|
|
|
|
END
|
|
|
|
|
|
|
|
|
|
C=======================================================================
|
|
|
|
|
SUBROUTINE SCANSLASH (INLINE, ILINE, IEND, WORD)
|
|
|
|
|
C=======================================================================
|
|
|
|
|
|
|
|
|
|
C --SCANSLASH scans the input line for the "\" word. The "\" word
|
|
|
|
|
C --may be a string of alphabetic characters or a single character.
|
|
|
|
|
C --
|
|
|
|
|
C --Parameters:
|
|
|
|
|
C -- INLINE - IN - the input line
|
|
|
|
|
C -- ILINE - IN/OUT - the start of the "\" word, returned end of
|
|
|
|
|
C -- the "\" word
|
|
|
|
|
C -- IEND - IN - the end of line
|
|
|
|
|
C -- WORD - OUT - the "\" word (including "\")
|
|
|
|
|
|
|
|
|
|
CHARACTER*(*) INLINE
|
|
|
|
|
CHARACTER*(*) WORD
|
|
|
|
|
|
|
|
|
|
CHARACTER CH
|
|
|
|
|
|
|
|
|
|
ISTART = ILINE
|
|
|
|
|
|
|
|
|
|
CH = INLINE(ILINE+1:ILINE+1)
|
|
|
|
|
IF ((CH .GE. 'A') .AND. (CH .LE. 'Z'))
|
|
|
|
|
& CH = CHAR (ICHAR(CH) - ICHAR('A') + ICHAR('a'))
|
|
|
|
|
ILINE = ILINE + 1
|
|
|
|
|
|
|
|
|
|
IF ((CH .GE. 'a') .AND. (CH .LE. 'z')) THEN
|
|
|
|
|
DO WHILE (ILINE .LT. IEND)
|
|
|
|
|
CH = INLINE(ILINE+1:ILINE+1)
|
|
|
|
|
IF ((CH .GE. 'A') .AND. (CH .LE. 'Z'))
|
|
|
|
|
& CH = CHAR (ICHAR(CH) - ICHAR('A') + ICHAR('a'))
|
|
|
|
|
IF ((CH .LT. 'a') .OR. (CH .GT. 'z')) GOTO 100
|
|
|
|
|
ILINE = ILINE + 1
|
|
|
|
|
END DO
|
|
|
|
|
END IF
|
|
|
|
|
|
|
|
|
|
100 CONTINUE
|
|
|
|
|
WORD = INLINE(ISTART:ILINE)
|
|
|
|
|
|
|
|
|
|
RETURN
|
|
|
|
|
END
|
|
|
|
|
|
|
|
|
|
C=======================================================================
|
|
|
|
|
SUBROUTINE SCANPARAM (INLINE, ILINE, IEND, WORD)
|
|
|
|
|
C=======================================================================
|
|
|
|
|
|
|
|
|
|
C --SCANPARAM scans the input line for the parameter. The parameter
|
|
|
|
|
C --starts with "{" and ends with "}" (stripped).
|
|
|
|
|
C --
|
|
|
|
|
C --Parameters:
|
|
|
|
|
C -- INLINE - IN - the input line
|
|
|
|
|
C -- ILINE - IN/OUT - the start of the parameter, returned end of
|
|
|
|
|
C -- the parameter
|
|
|
|
|
C -- IEND - IN - the end of line
|
|
|
|
|
C -- WORD - OUT - the parameter without ("{" and "}")
|
|
|
|
|
|
|
|
|
|
CHARACTER*(*) INLINE
|
|
|
|
|
CHARACTER*(*) WORD
|
|
|
|
|
|
|
|
|
|
CHARACTER CH
|
|
|
|
|
|
|
|
|
|
ILINE = ILINE + 1
|
|
|
|
|
CH = INLINE(ILINE:ILINE)
|
|
|
|
|
DO WHILE (CH .EQ. ' ')
|
|
|
|
|
ILINE = ILINE + 1
|
|
|
|
|
CH = INLINE(ILINE:ILINE)
|
|
|
|
|
END DO
|
|
|
|
|
|
|
|
|
|
ISTART = ILINE
|
|
|
|
|
IF (CH .NE. '{') GOTO 100
|
|
|
|
|
|
|
|
|
|
L = LEN (INLINE)
|
|
|
|
|
|
|
|
|
|
ILINE = ILINE + 1
|
|
|
|
|
CH = INLINE(ILINE:ILINE)
|
|
|
|
|
DO WHILE ((CH .NE. '}') .AND. (ILINE .LE. L))
|
|
|
|
|
ILINE = ILINE + 1
|
|
|
|
|
CH = INLINE(ILINE:ILINE)
|
|
|
|
|
END DO
|
|
|
|
|
|
|
|
|
|
100 CONTINUE
|
|
|
|
|
WORD = INLINE(ISTART+1:ILINE-1)
|
|
|
|
|
|
|
|
|
|
RETURN
|
|
|
|
|
END
|