PROCEDURE lsi_latex_reviewLOCAL file_name, lis_file, is_member, key_map_list_name, key_map_name, start_delete; ON_ERROR MESSAGE ('Review aborted'); lsi_latex_end_review; ABORT ENDON_ERROR!++@! Initialize the global variables (ranges and buffer pointers).!--:IF (GET_INFO (lsi_latex_src_buf, 'type') = BUFFER) AND : (lsi_latex_src_buf <> 0) ;THEN : lsi_latex_end_review ;ENDIF; $lsi_latex_src_buf := CURRENT_BUFFER;!++! Get the file name and type.!--4file_name := GET_INFO (CURRENT_BUFFER, 'file_name');;file_name := SUBSTR (file_name, 1, INDEX (file_name, ';'));1lis_file := FILE_PARSE (file_name, '', '', NAME);6lis_file := FILE_PARSE (lis_file + '.LIS', file_name);!++0! Read the listing file into the review buffer.!--3lsi_latex_rev_buf := lsi_lookup_buffer ('$REVIEW');IF lsi_latex_rev_buf = 0THEN; lsi_latex_rev_buf := lsi_lookup_buffer ('$LATEX_REVIEW')ENDIF;IF lsi_latex_rev_buf <> 0THENF lse$do_command ('SET MODIFY/BUFFER=' + GET_INFO (lsi_latex_rev_buf, 'name'));  ERASE (lsi_latex_rev_buf)ELSE8 lsi_latex_rev_buf := CREATE_BUFFER ('$LATEX_REVIEW');# SET (SYSTEM, lsi_latex_rev_buf);) SET (EOB_TEXT, lsi_latex_rev_buf, '');( SET (NO_WRITE, lsi_latex_rev_buf, ON)ENDIF;POSITION (lsi_latex_rev_buf);READ_FILE (lis_file);Else$do_command ('SET NOMODIFY/BUFFER=' + GET_INFO (lsi_latex_rev_buf, 'name')); ,POSITION (BEGINNING_OF (lsi_latex_rev_buf));!++! Find the first error.!--lsi_latex_next_error;!++8! Activate the key map for the source & review buffers.!--Bkey_map_list_name := GET_INFO (lsi_latex_src_buf, "key_map_list");?key_map_name := GET_INFO (KEY_MAP, "first", key_map_list_name);LOOP9 is_member := (key_map_name = "LSI_LATEX_REVIEW_KEYS"); EXITIF is_member;A key_map_name := GET_INFO (KEY_MAP, "next", key_map_list_name); EXITIF key_map_name = 0ENDLOOP;IF NOT is_memberTHEND ADD_KEY_MAP (key_map_list_name, "first", "LSI_LATEX_REVIEW_KEYS")ENDIF;Bkey_map_list_name := GET_INFO (lsi_latex_rev_buf, "key_map_list");?key_map_name := GET_INFO (KEY_MAP, "first", key_map_list_name);LOOP9 is_member := (key_map_name = "LSI_LATEX_REVIEW_KEYS"); EXITIF is_member;A key_map_name := GET_INFO (KEY_MAP, "next", key_map_list_name); EXITIF key_map_name = 0ENDLOOP;IF NOT is_memberTHEND ADD_KEY_MAP (key_map_list_name, "first", "LSI_LATEX_REVIEW_KEYS")ENDIF;ENDPROCEDURE ! lsi_latex_review! PROCEDURE lsi_latex_end_reviewLOCAL key_map_list_name;ON_ERROR IF error <> TPU$_KEYMAPNOTFND THEN# MESSAGE ('Unexpected error'); ABORT ENDIF ENDON_ERROR!++G! Remove any currently highlighted ranges by resetting their pointers.!-- lsi_latex_error_line := 0;lsi_latex_error_range := 0;lsi_latex_source_line := 0;!++2! Restore one-window mode for the current buffer.!--"IF (lse$number_of_windows > 1) AND2 (GET_INFO (lsi_latex_rev_wdw, 'type') = WINDOW)THEN lse$$one_window;) IF lsi_latex_src_buf <> CURRENT_BUFFER THEN- MAP (CURRENT_WINDOW, lsi_latex_src_buf) ENDIF;' lse$set_status_line (CURRENT_WINDOW)ENDIF;!++! Remove the special key maps.!--Bkey_map_list_name := GET_INFO (lsi_latex_rev_buf, "key_map_list");<REMOVE_KEY_MAP (key_map_list_name, "LSI_LATEX_REVIEW_KEYS");Bkey_map_list_name := GET_INFO (lsi_latex_src_buf, "key_map_list");<REMOVE_KEY_MAP (key_map_list_name, "LSI_LATEX_REVIEW_KEYS");!++ ! Deassign the buffer pointers.!--lsi_latex_src_buf := 0;lsi_latex_rev_buf := 0;#ENDPROCEDURE ! lsi_latex_end_review! "PROCEDURE lsi_latex_review_display!++:! Display the source & review buffers in two-window mode.!--POSITION (lsi_latex_rev_buf);IF lse$number_of_windows = 1THEN lse$$two_windows;' lsi_latex_rev_wdw := lse$top_window;* lsi_latex_src_wdw := lse$bottom_window;ELSE= IF lsi_latex_src_buf = GET_INFO (lse$top_window, 'buffer') THEN* lsi_latex_src_wdw := lse$top_window;, lsi_latex_rev_wdw := lse$bottom_window ELSE- lsi_latex_src_wdw := lse$bottom_window;) lsi_latex_rev_wdw := lse$top_window ENDIFENDIF;>IF lsi_latex_src_buf <> GET_INFO (lsi_latex_src_wdw, 'buffer')THEN- MAP (lsi_latex_src_wdw, lsi_latex_src_buf)ENDIF;>IF lsi_latex_rev_buf <> GET_INFO (lsi_latex_rev_wdw, 'buffer')THEN. MAP (lsi_latex_rev_wdw, lsi_latex_rev_buf);ENDIF;(lse$set_status_line (lsi_latex_src_wdw);'lse$set_status_line (lsi_latex_rev_wdw)'ENDPROCEDURE ! lsi_latex_review_display! PROCEDURE lsi_latex_next_error!++,! Find the next error in the review buffer.!--lsi_latex_review_display;lsi_latex_find_error (FORWARD);UPDATE (lsi_latex_rev_wdw)#ENDPROCEDURE ! lsi_latex_next_error! PROCEDURE lsi_latex_prev_error!++0! Find the previous error in the review buffer.!--lsi_latex_review_display;lsi_latex_find_error (REVERSE);UPDATE (lsi_latex_rev_wdw)#ENDPROCEDURE ! lsi_latex_prev_error! *PROCEDURE lsi_latex_find_error (direction)LOCAL error_range, start_of_line, this_spot, dummy;ON_ERROR IF error = tpu$_strnotfound THEN ELSE" MESSAGE ('Unexpected error') ENDIF ENDON_ERROR !++<! Remove the highlighting of the current source error line.!--lsi_latex_source_line := 0;!++5! Look for the next error flag in the review buffer.9! Start by positioning just past the last error located.!--POSITION (lsi_latex_rev_wdw);2IF GET_INFO (lsi_latex_error_line, 'type') = RANGETHEN this_spot := MARK (NONE);5 IF this_spot = BEGINNING_OF (lsi_latex_error_line) THEN IF direction = FORWARD THEN MOVE_VERTICAL (1) ELSE MOVE_HORIZONTAL (-1) ENDIF ENDIFENDIF;!++&! Look for the special error pattern.!--#error_range := SEARCH (LINE_BEGIN & (0 ('' & ('Over' | 'Under') & 'full \hbox') | ('!') ), direction, EXACT); ! ('l.' & SPAN ('0123456789'))! ), direction, EXACT);IF error_range = 0THEN POSITION (this_spot); MESSAGE ('No more errors'); RETURNENDIF;!++K! Save the error pattern range and the current direction for later use (in! lsi_latex_find_source). !--%lsi_latex_error_range := error_range;#SET (direction, lsi_latex_rev_buf);0POSITION (BEGINNING_OF (lsi_latex_error_range));!++?! Remove the highlighting of the current source error line and! highlight the error line.!--"MOVE_HORIZONTAL (-CURRENT_OFFSET);start_of_line := MARK (NONE);,MOVE_HORIZONTAL (LENGTH (CURRENT_LINE) - 1);Klsi_latex_error_line := CREATE_RANGE (start_of_line, MARK (NONE), REVERSE);/POSITION (BEGINNING_OF (lsi_latex_error_line));#ENDPROCEDURE ! lsi_latex_find_error! PROCEDURE lsi_latex_find_sourceLOCAL line_no_range, start_line_no, end_line_no, error_line_no, start_of_line, src_spot;ON_ERROR IF error = tpu$_strnotfound THEN ELSE" MESSAGE ('Unexpected error') ENDIF ENDON_ERROR lsi_latex_review_display;!++C! Find the starting line number associated with the current error.!--4IF GET_INFO (lsi_latex_error_range, 'type') <> RANGETHEN MESSAGE ('No current error'); ABORTENDIF;0POSITION (BEGINNING_OF (lsi_latex_error_range));.IF SUBSTR (lsi_latex_error_range, 1, 1) <> '!'THENO error_line_no := SEARCH ('at lines ' & SPAN ('0123456789'), FORWARD, EXACT);ELSE MOVE_VERTICAL (1);D error_line_no := SEARCH (LINE_BEGIN & 'l.' & SPAN ('0123456789'), FORWARD, EXACT)ENDIF;IF error_line_no = 0THEN3 POSITION (BEGINNING_OF (lsi_latex_error_range));9 MESSAGE ('No line number associated with this error'); ABORTENDIF;(POSITION (BEGINNING_OF (error_line_no));7line_no_range := SEARCH (SPAN ('0123456789'), FORWARD);Cstart_line_no := SUBSTR (line_no_range, 1, LENGTH (line_no_range));!++9! Position to the line number used in the error message.!--POSITION (lsi_latex_src_buf);'lsi_goto_line_dispatch (start_line_no);!++#! Highlight the source error line.!--"MOVE_HORIZONTAL (-CURRENT_OFFSET);start_of_line := MARK (NONE);.IF SUBSTR (lsi_latex_error_range, 1, 1) <> '!'THEN% POSITION (END_OF (line_no_range)); MOVE_HORIZONTAL (1);: line_no_range := SEARCH (SPAN ('0123456789'), FORWARD);D end_line_no := SUBSTR (line_no_range, 1, LENGTH (line_no_range)); POSITION (start_of_line);( lsi_goto_line_dispatch (end_line_no);ENDIF;(MOVE_HORIZONTAL (LENGTH (CURRENT_LINE));Llsi_latex_source_line := CREATE_RANGE (start_of_line, MARK (NONE), REVERSE);!++! Update display.!--POSITION (lsi_latex_rev_wdw);/POSITION (BEGINNING_OF (lsi_latex_error_line));POSITION (lsi_latex_src_wdw);0POSITION (BEGINNING_OF (lsi_latex_source_line));UPDATE (lsi_latex_src_wdw)$ENDPROCEDURE ! lsi_latex_find_source! PROCEDURE lsi_latex_review_keys)CREATE_KEY_MAP ('LSI_LATEX_REVIEW_KEYS');>DEFINE_KEY ('lsi_latex_next_error', CTRL_F_KEY, 'Next error',  'LSI_LATEX_REVIEW_KEYS');=DEFINE_KEY ('lsi_latex_prev_error', CTRL_B_KEY, 'Prev error', 'LSI_LATEX_REVIEW_KEYS');?DEFINE_KEY ('lsi_latex_find_source', CTRL_G_KEY, 'Goto source', 'LSI_LATEX_REVIEW_KEYS');>DEFINE_KEY ('lsi_latex_end_review', KEY_NAME ('E', SHIFT_KEY),) 'End review', 'LSI_LATEX_REVIEW_KEYS')$ENDPROCEDURE ! lsi_latex_review_keys+lsi_latex_review_keys; ! Initialize key map