comparison lisp/textmodes/texinfmt.el @ 4396:0ab53cbfac0e

Installed the version from the Texinfo package.
author Richard M. Stallman <rms@gnu.org>
date Sun, 01 Aug 1993 12:23:22 +0000
parents 507f64624555
children d1b5ca8f5493
comparison
equal deleted inserted replaced
4395:76b24be40a57 4396:0ab53cbfac0e
1 ;;; texinfmt.el --- convert Texinfo files to Info files. 1 ;;;; texinfmt.el
2 2 ;;; Copyright (C) 1985, 1986, 1988,
3 ;; Copyright (C) 1985, 1986, 1988, 1990 Free Software Foundation, Inc. 3 ;;; 1990, 1991, 1992, 1993 Free Software Foundation, Inc.
4 4
5 ;; Author: Robert J. Chassell <bob@gnu.ai.mit.edu> 5 ;; Maintainer: Robert J. Chassell <bug-texinfo@prep.ai.mit.edu>
6 ;; Version: 2.00 6
7 ;; Keywords: tex, help 7 ;;; This file is part of GNU Emacs.
8
9 ;; This file is part of GNU Emacs.
10 8
11 ;; GNU Emacs is free software; you can redistribute it and/or modify 9 ;; GNU Emacs is free software; you can redistribute it and/or modify
12 ;; it under the terms of the GNU General Public License as published by 10 ;; it under the terms of the GNU General Public License as published by
13 ;; the Free Software Foundation; either version 2, or (at your option) 11 ;; the Free Software Foundation; either version 2, or (at your option)
14 ;; any later version. 12 ;; any later version.
20 18
21 ;; You should have received a copy of the GNU General Public License 19 ;; You should have received a copy of the GNU General Public License
22 ;; along with GNU Emacs; see the file COPYING. If not, write to 20 ;; along with GNU Emacs; see the file COPYING. If not, write to
23 ;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. 21 ;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
24 22
25 ;;; Commentary:
26
27 ;; Updated May 1990 to correspond, more or less, to version 2.8 of
28 ;; texinfo.tex. NOTE: texinfmt.el is being phased out; it is being
29 ;; replaced by makeinfo.c, which is faster and provides better error
30 ;; checking.
31 ;; Robert J. Chassell, bob@ai.mit.edu
32
33 ;;; Code: 23 ;;; Code:
24
25 ;;; Emacs lisp functions to convert Texinfo files to Info files.
26
27 (defvar texinfmt-version "2.30 of 18 May 1993")
28
29 ;;; Variable definitions
30
31 (require 'texinfo) ; So `texinfo-footnote-style' is defined.
32 (require 'texnfo-upd) ; So `texinfo-section-types-regexp' is defined.
34 33
35 (defvar texinfo-format-syntax-table nil) 34 (defvar texinfo-format-syntax-table nil)
36 35
37 (defvar texinfo-vindex) 36 (defvar texinfo-vindex)
38 (defvar texinfo-findex) 37 (defvar texinfo-findex)
40 (defvar texinfo-pindex) 39 (defvar texinfo-pindex)
41 (defvar texinfo-tindex) 40 (defvar texinfo-tindex)
42 (defvar texinfo-kindex) 41 (defvar texinfo-kindex)
43 (defvar texinfo-last-node) 42 (defvar texinfo-last-node)
44 (defvar texinfo-node-names) 43 (defvar texinfo-node-names)
44 (defvar texinfo-enclosure-list)
45
46
47 ;;; Syntax table
45 48
46 (if texinfo-format-syntax-table 49 (if texinfo-format-syntax-table
47 nil 50 nil
48 (setq texinfo-format-syntax-table (make-syntax-table)) 51 (setq texinfo-format-syntax-table (make-syntax-table))
49 (modify-syntax-entry ?\" " " texinfo-format-syntax-table) 52 (modify-syntax-entry ?\" " " texinfo-format-syntax-table)
56 (modify-syntax-entry ?\) "." texinfo-format-syntax-table) 59 (modify-syntax-entry ?\) "." texinfo-format-syntax-table)
57 (modify-syntax-entry ?{ "(}" texinfo-format-syntax-table) 60 (modify-syntax-entry ?{ "(}" texinfo-format-syntax-table)
58 (modify-syntax-entry ?} "){" texinfo-format-syntax-table) 61 (modify-syntax-entry ?} "){" texinfo-format-syntax-table)
59 (modify-syntax-entry ?\' "." texinfo-format-syntax-table)) 62 (modify-syntax-entry ?\' "." texinfo-format-syntax-table))
60 63
61 ;;;###autoload 64
65 ;;; Top level buffer and region formatting functions
66
62 (defun texinfo-format-buffer (&optional notagify) 67 (defun texinfo-format-buffer (&optional notagify)
63 "Process the current buffer as texinfo code, into an Info file. 68 "Process the current buffer as texinfo code, into an Info file.
64 The Info file output is generated in a buffer visiting the Info file 69 The Info file output is generated in a buffer visiting the Info file
65 names specified in the @setfilename command. 70 names specified in the @setfilename command.
66 71
82 (message (setq lastmessage "Splitting Info file...")) 87 (message (setq lastmessage "Splitting Info file..."))
83 (Info-split)))) 88 (Info-split))))
84 (message (concat lastmessage 89 (message (concat lastmessage
85 (if (interactive-p) "done. Now save it." "done."))))) 90 (if (interactive-p) "done. Now save it." "done.")))))
86 91
87 92 (defvar texinfo-region-buffer-name "*Info Region*"
93 "*Name of the temporary buffer used by \\[texinfo-format-region].")
94
95 (defun texinfo-format-region (region-beginning region-end)
96 "Convert the current region of the Texinfo file to Info format.
97 This lets you see what that part of the file will look like in Info.
98 The command is bound to \\[texinfo-format-region]. The text that is
99 converted to Info is stored in a temporary buffer."
100 (interactive "r")
101 (message "Converting region to Info format...")
102 (let (texinfo-command-start
103 texinfo-command-end
104 texinfo-command-name
105 texinfo-vindex
106 texinfo-findex
107 texinfo-cindex
108 texinfo-pindex
109 texinfo-tindex
110 texinfo-kindex
111 texinfo-stack
112 (texinfo-format-filename "")
113 texinfo-example-start
114 texinfo-last-node-pos
115 texinfo-last-node
116 texinfo-node-names
117 (texinfo-footnote-number 0)
118 last-input-buffer
119 (fill-column-for-info fill-column)
120 (input-buffer (current-buffer))
121 (input-directory default-directory)
122 (header-text "")
123 (header-beginning 1)
124 (header-end 1))
125
126 ;;; Copy lines between beginning and end of header lines,
127 ;;; if any, or else copy the `@setfilename' line, if any.
128 (save-excursion
129 (save-restriction
130 (widen)
131 (goto-char (point-min))
132 (let ((search-end (save-excursion (forward-line 100) (point))))
133 (if (or
134 ;; Either copy header text.
135 (and
136 (prog1
137 (search-forward texinfo-start-of-header search-end t)
138 (forward-line 1)
139 ;; Mark beginning of header.
140 (setq header-beginning (point)))
141 (prog1
142 (search-forward texinfo-end-of-header nil t)
143 (beginning-of-line)
144 ;; Mark end of header
145 (setq header-end (point))))
146 ;; Or copy @filename line.
147 (prog2
148 (goto-char (point-min))
149 (search-forward "@setfilename" search-end t)
150 (beginning-of-line)
151 (setq header-beginning (point))
152 (forward-line 1)
153 (setq header-end (point))))
154
155 ;; Copy header
156 (setq header-text
157 (buffer-substring
158 (min header-beginning region-beginning)
159 header-end))))))
160
161 ;;; Find a buffer to use.
162 (switch-to-buffer (get-buffer-create texinfo-region-buffer-name))
163 (erase-buffer)
164 ;; Insert the header into the buffer.
165 (insert header-text)
166 ;; Insert the region into the buffer.
167 (insert-buffer-substring
168 input-buffer
169 (max region-beginning header-end)
170 region-end)
171 ;; Make sure region ends in a newline.
172 (or (= (preceding-char) ?\n)
173 (insert "\n"))
174
175 (goto-char (point-min))
176 (texinfo-mode)
177 (message "Converting region to Info format...")
178 (setq fill-column fill-column-for-info)
179 ;; Install a syntax table useful for scanning command operands.
180 (set-syntax-table texinfo-format-syntax-table)
181
182 ;; Insert @include files so `texinfo-raise-lower-sections' can
183 ;; work on them without losing track of multiple
184 ;; @raise/@lowersections commands.
185 (while (re-search-forward "^@include" nil t)
186 (setq texinfo-command-end (point))
187 (let ((filename (concat input-directory
188 (texinfo-parse-line-arg))))
189 (beginning-of-line)
190 (delete-region (point) (save-excursion (forward-line 1) (point)))
191 (message "Reading included file: %s" filename)
192 (save-excursion
193 (save-restriction
194 (narrow-to-region
195 (point)
196 (+ (point) (car (cdr (insert-file-contents filename)))))
197 (goto-char (point-min))
198 ;; Remove `@setfilename' line from included file, if any,
199 ;; so @setfilename command not duplicated.
200 (if (re-search-forward
201 "^@setfilename" (save-excursion (forward-line 100) (point)) t)
202 (progn
203 (beginning-of-line)
204 (delete-region
205 (point) (save-excursion (forward-line 1) (point)))))))))
206
207 ;; Raise or lower level of each section, if necessary.
208 (goto-char (point-min))
209 (texinfo-raise-lower-sections)
210 ;; Append @refill to appropriate paragraphs for filling.
211 (goto-char (point-min))
212 (texinfo-append-refill)
213 ;; If the region includes the effective end of the data,
214 ;; discard everything after that.
215 (goto-char (point-max))
216 (if (re-search-backward "^@bye" nil t)
217 (delete-region (point) (point-max)))
218 ;; Make sure buffer ends in a newline.
219 (or (= (preceding-char) ?\n)
220 (insert "\n"))
221 ;; Don't use a previous value of texinfo-enclosure-list.
222 (setq texinfo-enclosure-list nil)
223
224 (goto-char (point-min))
225 (if (looking-at "\\\\input[ \t]+texinfo")
226 (delete-region (point) (save-excursion (forward-line 1) (point))))
227
228 ;; Insert Info region title text.
229 (goto-char (point-min))
230 (if (search-forward
231 "@setfilename" (save-excursion (forward-line 100) (point)) t)
232 (progn
233 (setq texinfo-command-end (point))
234 (beginning-of-line)
235 (setq texinfo-command-start (point))
236 (let ((arg (texinfo-parse-arg-discard)))
237 (insert " "
238 texinfo-region-buffer-name
239 " buffer for: `")
240 (insert (file-name-nondirectory (expand-file-name arg)))
241 (insert "', -*-Text-*-\n")))
242 ;; Else no `@setfilename' line
243 (insert " "
244 texinfo-region-buffer-name
245 " buffer -*-Text-*-\n"))
246 (insert "produced by `texinfo-format-region'\n"
247 "from a region in: "
248 (if (buffer-file-name input-buffer)
249 (concat "`"
250 (file-name-sans-versions
251 (file-name-nondirectory
252 (buffer-file-name input-buffer)))
253 "'")
254 (concat "buffer `" (buffer-name input-buffer) "'"))
255 "\nusing `texinfmt.el' version "
256 texinfmt-version
257 ".\n\n")
258
259 ;; Now convert for real.
260 (goto-char (point-min))
261 (texinfo-format-scan)
262 (goto-char (point-min))
263
264 (message "Done.")))
265
266
267 ;;; Primary internal formatting function for the whole buffer.
268
88 (defun texinfo-format-buffer-1 () 269 (defun texinfo-format-buffer-1 ()
89 (let (texinfo-format-filename 270 (let (texinfo-format-filename
90 texinfo-example-start 271 texinfo-example-start
91 texinfo-command-start 272 texinfo-command-start
92 texinfo-command-end 273 texinfo-command-end
93 texinfo-command-name 274 texinfo-command-name
94 texinfo-last-node 275 texinfo-last-node
276 texinfo-last-node-pos
95 texinfo-vindex 277 texinfo-vindex
96 texinfo-findex 278 texinfo-findex
97 texinfo-cindex 279 texinfo-cindex
98 texinfo-pindex 280 texinfo-pindex
99 texinfo-tindex 281 texinfo-tindex
100 texinfo-kindex 282 texinfo-kindex
101 texinfo-stack 283 texinfo-stack
102 texinfo-node-names 284 texinfo-node-names
103 (texinfo-footnote-number 0) 285 (texinfo-footnote-number 0)
104 last-input-buffer 286 last-input-buffer
105 outfile 287 outfile
106 (fill-column fill-column) 288 (fill-column-for-info fill-column)
107 (input-buffer (current-buffer)) 289 (input-buffer (current-buffer))
108 (input-directory default-directory)) 290 (input-directory default-directory))
291 (setq texinfo-enclosure-list nil)
109 (save-excursion 292 (save-excursion
110 (goto-char (point-min)) 293 (goto-char (point-min))
111 (search-forward "@setfilename") 294 (or (search-forward "@setfilename" nil t)
295 (error "Texinfo file needs an `@setfilename FILENAME' line."))
112 (setq texinfo-command-end (point)) 296 (setq texinfo-command-end (point))
113 (setq outfile (texinfo-parse-line-arg))) 297 (setq outfile (texinfo-parse-line-arg)))
114 (find-file outfile) 298 (find-file outfile)
115 (texinfo-mode) 299 (texinfo-mode)
300 (setq fill-column fill-column-for-info)
116 (set-syntax-table texinfo-format-syntax-table) 301 (set-syntax-table texinfo-format-syntax-table)
117 (erase-buffer) 302 (erase-buffer)
118 (insert-buffer-substring input-buffer) 303 (insert-buffer-substring input-buffer)
304 (message "Converting %s to Info format..." (buffer-name input-buffer))
305
306 ;; Insert @include files so `texinfo-raise-lower-sections' can
307 ;; work on them without losing track of multiple
308 ;; @raise/@lowersections commands.
309 (goto-char (point-min))
310 (while (re-search-forward "^@include" nil t)
311 (setq texinfo-command-end (point))
312 (let ((filename (concat input-directory
313 (texinfo-parse-line-arg))))
314 (beginning-of-line)
315 (delete-region (point) (save-excursion (forward-line 1) (point)))
316 (message "Reading included file: %s" filename)
317 (save-excursion
318 (save-restriction
319 (narrow-to-region
320 (point)
321 (+ (point) (car (cdr (insert-file-contents filename)))))
322 (goto-char (point-min))
323 ;; Remove `@setfilename' line from included file, if any,
324 ;; so @setfilename command not duplicated.
325 (if (re-search-forward
326 "^@setfilename"
327 (save-excursion (forward-line 100) (point)) t)
328 (progn
329 (beginning-of-line)
330 (delete-region
331 (point) (save-excursion (forward-line 1) (point)))))))))
332 ;; Raise or lower level of each section, if necessary.
333 (goto-char (point-min))
334 (texinfo-raise-lower-sections)
335 ;; Append @refill to appropriate paragraphs
336 (goto-char (point-min))
337 (texinfo-append-refill)
119 (goto-char (point-min)) 338 (goto-char (point-min))
120 (search-forward "@setfilename") 339 (search-forward "@setfilename")
121 (beginning-of-line) 340 (beginning-of-line)
122 (delete-region (point-min) (point)) 341 (delete-region (point-min) (point))
123 ;; Remove @bye at end of file, if it is there. 342 ;; Remove @bye at end of file, if it is there.
133 (goto-char (point-min)) 352 (goto-char (point-min))
134 (list outfile 353 (list outfile
135 texinfo-vindex texinfo-findex texinfo-cindex 354 texinfo-vindex texinfo-findex texinfo-cindex
136 texinfo-pindex texinfo-tindex texinfo-kindex))) 355 texinfo-pindex texinfo-tindex texinfo-kindex)))
137 356
138 (defvar texinfo-region-buffer-name "*Info Region*" 357
139 "*Name of the temporary buffer used by \\[texinfo-format-region].") 358 ;;; Perform non-@-command file conversions: quotes and hyphens
140 359
141 ;;;###autoload 360 (defun texinfo-format-convert (min max)
142 (defun texinfo-format-region (region-beginning region-ending) 361 ;; Convert left and right quotes to typewriter font quotes.
143 "Convert the current region of the Texinfo file to Info format. 362 (goto-char min)
144 This lets you see what that part of the file will look like in Info. 363 (while (search-forward "``" max t)
145 The command is bound to \\[texinfo-format-region]. The text that is 364 (replace-match "\""))
146 converted to Info is stored in a temporary buffer." 365 (goto-char min)
147 (interactive "r") 366 (while (search-forward "''" max t)
148 (message "Converting region to Info format...") 367 (replace-match "\""))
149 (let (texinfo-command-start 368 ;; Convert three hyphens in a row to two.
150 texinfo-command-end 369 (goto-char min)
151 texinfo-command-name 370 (while (re-search-forward "\\( \\|\\w\\)\\(---\\)\\( \\|\\w\\)" max t)
152 texinfo-vindex 371 (delete-region (1+ (match-beginning 2)) (+ 2 (match-beginning
153 texinfo-findex 372 2)))))
154 texinfo-cindex 373
155 texinfo-pindex 374
156 texinfo-tindex 375 ;;; Handle paragraph filling
157 texinfo-kindex 376
158 texinfo-stack 377 (defvar texinfo-no-refill-regexp
159 texinfo-format-filename 378 "^@\\(example\\|smallexample\\|lisp\\|smalllisp\\|display\\|format\\|flushleft\\|flushright\\|menu\\|titlepage\\|iftex\\|tex\\)"
160 texinfo-example-start 379 "Regexp specifying environments in which paragraphs are not filled.")
161 texinfo-last-node 380
162 texinfo-node-names 381 (defvar texinfo-part-of-para-regexp
163 (texinfo-footnote-number 0) 382 "^@\\(b{\\|bullet{\\|cite{\\|code{\\|emph{\\|equiv{\\|error{\\|expansion{\\|file{\\|i{\\|inforef{\\|kbd{\\|key{\\|lisp{\\|minus{\\|point{\\|print{\\|pxref{\\|r{\\|ref{\\|result{\\|samp{\\|sc{\\|t{\\|TeX{\\|today{\\|var{\\|w{\\|xref{\\)"
164 last-input-buffer 383 "Regexp specifying @-commands found within paragraphs.")
165 (fill-column fill-column) 384
166 (input-buffer (current-buffer)) 385 (defun texinfo-append-refill ()
167 (input-directory default-directory) 386 "Append @refill at end of each paragraph that should be filled.
168 filename-beginning 387 Do not append @refill to paragraphs within @example and similar environments.
169 filename-ending) 388 Do not append @refill to paragraphs containing @w{TEXT} or @*."
170 389
171 ;;; Find a buffer to use. 390 ;; It is necessary to append @refill before other processing because
172 391 ;; the other processing removes information that tells Texinfo
173 (switch-to-buffer (get-buffer-create texinfo-region-buffer-name)) 392 ;; whether the text should or should not be filled.
174 393
175 ;; Insert the region into the buffer. 394 (while (< (point) (point-max))
176 (erase-buffer) 395 (let ((refill-blank-lines "^[ \t\n]*$")
177 396 (case-fold-search nil)) ; Don't confuse @TeX and @tex....
178 (save-excursion 397 (beginning-of-line)
179 (set-buffer input-buffer) 398 ;; 1. Skip over blank lines;
180 (save-excursion 399 ;; skip over lines beginning with @-commands,
181 (save-restriction 400 ;; but do not skip over lines
182 (widen) 401 ;; that are no-refill environments such as @example or
183 (goto-char (point-min)) 402 ;; that begin with within-paragraph @-commands such as @code.
184 ;; Initialize the buffer with the filename 403 (while (and (looking-at (concat "^@\\|^\\\\\\|" refill-blank-lines))
185 ;; or else explain that a filename is needed. 404 (not (looking-at
186 (or (search-forward "@setfilename" 405 (concat
187 (save-excursion (forward-line 100) (point)) t) 406 "\\("
188 (error "The texinfo file needs a line saying: @setfilename <name>")) 407 texinfo-no-refill-regexp
189 (beginning-of-line) 408 "\\|"
190 (setq filename-beginning (point)) 409 texinfo-part-of-para-regexp
191 (forward-line 1) 410 "\\)")))
192 (setq filename-ending (point))))) 411 (< (point) (point-max)))
193 412 (forward-line 1))
194 ;; Insert the @setfilename line into the buffer. 413 ;; 2. Skip over @example and similar no-refill environments.
195 (insert-buffer-substring input-buffer 414 (if (looking-at texinfo-no-refill-regexp)
196 (min filename-beginning region-beginning) 415 (let ((environment
197 filename-ending) 416 (buffer-substring (match-beginning 1) (match-end 1))))
417 (progn (re-search-forward (concat "^@end " environment) nil t)
418 (forward-line 1)))
419 ;; 3. Do not refill a paragraph containing @w or @*
420 (if (or
421 (>= (point) (point-max))
422 (re-search-forward
423 "@w{\\|@\\*" (save-excursion (forward-paragraph) (point)) t))
424 ;; Go to end of paragraph and do nothing.
425 (forward-paragraph)
426 ;; 4. Else go to end of paragraph and insert @refill
427 (forward-paragraph)
428 (forward-line -1)
429 (end-of-line)
430 (delete-region
431 (point)
432 (save-excursion (skip-chars-backward " \t") (point)))
433 ;; `looking-at-backward' not available in v. 18.57
434 ;; (if (not (looking-at-backward "@refill\\|@bye")) ;)
435 (if (not (re-search-backward
436 "@refill\\|@bye"
437 (save-excursion (beginning-of-line) (point))
438 t))
439 (insert "@refill"))
440 (forward-line 1))))))
441
442
443 ;;; Handle `@raisesections' and `@lowersections' commands
444
445 ;; These commands change the hierarchical level of chapter structuring
446 ;; commands.
447 ;;
448 ;; @raisesections changes @subsection to @section,
449 ;; @section to @chapter,
450 ;; etc.
451 ;;
452 ;; @lowersections changes @chapter to @section
453 ;; @subsection to @subsubsection,
454 ;; etc.
455 ;;
456 ;; An @raisesections/@lowersections command changes only those
457 ;; structuring commands that follow the @raisesections/@lowersections
458 ;; command.
459 ;;
460 ;; Repeated @raisesections/@lowersections continue to raise or lower
461 ;; the heading level.
462 ;;
463 ;; An @lowersections command cancels an @raisesections command, and
464 ;; vice versa.
465 ;;
466 ;; You cannot raise or lower "beyond" chapters or subsubsections, but
467 ;; trying to do so does not elicit an error---you just get more
468 ;; headings that mean the same thing as you keep raising or lowering
469 ;; (for example, after a single @raisesections, both @chapter and
470 ;; @section produce chapter headings).
471
472 (defun texinfo-raise-lower-sections ()
473 "Raise or lower the hierarchical level of chapters, sections, etc.
474
475 This function acts according to `@raisesections' and `@lowersections'
476 commands in the Texinfo file.
477
478 For example, an `@lowersections' command is useful if you wish to
479 include what is written as an outer or standalone Texinfo file in
480 another Texinfo file as an inner, included file. The `@lowersections'
481 command changes chapters to sections, sections to subsections and so
482 on.
483
484 @raisesections changes @subsection to @section,
485 @section to @chapter,
486 @heading to @chapheading,
487 etc.
488
489 @lowersections changes @chapter to @section,
490 @subsection to @subsubsection,
491 @heading to @subheading,
492 etc.
493
494 An `@raisesections' or `@lowersections' command changes only those
495 structuring commands that follow the `@raisesections' or
496 `@lowersections' command.
497
498 An `@lowersections' command cancels an `@raisesections' command, and
499 vice versa.
500
501 Repeated use of the commands continue to raise or lower the hierarchical
502 level a step at a time.
503
504 An attempt to raise above `chapters' reproduces chapter commands; an
505 attempt to lower below subsubsections reproduces subsubsection
506 commands."
507
508 ;; `texinfo-section-types-regexp' is defined in `texnfo-upd.el';
509 ;; it is a regexp matching chapter, section, other headings
510 ;; (but not the top node).
511
512 (let (type (level 0))
513 (while
514 (re-search-forward
515 (concat
516 "\\(\\(^@\\(raise\\|lower\\)sections\\)\\|\\("
517 texinfo-section-types-regexp
518 "\\)\\)")
519 nil t)
520 (beginning-of-line)
521 (save-excursion (setq type (read (current-buffer))))
522 (cond
523
524 ;; 1. Increment level
525 ((eq type '@raisesections)
526 (setq level (1+ level))
527 (delete-region
528 (point) (save-excursion (forward-line 1) (point))))
529
530 ;; 2. Decrement level
531 ((eq type '@lowersections)
532 (setq level (1- level))
533 (delete-region
534 (point) (save-excursion (forward-line 1) (point))))
535
536 ;; Now handle structuring commands
537 ((cond
538
539 ;; 3. Raise level when positive
540 ((> level 0)
541 (let ((count level)
542 (new-level type))
543 (while (> count 0)
544 (setq new-level
545 (cdr (assq new-level texinfo-raisesections-alist)))
546 (setq count (1- count)))
547 (kill-word 1)
548 (insert (symbol-name new-level))))
549
550 ;; 4. Do nothing except move point when level is zero
551 ((= level 0) (forward-line 1))
552
553 ;; 5. Lower level when positive
554 ((< level 0)
555 (let ((count level)
556 (new-level type))
557 (while (< count 0)
558 (setq new-level
559 (cdr (assq new-level texinfo-lowersections-alist)))
560 (setq count (1+ count)))
561 (kill-word 1)
562 (insert (symbol-name new-level))))))))))
563
564 (defvar texinfo-raisesections-alist
565 '((@chapter . @chapter) ; Cannot go higher
566 (@unnumbered . @unnumbered)
567
568 (@majorheading . @majorheading)
569 (@chapheading . @chapheading)
570 (@appendix . @appendix)
198 571
199 ;; Insert the region into the buffer. 572 (@section . @chapter)
200 (insert-buffer-substring input-buffer 573 (@unnumberedsec . @unnumbered)
201 (max region-beginning filename-ending) 574 (@heading . @chapheading)
202 region-ending) 575 (@appendixsec . @appendix)
203
204 (texinfo-mode)
205
206 ;; Install a syntax table useful for scanning command operands.
207 (set-syntax-table texinfo-format-syntax-table)
208 576
209 ;; If the region includes the effective end of the data, 577 (@subsection . @section)
210 ;; discard everything after that. 578 (@unnumberedsubsec . @unnumberedsec)
211 (goto-char (point-max)) 579 (@subheading . @heading)
212 (if (re-search-backward "^@bye" nil t) 580 (@appendixsubsec . @appendixsec)
213 (delete-region (point) (point-max))) 581
214 ;; Make sure buffer ends in a newline. 582 (@subsubsection . @subsection)
215 (or (= (preceding-char) ?\n) 583 (@unnumberedsubsubsec . @unnumberedsubsec)
216 (insert "\n")) 584 (@subsubheading . @subheading)
217 585 (@appendixsubsubsec . @appendixsubsec))
218 ;; Now convert for real. 586 "*An alist of next higher levels for chapters, sections. etc.
219 (goto-char (point-min)) 587 For example, section to chapter, subsection to section.
220 (texinfo-format-scan) 588 Used by `texinfo-raise-lower-sections'.
221 (goto-char (point-min))) 589 The keys specify types of section; the values correspond to the next
222 590 higher types.")
223 (message "Done.")) 591
224 592 (defvar texinfo-lowersections-alist
225 593 '((@chapter . @section)
226 ;; Perform those texinfo-to-info conversions that apply to the whole input 594 (@unnumbered . @unnumberedsec)
227 ;; uniformly. 595 (@majorheading . @heading)
596 (@chapheading . @heading)
597 (@appendix . @appendixsec)
598
599 (@section . @subsection)
600 (@unnumberedsec . @unnumberedsubsec)
601 (@heading . @subheading)
602 (@appendixsec . @appendixsubsec)
603
604 (@subsection . @subsubsection)
605 (@unnumberedsubsec . @unnumberedsubsubsec)
606 (@subheading . @subsubheading)
607 (@appendixsubsec . @appendixsubsubsec)
608
609 (@subsubsection . @subsubsection) ; Cannot go lower.
610 (@unnumberedsubsubsec . @unnumberedsubsubsec)
611 (@subsubheading . @subsubheading)
612 (@appendixsubsubsec . @appendixsubsubsec))
613 "*An alist of next lower levels for chapters, sections. etc.
614 For example, chapter to section, section to subsection.
615 Used by `texinfo-raise-lower-sections'.
616 The keys specify types of section; the values correspond to the next
617 lower types.")
618
619
620 ;;; Perform those texinfo-to-info conversions that apply to the whole input
621 ;;; uniformly.
622
228 (defun texinfo-format-scan () 623 (defun texinfo-format-scan ()
229 ;; Convert left and right quotes to typewriter font quotes. 624 (texinfo-format-convert (point-min) (point-max))
230 (goto-char (point-min)) 625 ;; Scan for @-commands.
231 (while (search-forward "``" nil t) 626 (goto-char (point-min))
232 (replace-match "\"")) 627 (while (search-forward "@" nil t)
233 (goto-char (point-min)) 628 (if (looking-at "[@{}'` *]")
234 (while (search-forward "''" nil t) 629 ;; Handle a few special @-followed-by-one-char commands.
235 (replace-match "\"")) 630 (if (= (following-char) ?*)
236 ;; Scan for @-commands. 631 (progn
237 (goto-char (point-min)) 632 ;; remove command
238 (while (search-forward "@" nil t) 633 (delete-region (1- (point)) (1+ (point)))
239 (if (looking-at "[@{}'` *]") 634 ;; insert return if not at end of line;
240 ;; Handle a few special @-followed-by-one-char commands. 635 ;; else line is already broken.
241 (if (= (following-char) ?*) 636 (if (not (= (following-char) ?\n))
242 (progn 637 (insert ?\n)))
243 ;; remove command 638 ;; The other characters are simply quoted. Delete the @.
244 (delete-region (1- (point)) (1+ (point))) 639 (delete-char -1)
245 ;; insert return if not at end of line;
246 ;; else line is already broken.
247 (if (not (= (following-char) ?\n))
248 (insert ?\n)))
249 ;; The other characters are simply quoted. Delete the @.
250 (delete-char -1)
251 (forward-char 1))
252 ;; @ is followed by a command-word; find the end of the word.
253 (setq texinfo-command-start (1- (point)))
254 (if (= (char-syntax (following-char)) ?w)
255 (forward-word 1)
256 (forward-char 1)) 640 (forward-char 1))
257 (setq texinfo-command-end (point)) 641 ;; @ is followed by a command-word; find the end of the word.
258 ;; Call the handler for this command. 642 (setq texinfo-command-start (1- (point)))
259 (setq texinfo-command-name 643 (if (= (char-syntax (following-char)) ?w)
260 (intern (buffer-substring (1+ texinfo-command-start) 644 (forward-word 1)
261 texinfo-command-end))) 645 (forward-char 1))
262 (let ((cmd (get texinfo-command-name 'texinfo-format))) 646 (setq texinfo-command-end (point))
263 (if cmd (funcall cmd) 647 ;; Call the handler for this command.
264 (texinfo-unsupported))))) 648 (setq texinfo-command-name
265 (cond (texinfo-stack 649 (intern (buffer-substring
266 (goto-char (nth 2 (car texinfo-stack))) 650 (1+ texinfo-command-start) texinfo-command-end)))
267 (error "Unterminated @%s" (car (car texinfo-stack)))))) 651 (let ((enclosure-type
652 (assoc
653 (symbol-name texinfo-command-name)
654 texinfo-enclosure-list)))
655 (if enclosure-type
656 (progn
657 (insert
658 (car (car (cdr enclosure-type)))
659 (texinfo-parse-arg-discard)
660 (car (cdr (car (cdr enclosure-type)))))
661 (goto-char texinfo-command-start))
662 (let ((cmd (get texinfo-command-name 'texinfo-format)))
663 (if cmd (funcall cmd) (texinfo-unsupported)))))))
664
665 (cond (texinfo-stack
666 (goto-char (nth 2 (car texinfo-stack)))
667 (error "Unterminated @%s" (car (car texinfo-stack))))))
268 668
269 (put 'begin 'texinfo-format 'texinfo-format-begin) 669 (put 'begin 'texinfo-format 'texinfo-format-begin)
270 (defun texinfo-format-begin () 670 (defun texinfo-format-begin ()
271 (texinfo-format-begin-end 'texinfo-format)) 671 (texinfo-format-begin-end 'texinfo-format))
272 672
278 (setq texinfo-command-name (intern (texinfo-parse-line-arg))) 678 (setq texinfo-command-name (intern (texinfo-parse-line-arg)))
279 (setq cmd (get texinfo-command-name prop)) 679 (setq cmd (get texinfo-command-name prop))
280 (if cmd (funcall cmd) 680 (if cmd (funcall cmd)
281 (texinfo-unsupported))) 681 (texinfo-unsupported)))
282 682
683 ;;; Parsing functions
684
283 (defun texinfo-parse-line-arg () 685 (defun texinfo-parse-line-arg ()
284 (goto-char texinfo-command-end) 686 (goto-char texinfo-command-end)
285 (let ((start (point))) 687 (let ((start (point)))
286 (cond ((looking-at " ") 688 (cond ((looking-at " ")
287 (skip-chars-forward " ") 689 (skip-chars-forward " ")
288 (setq start (point)) 690 (setq start (point))
289 (end-of-line) 691 (end-of-line)
290 (skip-chars-backward " ") 692 (skip-chars-backward " ")
291 (setq texinfo-command-end (1+ (point)))) 693 (delete-region (point) (progn (end-of-line) (point)))
292 ((looking-at "{") 694 (setq texinfo-command-end (1+ (point))))
293 (setq start (1+ (point))) 695 ((looking-at "{")
294 (forward-list 1) 696 (setq start (1+ (point)))
295 (setq texinfo-command-end (point)) 697 (forward-list 1)
296 (forward-char -1)) 698 (setq texinfo-command-end (point))
297 (t 699 (forward-char -1))
298 (error "Invalid texinfo command arg format"))) 700 (t
701 (error "Invalid texinfo command arg format")))
299 (prog1 (buffer-substring start (point)) 702 (prog1 (buffer-substring start (point))
300 (if (eolp) (forward-char 1))))) 703 (if (eolp) (forward-char 1)))))
301 704
302 (defun texinfo-parse-expanded-arg () 705 (defun texinfo-parse-expanded-arg ()
303 (goto-char texinfo-command-end) 706 (goto-char texinfo-command-end)
304 (let ((start (point)) 707 (let ((start (point))
305 marker) 708 marker)
306 (cond ((looking-at " ") 709 (cond ((looking-at " ")
307 (skip-chars-forward " ") 710 (skip-chars-forward " ")
308 (setq start (point)) 711 (setq start (point))
309 (end-of-line) 712 (end-of-line)
310 (setq texinfo-command-end (1+ (point)))) 713 (setq texinfo-command-end (1+ (point))))
311 ((looking-at "{") 714 ((looking-at "{")
312 (setq start (1+ (point))) 715 (setq start (1+ (point)))
313 (forward-list 1) 716 (forward-list 1)
314 (setq texinfo-command-end (point)) 717 (setq texinfo-command-end (point))
315 (forward-char -1)) 718 (forward-char -1))
316 (t 719 (t
317 (error "Invalid texinfo command arg format"))) 720 (error "Invalid texinfo command arg format")))
318 (setq marker (move-marker (make-marker) texinfo-command-end)) 721 (setq marker (move-marker (make-marker) texinfo-command-end))
319 (texinfo-format-expand-region start (point)) 722 (texinfo-format-expand-region start (point))
320 (setq texinfo-command-end (marker-position marker)) 723 (setq texinfo-command-end (marker-position marker))
321 (move-marker marker nil) 724 (move-marker marker nil)
322 (prog1 (buffer-substring start (point)) 725 (prog1 (buffer-substring start (point))
323 (if (eolp) (forward-char 1))))) 726 (if (eolp) (forward-char 1)))))
324 727
325 (defun texinfo-format-expand-region (start end) 728 (defun texinfo-format-expand-region (start end)
326 (save-restriction 729 (save-restriction
327 (narrow-to-region start end) 730 (narrow-to-region start end)
328 (let (texinfo-command-start 731 (let (texinfo-command-start
329 texinfo-command-end 732 texinfo-command-end
330 texinfo-command-name 733 texinfo-command-name
331 texinfo-stack) 734 texinfo-stack)
332 (texinfo-format-scan)) 735 (texinfo-format-scan))
333 (goto-char (point-max)))) 736 (goto-char (point-max))))
334 737
335 (defun texinfo-parse-arg-discard () 738 (defun texinfo-parse-arg-discard ()
336 (prog1 (texinfo-parse-line-arg) 739 (prog1 (texinfo-parse-line-arg)
337 (texinfo-discard-command))) 740 (texinfo-discard-command)))
338 741
339 (defun texinfo-discard-command () 742 (defun texinfo-discard-command ()
340 (delete-region texinfo-command-start texinfo-command-end)) 743 (delete-region texinfo-command-start texinfo-command-end))
341 744
342 (defun texinfo-optional-braces-discard () 745 (defun texinfo-optional-braces-discard ()
343 "Discard braces following command, if any." 746 "Discard braces following command, if any."
344 (goto-char texinfo-command-end) 747 (goto-char texinfo-command-end)
345 (let ((start (point))) 748 (let ((start (point)))
346 (cond ((looking-at "[ \t]*\n")) ; do nothing 749 (cond ((looking-at "[ \t]*\n")) ; do nothing
347 ((looking-at "{") ; remove braces, if any 750 ((looking-at "{") ; remove braces, if any
348 (forward-list 1) 751 (forward-list 1)
349 (setq texinfo-command-end (point))) 752 (setq texinfo-command-end (point)))
350 (t 753 (t
351 (error 754 (error
352 "Invalid `texinfo-optional-braces-discard' format \(need braces?\)"))) 755 "Invalid `texinfo-optional-braces-discard' format \(need braces?\)")))
353 (delete-region texinfo-command-start texinfo-command-end))) 756 (delete-region texinfo-command-start texinfo-command-end)))
354 757
355 (defun texinfo-format-parse-line-args () 758 (defun texinfo-format-parse-line-args ()
356 (let ((start (1- (point))) 759 (let ((start (1- (point)))
357 next beg end 760 next beg end
358 args) 761 args)
359 (skip-chars-forward " ") 762 (skip-chars-forward " ")
360 (while (not (eolp)) 763 (while (not (eolp))
361 (setq beg (point)) 764 (setq beg (point))
362 (re-search-forward "[\n,]") 765 (re-search-forward "[\n,]")
363 (setq next (point)) 766 (setq next (point))
364 (if (bolp) (setq next (1- next))) 767 (if (bolp) (setq next (1- next)))
365 (forward-char -1) 768 (forward-char -1)
366 (skip-chars-backward " ") 769 (skip-chars-backward " ")
367 (setq end (point)) 770 (setq end (point))
368 (setq args (cons (if (> end beg) (buffer-substring beg end)) 771 (setq args (cons (if (> end beg) (buffer-substring beg end))
369 args)) 772 args))
370 (goto-char next) 773 (goto-char next)
371 (skip-chars-forward " ")) 774 (skip-chars-forward " "))
372 (if (eolp) (forward-char 1)) 775 (if (eolp) (forward-char 1))
373 (setq texinfo-command-end (point)) 776 (setq texinfo-command-end (point))
374 (nreverse args))) 777 (nreverse args)))
375 778
376 (defun texinfo-format-parse-args () 779 (defun texinfo-format-parse-args ()
377 (let ((start (1- (point))) 780 (let ((start (1- (point)))
378 next beg end 781 next beg end
379 args) 782 args)
380 (search-forward "{") 783 (search-forward "{")
381 (save-excursion 784 (save-excursion
382 (texinfo-format-expand-region 785 (texinfo-format-expand-region
383 (point) 786 (point)
384 (save-excursion (up-list 1) (1- (point))))) 787 (save-excursion (up-list 1) (1- (point)))))
788 ;; The following does not handle cross references of the form:
789 ;; `@xref{bullet, , @code{@@bullet}@{@}}.' because the
790 ;; re-search-forward finds the first right brace after the second
791 ;; comma.
385 (while (/= (preceding-char) ?\}) 792 (while (/= (preceding-char) ?\})
386 (skip-chars-forward " \t\n") 793 (skip-chars-forward " \t\n")
387 (setq beg (point)) 794 (setq beg (point))
388 (re-search-forward "[},]") 795 (re-search-forward "[},]")
389 (setq next (point)) 796 (setq next (point))
390 (forward-char -1) 797 (forward-char -1)
391 (skip-chars-backward " \t\n") 798 (skip-chars-backward " \t\n")
392 (setq end (point)) 799 (setq end (point))
393 (cond ((< beg end) 800 (cond ((< beg end)
394 (goto-char beg) 801 (goto-char beg)
395 (while (search-forward "\n" end t) 802 (while (search-forward "\n" end t)
396 (replace-match " ")))) 803 (replace-match " "))))
397 (setq args (cons (if (> end beg) (buffer-substring beg end)) 804 (setq args (cons (if (> end beg) (buffer-substring beg end))
398 args)) 805 args))
399 (goto-char next)) 806 (goto-char next))
400 (if (eolp) (forward-char 1)) 807 (if (eolp) (forward-char 1))
401 (setq texinfo-command-end (point)) 808 (setq texinfo-command-end (point))
402 (nreverse args))) 809 (nreverse args)))
403 810
410 (texinfo-format-expand-region start (point)) 817 (texinfo-format-expand-region start (point))
411 (setq texinfo-command-end (marker-position marker)) 818 (setq texinfo-command-end (marker-position marker))
412 (move-marker marker nil)) 819 (move-marker marker nil))
413 (goto-char start) 820 (goto-char start)
414 (let ((args '()) 821 (let ((args '())
415 beg end) 822 beg end)
416 (skip-chars-forward " ") 823 (skip-chars-forward " ")
417 (while (not (eolp)) 824 (while (not (eolp))
418 (cond ((looking-at "{") 825 (cond ((looking-at "{")
419 (setq beg (1+ (point))) 826 (setq beg (1+ (point)))
420 (forward-list 1) 827 (forward-list 1)
421 (setq end (1- (point)))) 828 (setq end (1- (point))))
422 (t 829 (t
423 (setq beg (point)) 830 (setq beg (point))
424 (re-search-forward "[\n ]") 831 (re-search-forward "[\n ]")
425 (forward-char -1) 832 (forward-char -1)
426 (setq end (point)))) 833 (setq end (point))))
427 (setq args (cons (buffer-substring beg end) args)) 834 (setq args (cons (buffer-substring beg end) args))
428 (skip-chars-forward " ")) 835 (skip-chars-forward " "))
429 (forward-char 1) 836 (forward-char 1)
430 (nreverse args)))) 837 (nreverse args))))
431 838
432
433 ; 19 October 1990
434 ; @setfilename modified to work with include files; see @include
435 ; (defun texinfo-format-setfilename ()
436 ; (let ((arg (texinfo-parse-arg-discard)))
437 ; (setq texinfo-format-filename
438 ; (file-name-nondirectory (expand-file-name arg)))
439 ; (insert "Info file: "
440 ; texinfo-format-filename ", -*-Text-*-\n"
441 ; "produced by texinfo-format-buffer\nfrom "
442 ; (if (buffer-file-name input-buffer)
443 ; (concat "file: "
444 ; (file-name-sans-versions
445 ; (file-name-nondirectory
446 ; (buffer-file-name input-buffer))))
447 ; (concat "buffer " (buffer-name input-buffer)))
448 ; "\n\n")))
449
450 (put 'setfilename 'texinfo-format 'texinfo-format-setfilename)
451 (defun texinfo-format-setfilename ()
452 (let ((arg (texinfo-parse-arg-discard)))
453 (if (eq input-buffer last-input-buffer)
454 nil ; only use first setfilename in buffer
455 (message "Formatting Info file: %s" arg)
456 (setq texinfo-format-filename
457 (file-name-nondirectory (expand-file-name arg)))
458 (insert "Info file: "
459 texinfo-format-filename ", -*-Text-*-\n"
460 "produced by texinfo-format-buffer\nfrom "
461 (if (buffer-file-name input-buffer)
462 (concat "file: "
463 (file-name-sans-versions
464 (file-name-nondirectory
465 (buffer-file-name input-buffer))))
466 (concat "buffer " (buffer-name input-buffer)))
467 "\n\n"))))
468
469 (put 'node 'texinfo-format 'texinfo-format-node)
470 (defun texinfo-format-node ()
471 (let* ((args (texinfo-format-parse-line-args))
472 (name (nth 0 args))
473 (next (nth 1 args))
474 (prev (nth 2 args))
475 (up (nth 3 args)))
476 (texinfo-discard-command)
477 (setq texinfo-last-node name)
478 (let ((tem (downcase name)))
479 (if (assoc tem texinfo-node-names)
480 (error "Duplicate node name: %s" name)
481 (setq texinfo-node-names (cons (list tem) texinfo-node-names))))
482 (setq texinfo-footnote-number 0)
483 (or (bolp)
484 (insert ?\n))
485 (insert "\^_\nFile: " texinfo-format-filename
486 " Node: " name)
487 (if prev
488 (insert ", Prev: " prev))
489 (if up
490 (insert ", Up: " up))
491 (if next
492 (insert ", Next: " next))
493 (insert ?\n)))
494
495 (put 'menu 'texinfo-format 'texinfo-format-menu)
496 (defun texinfo-format-menu ()
497 (texinfo-discard-line)
498 (insert "* Menu:\n\n"))
499
500 (put 'menu 'texinfo-end 'texinfo-discard-command)
501 (defun texinfo-discard-line () 839 (defun texinfo-discard-line ()
502 (goto-char texinfo-command-end) 840 (goto-char texinfo-command-end)
503 (skip-chars-forward " \t") 841 (skip-chars-forward " \t")
504 (or (eolp) 842 (or (eolp)
505 (error "Extraneous text at end of command line.")) 843 (error "Extraneous text at end of command line."))
506 (goto-char texinfo-command-start) 844 (goto-char texinfo-command-start)
507 (or (bolp) 845 (or (bolp)
508 (error "Extraneous text at beginning of command line.")) 846 (error "Extraneous text at beginning of command line."))
509 (delete-region (point) (progn (forward-line 1) (point)))) 847 (delete-region (point) (progn (forward-line 1) (point))))
848
849 (defun texinfo-discard-line-with-args ()
850 (goto-char texinfo-command-start)
851 (delete-region (point) (progn (forward-line 1) (point))))
852
853
854 ;;; @setfilename
855
856 ;; Only `texinfo-format-buffer' handles @setfilename with this
857 ;; definition; `texinfo-format-region' handles @setfilename, if any,
858 ;; specially.
859 (put 'setfilename 'texinfo-format 'texinfo-format-setfilename)
860 (defun texinfo-format-setfilename ()
861 (let ((arg (texinfo-parse-arg-discard)))
862 (message "Formatting Info file: %s" arg)
863 (setq texinfo-format-filename
864 (file-name-nondirectory (expand-file-name arg)))
865 (insert "Info file: "
866 texinfo-format-filename ", -*-Text-*-\n"
867 ;; Date string removed so that regression testing is easier.
868 ;; "produced on "
869 ;; (substring (current-time-string) 8 10) " "
870 ;; (substring (current-time-string) 4 7) " "
871 ;; (substring (current-time-string) -4) " "
872 "produced by `texinfo-format-buffer'\n"
873 "from file"
874 (if (buffer-file-name input-buffer)
875 (concat " `"
876 (file-name-sans-versions
877 (file-name-nondirectory
878 (buffer-file-name input-buffer)))
879 "'")
880 (concat "buffer `" (buffer-name input-buffer) "'"))
881 "\nusing `texinfmt.el' version "
882 texinfmt-version
883 ".\n\n")))
884
885 ;;; @node, @menu
886
887 (put 'node 'texinfo-format 'texinfo-format-node)
888 (put 'nwnode 'texinfo-format 'texinfo-format-node)
889 (defun texinfo-format-node ()
890 (let* ((args (texinfo-format-parse-line-args))
891 (name (nth 0 args))
892 (next (nth 1 args))
893 (prev (nth 2 args))
894 (up (nth 3 args)))
895 (texinfo-discard-command)
896 (setq texinfo-last-node name)
897 (let ((tem (downcase name)))
898 (if (assoc tem texinfo-node-names)
899 (error "Duplicate node name: %s" name)
900 (setq texinfo-node-names (cons (list tem) texinfo-node-names))))
901 (setq texinfo-footnote-number 0)
902 (or (bolp)
903 (insert ?\n))
904 (insert "\^_\nFile: " texinfo-format-filename
905 ", Node: " name)
906 (if next
907 (insert ", Next: " next))
908 (if prev
909 (insert ", Prev: " prev))
910 (if up
911 (insert ", Up: " up))
912 (insert ?\n)
913 (setq texinfo-last-node-pos (point))))
914
915 (put 'menu 'texinfo-format 'texinfo-format-menu)
916 (defun texinfo-format-menu ()
917 (texinfo-discard-line)
918 (insert "* Menu:\n\n"))
919
920 (put 'menu 'texinfo-end 'texinfo-discard-command)
921
922
923 ;;; Cross references
510 924
511 ; @xref {NODE, FNAME, NAME, FILE, DOCUMENT} 925 ; @xref {NODE, FNAME, NAME, FILE, DOCUMENT}
512 ; -> *Note FNAME: (FILE)NODE 926 ; -> *Note FNAME: (FILE)NODE
513 ; If FILE is missing, 927 ; If FILE is missing,
514 ; *Note FNAME: NODE 928 ; *Note FNAME: NODE
532 (let ((args (texinfo-format-parse-args))) 946 (let ((args (texinfo-format-parse-args)))
533 (texinfo-discard-command) 947 (texinfo-discard-command)
534 (insert "*Note ") 948 (insert "*Note ")
535 (let ((fname (or (nth 1 args) (nth 2 args)))) 949 (let ((fname (or (nth 1 args) (nth 2 args))))
536 (if (null (or fname (nth 3 args))) 950 (if (null (or fname (nth 3 args)))
537 (insert (car args) "::") 951 (insert (car args) "::")
538 (insert (or fname (car args)) ": ") 952 (insert (or fname (car args)) ": ")
539 (if (nth 3 args) 953 (if (nth 3 args)
540 (insert "(" (nth 3 args) ")")) 954 (insert "(" (nth 3 args) ")"))
541 (insert (car args)))))) 955 (insert (car args))))))
542 956
543 (put 'pxref 'texinfo-format 'texinfo-format-pxref) 957 (put 'pxref 'texinfo-format 'texinfo-format-pxref)
544 (defun texinfo-format-pxref () 958 (defun texinfo-format-pxref ()
545 (texinfo-format-xref) 959 (texinfo-format-xref)
546 (or (save-excursion 960 (or (save-excursion
547 (forward-char -2) 961 (forward-char -2)
548 (looking-at "::")) 962 (looking-at "::"))
549 (insert "."))) 963 (insert ".")))
550 964
551 ;@inforef{NODE, FNAME, FILE} 965 ;@inforef{NODE, FNAME, FILE}
552 ;Like @xref{NODE, FNAME,,FILE} in texinfo. 966 ;Like @xref{NODE, FNAME,,FILE} in texinfo.
553 ;In Tex, generates "See Info file FILE, node NODE" 967 ;In Tex, generates "See Info file FILE, node NODE"
557 (texinfo-discard-command) 971 (texinfo-discard-command)
558 (if (nth 1 args) 972 (if (nth 1 args)
559 (insert "*Note " (nth 1 args) ": (" (nth 2 args) ")" (car args)) 973 (insert "*Note " (nth 1 args) ": (" (nth 2 args) ")" (car args))
560 (insert "*Note " "(" (nth 2 args) ")" (car args) "::")))) 974 (insert "*Note " "(" (nth 2 args) ")" (car args) "::"))))
561 975
976
977 ;;; Section headings
978
979 (put 'majorheading 'texinfo-format 'texinfo-format-chapter)
562 (put 'chapheading 'texinfo-format 'texinfo-format-chapter) 980 (put 'chapheading 'texinfo-format 'texinfo-format-chapter)
563 (put 'ichapter 'texinfo-format 'texinfo-format-chapter) 981 (put 'ichapter 'texinfo-format 'texinfo-format-chapter)
564 (put 'chapter 'texinfo-format 'texinfo-format-chapter) 982 (put 'chapter 'texinfo-format 'texinfo-format-chapter)
565 (put 'iappendix 'texinfo-format 'texinfo-format-chapter) 983 (put 'iappendix 'texinfo-format 'texinfo-format-chapter)
566 (put 'appendix 'texinfo-format 'texinfo-format-chapter) 984 (put 'appendix 'texinfo-format 'texinfo-format-chapter)
567 (put 'iunnumbered 'texinfo-format 'texinfo-format-chapter) 985 (put 'iunnumbered 'texinfo-format 'texinfo-format-chapter)
986 (put 'top 'texinfo-format 'texinfo-format-chapter)
568 (put 'unnumbered 'texinfo-format 'texinfo-format-chapter) 987 (put 'unnumbered 'texinfo-format 'texinfo-format-chapter)
569 (defun texinfo-format-chapter () 988 (defun texinfo-format-chapter ()
570 (texinfo-format-chapter-1 ?*)) 989 (texinfo-format-chapter-1 ?*))
571 990
572 (put 'heading 'texinfo-format 'texinfo-format-section) 991 (put 'heading 'texinfo-format 'texinfo-format-section)
612 (let ((str (texinfo-parse-arg-discard))) 1031 (let ((str (texinfo-parse-arg-discard)))
613 (forward-char -1) 1032 (forward-char -1)
614 (let ((column (current-column))) 1033 (let ((column (current-column)))
615 (forward-char 1) 1034 (forward-char 1)
616 (while (> column 0) 1035 (while (> column 0)
617 (insert str) 1036 (insert str)
618 (setq column (1- column)))) 1037 (setq column (1- column))))
619 (insert ?\n))) 1038 (insert ?\n)))
620 1039
1040
1041 ;;; Space controling commands: @. and @:
621 (put '\. 'texinfo-format 'texinfo-format-\.) 1042 (put '\. 'texinfo-format 'texinfo-format-\.)
622 (defun texinfo-format-\. () 1043 (defun texinfo-format-\. ()
623 (texinfo-discard-command) 1044 (texinfo-discard-command)
624 (insert ".")) 1045 (insert "."))
625 1046
626 (put '\: 'texinfo-format 'texinfo-format-\:) 1047 (put '\: 'texinfo-format 'texinfo-format-\:)
627 (defun texinfo-format-\: () 1048 (defun texinfo-format-\: ()
628 (texinfo-discard-command)) 1049 (texinfo-discard-command))
629 1050
1051
1052 ;;; @center, @sp, and @br
1053
630 (put 'center 'texinfo-format 'texinfo-format-center) 1054 (put 'center 'texinfo-format 'texinfo-format-center)
631 (defun texinfo-format-center () 1055 (defun texinfo-format-center ()
632 (texinfo-discard-command) 1056 (let ((arg (texinfo-parse-expanded-arg)))
633 (let ((indent-tabs-mode nil)) 1057 (texinfo-discard-command)
634 (center-line))) 1058 (insert arg)
1059 (insert ?\n)
1060 (save-restriction
1061 (goto-char (1- (point)))
1062 (let ((indent-tabs-mode nil))
1063 (center-line)))))
635 1064
636 (put 'sp 'texinfo-format 'texinfo-format-sp) 1065 (put 'sp 'texinfo-format 'texinfo-format-sp)
637 (defun texinfo-format-sp () 1066 (defun texinfo-format-sp ()
638 (let* ((arg (texinfo-parse-arg-discard)) 1067 (let* ((arg (texinfo-parse-arg-discard))
639 (num (read arg))) 1068 (num (read arg)))
640 (insert-char ?\n num))) 1069 (insert-char ?\n num)))
641 1070
642 (put 'br 'texinfo-format 'texinfo-format-paragraph-break) 1071 (put 'br 'texinfo-format 'texinfo-format-paragraph-break)
643 (defun texinfo-format-paragraph-break () 1072 (defun texinfo-format-paragraph-break ()
644 "Force a paragraph break. 1073 "Force a paragraph break.
649 (if (= (following-char) ?\n) 1078 (if (= (following-char) ?\n)
650 (insert ?\n) 1079 (insert ?\n)
651 (insert-char ?\n 2))) 1080 (insert-char ?\n 2)))
652 1081
653 1082
654 ;;; @footnote 1083 ;;; @footnote and @footnotestyle
655 1084
656 ; In Texinfo, footnotes are created with the `@footnote' command. 1085 ; In Texinfo, footnotes are created with the `@footnote' command.
657 ; This command is followed immediately by a left brace, then by the text of 1086 ; This command is followed immediately by a left brace, then by the text of
658 ; the footnote, and then by a terminating right brace. The 1087 ; the footnote, and then by a terminating right brace. The
659 ; template for a footnote is: 1088 ; template for a footnote is:
660 ; 1089 ;
661 ; @footnote{TEXT} 1090 ; @footnote{TEXT}
662 ; 1091 ;
663 ; Info has two footnote styles: 1092 ; Info has two footnote styles:
664 ; 1093 ;
665 ; `End Node' 1094 ; * In the End of node style, all the footnotes for a single node
666 ; In the "End Node" style, all the footnotes for a single node
667 ; are placed at the end of that node. The footnotes are 1095 ; are placed at the end of that node. The footnotes are
668 ; separated from the rest of the node by a line of dashes with 1096 ; separated from the rest of the node by a line of dashes with
669 ; the word `Footnotes' within it. 1097 ; the word `Footnotes' within it.
670 ; 1098 ;
671 ; `Make Node' 1099 ; * In the Separate node style, all the footnotes for a single node
672 ; In the "Make Node" style, all the footnotes for a single node are 1100 ; are placed in an automatically constructed node of their own.
673 ; placed in an automatically constructed node of their own. 1101
1102 ; Footnote style is specified by the @footnotestyle command, either
1103 ; @footnotestyle separate
1104 ; or
1105 ; @footnotestyle end
1106 ;
1107 ; The default is separate
1108
1109 (defvar texinfo-footnote-style "separate"
1110 "Footnote style, either separate or end.")
1111
1112 (put 'footnotestyle 'texinfo-format 'texinfo-footnotestyle)
1113 (defun texinfo-footnotestyle ()
1114 "Specify whether footnotes are at end of node or in separate nodes.
1115 Argument is either end or separate."
1116 (setq texinfo-footnote-style (texinfo-parse-arg-discard)))
1117
1118 (defvar texinfo-footnote-number)
674 1119
675 (put 'footnote 'texinfo-format 'texinfo-format-footnote) 1120 (put 'footnote 'texinfo-format 'texinfo-format-footnote)
676
677 (defvar texinfo-footnote-style 'MN "\
678 *Footnote style, either EN for end node or MN for make node.")
679
680 (defvar texinfo-footnote-number)
681
682 (defun texinfo-format-footnote () 1121 (defun texinfo-format-footnote ()
683 "Format a footnote in either `end node' or `make node' style. 1122 "Format a footnote in either end of node or separate node style.
684 The `texinfo-footnote-style' variable controls which style is used." 1123 The texinfo-footnote-style variable controls which style is used."
685 (setq texinfo-footnote-number (1+ texinfo-footnote-number)) 1124 (setq texinfo-footnote-number (1+ texinfo-footnote-number))
686 (cond ((eq texinfo-footnote-style 'EN) (texinfo-format-end-node)) 1125 (cond ((string= texinfo-footnote-style "end")
687 ((eq texinfo-footnote-style 'MN) (texinfo-format-make-node)))) 1126 (texinfo-format-end-node))
688 1127 ((string= texinfo-footnote-style "separate")
689 (defun texinfo-format-make-node () 1128 (texinfo-format-separate-node))))
690 "Format footnote in `MN', Make Node, style with notes in own node. 1129
1130 (defun texinfo-format-separate-node ()
1131 "Format footnote in Separate node style, with notes in own node.
691 The node is constructed automatically." 1132 The node is constructed automatically."
692 (let* (start 1133 (let* (start
693 (arg (texinfo-parse-expanded-arg)) 1134 (arg (texinfo-parse-line-arg))
694 (node-name-beginning 1135 (node-name-beginning
695 (save-excursion 1136 (save-excursion
696 (re-search-backward 1137 (re-search-backward
697 "^File: \\w+\\(\\w\\|\\s_\\|\\.\\)*[ \t]+Node:") 1138 "^File: \\w+\\(\\w\\|\\s_\\|\\.\\|,\\)*[ \t]+Node:")
698 (match-end 0))) 1139 (match-end 0)))
699 (node-name 1140 (node-name
700 (save-excursion 1141 (save-excursion
701 (buffer-substring 1142 (buffer-substring
702 (progn (goto-char node-name-beginning) ; skip over node command 1143 (progn (goto-char node-name-beginning) ; skip over node command
705 (if (search-forward 1146 (if (search-forward
706 "," 1147 ","
707 (save-excursion (end-of-line) (point)) t) ; bound search 1148 (save-excursion (end-of-line) (point)) t) ; bound search
708 (1- (point)) 1149 (1- (point))
709 (end-of-line) (point)))))) 1150 (end-of-line) (point))))))
710 (texinfo-discard-command) 1151 (texinfo-discard-command) ; remove or insert whitespace, as needed
711 (insert (format "(%d) (*note %s-Footnotes::)" 1152 (delete-region (save-excursion (skip-chars-backward " \t\n") (point))
712 texinfo-footnote-number node-name)) 1153 (point))
1154 (insert (format " (%d) (*Note %s-Footnotes::)"
1155 texinfo-footnote-number node-name))
713 (fill-paragraph nil) 1156 (fill-paragraph nil)
714 (save-excursion 1157 (save-excursion
715 (if (re-search-forward "^@node" nil 'move) 1158 (if (re-search-forward "^@node" nil 'move)
716 (forward-line -1)) 1159 (forward-line -1))
717 1160
734 (setq start (point)) 1177 (setq start (point))
735 (insert (format "\n(%d) %s\n" texinfo-footnote-number arg)) 1178 (insert (format "\n(%d) %s\n" texinfo-footnote-number arg))
736 (fill-region start (point)))))) 1179 (fill-region start (point))))))
737 1180
738 (defun texinfo-format-end-node () 1181 (defun texinfo-format-end-node ()
739 "Format footnote in `EN', End Node, style with notes at end of node." 1182 "Format footnote in the End of node style, with notes at end of node."
740 (let (start 1183 (let (start
741 (arg (texinfo-parse-expanded-arg))) 1184 (arg (texinfo-parse-line-arg)))
742 (texinfo-discard-command) 1185 (texinfo-discard-command) ; remove or insert whitespace, as needed
743 (insert (format "(%d) " texinfo-footnote-number)) 1186 (delete-region (save-excursion (skip-chars-backward " \t\n") (point))
1187 (point))
1188 (insert (format " (%d) " texinfo-footnote-number))
744 (fill-paragraph nil) 1189 (fill-paragraph nil)
745 (save-excursion 1190 (save-excursion
746 (if (search-forward "\n--------- Footnotes ---------\n" nil t) 1191 (if (search-forward "\n--------- Footnotes ---------\n" nil t)
747 (progn ; already have footnote, put new one before end of node 1192 (progn ; already have footnote, put new one before end of node
748 (if (re-search-forward "^@node" nil 'move) 1193 (if (re-search-forward "^@node" nil 'move)
753 ;; else no prior footnote 1198 ;; else no prior footnote
754 (if (re-search-forward "^@node" nil 'move) 1199 (if (re-search-forward "^@node" nil 'move)
755 (forward-line -1)) 1200 (forward-line -1))
756 (insert "\n--------- Footnotes ---------\n") 1201 (insert "\n--------- Footnotes ---------\n")
757 (setq start (point)) 1202 (setq start (point))
758 (insert (format "\n(%d) %s\n" texinfo-footnote-number arg)) 1203 (insert (format "\n(%d) %s\n" texinfo-footnote-number arg))))))
759 (fill-region start (point)))))) 1204
760 1205
761 1206 ;;; @itemize, @enumerate, and similar commands
1207
762 ;; @itemize pushes (itemize "COMMANDS" STARTPOS) on texinfo-stack. 1208 ;; @itemize pushes (itemize "COMMANDS" STARTPOS) on texinfo-stack.
763 ;; @enumerate pushes (enumerate 0 STARTPOS). 1209 ;; @enumerate pushes (enumerate 0 STARTPOS).
764 ;; @item dispatches to the texinfo-item prop of the first elt of the list. 1210 ;; @item dispatches to the texinfo-item prop of the first elt of the list.
765 ;; For itemize, this puts in and rescans the COMMANDS. 1211 ;; For itemize, this puts in and rescans the COMMANDS.
766 ;; For enumerate, this increments the number and puts it in. 1212 ;; For enumerate, this increments the number and puts it in.
767 ;; In either case, it puts a Backspace at the front of the line 1213 ;; In either case, it puts a Backspace at the front of the line
768 ;; which marks it not to be indented later. 1214 ;; which marks it not to be indented later.
769 ;; All other lines get indented by 5 when the @end is reached. 1215 ;; All other lines get indented by 5 when the @end is reached.
770 1216
1217 (defvar texinfo-stack-depth 0
1218 "Count of number of unpopped texinfo-push-stack calls.
1219 Used by @refill indenting command to avoid indenting within lists, etc.")
1220
771 (defun texinfo-push-stack (check arg) 1221 (defun texinfo-push-stack (check arg)
1222 (setq texinfo-stack-depth (1+ texinfo-stack-depth))
772 (setq texinfo-stack 1223 (setq texinfo-stack
773 (cons (list check arg texinfo-command-start) 1224 (cons (list check arg texinfo-command-start)
774 texinfo-stack))) 1225 texinfo-stack)))
775 1226
776 (defun texinfo-pop-stack (check) 1227 (defun texinfo-pop-stack (check)
1228 (setq texinfo-stack-depth (1- texinfo-stack-depth))
777 (if (null texinfo-stack) 1229 (if (null texinfo-stack)
778 (error "Unmatched @end %s" check)) 1230 (error "Unmatched @end %s" check))
779 (if (not (eq (car (car texinfo-stack)) check)) 1231 (if (not (eq (car (car texinfo-stack)) check))
780 (error "@end %s matches @%s" 1232 (error "@end %s matches @%s"
781 check (car (car texinfo-stack)))) 1233 check (car (car texinfo-stack))))
782 (prog1 (cdr (car texinfo-stack)) 1234 (prog1 (cdr (car texinfo-stack))
783 (setq texinfo-stack (cdr texinfo-stack)))) 1235 (setq texinfo-stack (cdr texinfo-stack))))
784 1236
785 (put 'itemize 'texinfo-format 'texinfo-itemize) 1237 (put 'itemize 'texinfo-format 'texinfo-itemize)
786 (defun texinfo-itemize () 1238 (defun texinfo-itemize ()
787 (texinfo-push-stack 'itemize (texinfo-parse-arg-discard)) 1239 (texinfo-push-stack
1240 'itemize
1241 (progn (skip-chars-forward " \t")
1242 (if (eolp)
1243 "@bullet"
1244 (texinfo-parse-line-arg))))
1245 (texinfo-discard-line-with-args)
788 (setq fill-column (- fill-column 5))) 1246 (setq fill-column (- fill-column 5)))
789 1247
790 (put 'itemize 'texinfo-end 'texinfo-end-itemize) 1248 (put 'itemize 'texinfo-end 'texinfo-end-itemize)
791 (defun texinfo-end-itemize () 1249 (defun texinfo-end-itemize ()
792 (setq fill-column (+ fill-column 5)) 1250 (setq fill-column (+ fill-column 5))
793 (texinfo-discard-command) 1251 (texinfo-discard-command)
794 (let ((stacktop 1252 (let ((stacktop
795 (texinfo-pop-stack 'itemize))) 1253 (texinfo-pop-stack 'itemize)))
796 (texinfo-do-itemize (nth 1 stacktop)))) 1254 (texinfo-do-itemize (nth 1 stacktop))))
797 1255
798 (put 'enumerate 'texinfo-format 'texinfo-enumerate) 1256 (put 'enumerate 'texinfo-format 'texinfo-enumerate)
799 (defun texinfo-enumerate () 1257 (defun texinfo-enumerate ()
800 (texinfo-push-stack 'enumerate 0) 1258 (texinfo-push-stack
801 (setq fill-column (- fill-column 5)) 1259 'enumerate
802 (texinfo-discard-line)) 1260 (progn (skip-chars-forward " \t")
1261 (if (eolp)
1262 1
1263 (read (current-buffer)))))
1264 (if (and (symbolp (car (cdr (car texinfo-stack))))
1265 (> 1 (length (symbol-name (car (cdr (car texinfo-stack)))))))
1266 (error
1267 "@enumerate: Use a number or letter, eg: 1, A, a, 3, B, or d." ))
1268 (texinfo-discard-line-with-args)
1269 (setq fill-column (- fill-column 5)))
803 1270
804 (put 'enumerate 'texinfo-end 'texinfo-end-enumerate) 1271 (put 'enumerate 'texinfo-end 'texinfo-end-enumerate)
805 (defun texinfo-end-enumerate () 1272 (defun texinfo-end-enumerate ()
806 (setq fill-column (+ fill-column 5)) 1273 (setq fill-column (+ fill-column 5))
807 (texinfo-discard-command) 1274 (texinfo-discard-command)
808 (let ((stacktop 1275 (let ((stacktop
809 (texinfo-pop-stack 'enumerate))) 1276 (texinfo-pop-stack 'enumerate)))
810 (texinfo-do-itemize (nth 1 stacktop)))) 1277 (texinfo-do-itemize (nth 1 stacktop))))
811 1278
812 (put 'table 'texinfo-format 'texinfo-table) 1279 ;; @alphaenumerate never became a standard part of Texinfo
813 (defun texinfo-table () 1280 (put 'alphaenumerate 'texinfo-format 'texinfo-alphaenumerate)
814 (texinfo-push-stack 'table (texinfo-parse-arg-discard)) 1281 (defun texinfo-alphaenumerate ()
815 (setq fill-column (- fill-column 5))) 1282 (texinfo-push-stack 'alphaenumerate (1- ?a))
816
817 (put 'ftable 'texinfo-format 'texinfo-ftable)
818 (defun texinfo-ftable ()
819 (texinfo-push-stack 'table "@code")
820 (setq fill-column (- fill-column 5)) 1283 (setq fill-column (- fill-column 5))
821 (texinfo-discard-line)) 1284 (texinfo-discard-line))
822 1285
823 (put 'description 'texinfo-format 'texinfo-description) 1286 (put 'alphaenumerate 'texinfo-end 'texinfo-end-alphaenumerate)
824 (defun texinfo-description () 1287 (defun texinfo-end-alphaenumerate ()
825 (texinfo-push-stack 'table "@asis")
826 (setq fill-column (- fill-column 5))
827 (texinfo-discard-line))
828
829 (put 'table 'texinfo-end 'texinfo-end-table)
830 (put 'ftable 'texinfo-end 'texinfo-end-table)
831 (put 'description 'texinfo-end 'texinfo-end-table)
832 (defun texinfo-end-table ()
833 (setq fill-column (+ fill-column 5)) 1288 (setq fill-column (+ fill-column 5))
834 (texinfo-discard-command) 1289 (texinfo-discard-command)
835 (let ((stacktop 1290 (let ((stacktop
836 (texinfo-pop-stack 'table))) 1291 (texinfo-pop-stack 'alphaenumerate)))
1292 (texinfo-do-itemize (nth 1 stacktop))))
1293
1294 ;; @capsenumerate never became a standard part of Texinfo
1295 (put 'capsenumerate 'texinfo-format 'texinfo-capsenumerate)
1296 (defun texinfo-capsenumerate ()
1297 (texinfo-push-stack 'capsenumerate (1- ?A))
1298 (setq fill-column (- fill-column 5))
1299 (texinfo-discard-line))
1300
1301 (put 'capsenumerate 'texinfo-end 'texinfo-end-capsenumerate)
1302 (defun texinfo-end-capsenumerate ()
1303 (setq fill-column (+ fill-column 5))
1304 (texinfo-discard-command)
1305 (let ((stacktop
1306 (texinfo-pop-stack 'capsenumerate)))
837 (texinfo-do-itemize (nth 1 stacktop)))) 1307 (texinfo-do-itemize (nth 1 stacktop))))
838 1308
839 ;; At the @end, indent all the lines within the construct 1309 ;; At the @end, indent all the lines within the construct
840 ;; except those marked with backspace. FROM says where 1310 ;; except those marked with backspace. FROM says where
841 ;; construct started. 1311 ;; construct started.
842 (defun texinfo-do-itemize (from) 1312 (defun texinfo-do-itemize (from)
843 (save-excursion 1313 (save-excursion
844 (while (progn (forward-line -1) 1314 (while (progn (forward-line -1)
845 (>= (point) from)) 1315 (>= (point) from))
846 (if (= (following-char) ?\b) 1316 (if (= (following-char) ?\b)
847 (save-excursion 1317 (save-excursion
848 (delete-char 1) 1318 (delete-char 1)
849 (end-of-line) 1319 (end-of-line)
850 (delete-char 6)) 1320 (delete-char 6))
851 (if (not (looking-at "[ \t]*$")) 1321 (if (not (looking-at "[ \t]*$"))
852 (save-excursion (insert " "))))))) 1322 (save-excursion (insert " ")))))))
853 1323
854 (put 'item 'texinfo-format 'texinfo-item) 1324 (put 'item 'texinfo-format 'texinfo-item)
855 (put 'itemx 'texinfo-format 'texinfo-item) 1325 (put 'itemx 'texinfo-format 'texinfo-item)
856 (defun texinfo-item () 1326 (defun texinfo-item ()
857 (funcall (get (car (car texinfo-stack)) 'texinfo-item))) 1327 (funcall (get (car (car texinfo-stack)) 'texinfo-item)))
858 1328
859 (put 'itemize 'texinfo-item 'texinfo-itemize-item) 1329 (put 'itemize 'texinfo-item 'texinfo-itemize-item)
860 (defun texinfo-itemize-item () 1330 (defun texinfo-itemize-item ()
861 (texinfo-discard-line) 1331 ;; (texinfo-discard-line) ; Did not handle text on same line as @item.
862 (insert "\b " (nth 1 (car texinfo-stack)) " \n") 1332 (delete-region (1+ (point)) (save-excursion (beginning-of-line) (point)))
1333 (if (looking-at "[ \t]*[^ \t\n]+")
1334 ;; Text on same line as @item command.
1335 (insert "\b " (nth 1 (car texinfo-stack)) " \n")
1336 ;; Else text on next line.
1337 (insert "\b " (nth 1 (car texinfo-stack)) " "))
863 (forward-line -1)) 1338 (forward-line -1))
864 1339
865 (put 'enumerate 'texinfo-item 'texinfo-enumerate-item) 1340 (put 'enumerate 'texinfo-item 'texinfo-enumerate-item)
866 (defun texinfo-enumerate-item () 1341 (defun texinfo-enumerate-item ()
867 (texinfo-discard-line) 1342 (texinfo-discard-line)
1343 (let (enumerating-symbol)
1344 (cond ((integerp (car (cdr (car texinfo-stack))))
1345 (setq enumerating-symbol (car (cdr (car texinfo-stack))))
1346 (insert ?\b (format "%3d. " enumerating-symbol) ?\n)
1347 (setcar (cdr (car texinfo-stack)) (1+ enumerating-symbol)))
1348 ((symbolp (car (cdr (car texinfo-stack))))
1349 (setq enumerating-symbol
1350 (symbol-name (car (cdr (car texinfo-stack)))))
1351 (if (or (equal ?\[ (string-to-char enumerating-symbol))
1352 (equal ?\{ (string-to-char enumerating-symbol)))
1353 (error
1354 "Too many items in enumerated list; alphabet ends at Z."))
1355 (insert ?\b (format "%3s. " enumerating-symbol) ?\n)
1356 (setcar (cdr (car texinfo-stack))
1357 (make-symbol
1358 (char-to-string
1359 (1+
1360 (string-to-char enumerating-symbol))))))
1361 (t
1362 (error
1363 "@enumerate: Use a number or letter, eg: 1, A, a, 3, B or d." )))
1364 (forward-line -1)))
1365
1366 (put 'alphaenumerate 'texinfo-item 'texinfo-alphaenumerate-item)
1367 (defun texinfo-alphaenumerate-item ()
1368 (texinfo-discard-line)
868 (let ((next (1+ (car (cdr (car texinfo-stack)))))) 1369 (let ((next (1+ (car (cdr (car texinfo-stack))))))
1370 (if (> next ?z)
1371 (error "More than 26 items in @alphaenumerate; get a bigger alphabet."))
869 (setcar (cdr (car texinfo-stack)) next) 1372 (setcar (cdr (car texinfo-stack)) next)
870 (insert ?\b (format "%3d. " next) ?\n)) 1373 (insert "\b " next ". \n"))
871 (forward-line -1)) 1374 (forward-line -1))
1375
1376 (put 'capsenumerate 'texinfo-item 'texinfo-capsenumerate-item)
1377 (defun texinfo-capsenumerate-item ()
1378 (texinfo-discard-line)
1379 (let ((next (1+ (car (cdr (car texinfo-stack))))))
1380 (if (> next ?Z)
1381 (error "More than 26 items in @capsenumerate; get a bigger alphabet."))
1382 (setcar (cdr (car texinfo-stack)) next)
1383 (insert "\b " next ". \n"))
1384 (forward-line -1))
1385
1386
1387 ;;; @table
1388
1389 ; The `@table' command produces two-column tables.
1390
1391 (put 'table 'texinfo-format 'texinfo-table)
1392 (defun texinfo-table ()
1393 (texinfo-push-stack
1394 'table
1395 (progn (skip-chars-forward " \t")
1396 (if (eolp)
1397 "@asis"
1398 (texinfo-parse-line-arg))))
1399 (texinfo-discard-line-with-args)
1400 (setq fill-column (- fill-column 5)))
872 1401
873 (put 'table 'texinfo-item 'texinfo-table-item) 1402 (put 'table 'texinfo-item 'texinfo-table-item)
874 (defun texinfo-table-item () 1403 (defun texinfo-table-item ()
875 (let ((arg (texinfo-parse-arg-discard)) 1404 (let ((arg (texinfo-parse-arg-discard))
876 (itemfont (car (cdr (car texinfo-stack))))) 1405 (itemfont (car (cdr (car texinfo-stack)))))
877 (insert ?\b itemfont ?\{ arg "}\n \n")) 1406 (insert ?\b itemfont ?\{ arg "}\n \n"))
878 (forward-line -2)) 1407 (forward-line -2))
879 1408
880 1409 (put 'table 'texinfo-end 'texinfo-end-table)
881 ; @ftable 1410 (defun texinfo-end-table ()
882 1411 (setq fill-column (+ fill-column 5))
883 ; The `@ftable' command is like the `@table' command but it also 1412 (texinfo-discard-command)
884 ; inserts each item in the first column into the function index. 1413 (let ((stacktop
1414 (texinfo-pop-stack 'table)))
1415 (texinfo-do-itemize (nth 1 stacktop))))
1416
1417 ;; @description appears to be an undocumented variant on @table that
1418 ;; does not require an arg. It fails in texinfo.tex 2.58 and is not
1419 ;; part of makeinfo.c The command appears to be a relic of the past.
1420 (put 'description 'texinfo-end 'texinfo-end-table)
1421 (put 'description 'texinfo-format 'texinfo-description)
1422 (defun texinfo-description ()
1423 (texinfo-push-stack 'table "@asis")
1424 (setq fill-column (- fill-column 5))
1425 (texinfo-discard-line))
1426
1427
1428 ;;; @ftable, @vtable
1429
1430 ; The `@ftable' and `@vtable' commands are like the `@table' command
1431 ; but they also insert each entry in the first column of the table
1432 ; into the function or variable index.
1433
1434 ;; Handle the @ftable and @vtable commands:
885 1435
886 (put 'ftable 'texinfo-format 'texinfo-ftable) 1436 (put 'ftable 'texinfo-format 'texinfo-ftable)
887 1437 (put 'vtable 'texinfo-format 'texinfo-vtable)
888 ; The following function presumes that the first column of the table 1438
889 ; should be in `@code' font; but the texinfo.tex source does not 1439 (defun texinfo-ftable () (texinfo-indextable 'ftable))
890 ; presume this. 1440 (defun texinfo-vtable () (texinfo-indextable 'vtable))
891 ; (defun texinfo-ftable () 1441
892 ; (texinfo-push-stack 'ftable "@code") 1442 (defun texinfo-indextable (table-type)
893 ; (setq fill-column (- fill-column 5)) 1443 (texinfo-push-stack table-type (texinfo-parse-arg-discard))
894 ; (texinfo-discard-line))
895
896 (defun texinfo-ftable ()
897 (texinfo-push-stack 'ftable (texinfo-parse-arg-discard))
898 (setq fill-column (- fill-column 5))) 1444 (setq fill-column (- fill-column 5)))
899 1445
1446 ;; Handle the @item commands within ftable and vtable:
1447
900 (put 'ftable 'texinfo-item 'texinfo-ftable-item) 1448 (put 'ftable 'texinfo-item 'texinfo-ftable-item)
901 (defun texinfo-ftable-item () 1449 (put 'vtable 'texinfo-item 'texinfo-vtable-item)
1450
1451 (defun texinfo-ftable-item () (texinfo-indextable-item 'texinfo-findex))
1452 (defun texinfo-vtable-item () (texinfo-indextable-item 'texinfo-vindex))
1453
1454 (defun texinfo-indextable-item (index-type)
902 (let ((item (texinfo-parse-arg-discard)) 1455 (let ((item (texinfo-parse-arg-discard))
903 (itemfont (car (cdr (car texinfo-stack)))) 1456 (itemfont (car (cdr (car texinfo-stack))))
904 (indexvar 'texinfo-findex)) 1457 (indexvar index-type))
905 (insert ?\b itemfont ?\{ item "}\n \n") 1458 (insert ?\b itemfont ?\{ item "}\n \n")
906 (set indexvar 1459 (set indexvar
907 (cons 1460 (cons
908 (list item texinfo-last-node) 1461 (list item texinfo-last-node)
909 (symbol-value indexvar))) 1462 (symbol-value indexvar)))
910 (forward-line -2))) 1463 (forward-line -2)))
911 1464
1465 ;; Handle @end ftable, @end vtable
1466
912 (put 'ftable 'texinfo-end 'texinfo-end-ftable) 1467 (put 'ftable 'texinfo-end 'texinfo-end-ftable)
913 (defun texinfo-end-ftable () 1468 (put 'vtable 'texinfo-end 'texinfo-end-vtable)
1469
1470 (defun texinfo-end-ftable () (texinfo-end-indextable 'ftable))
1471 (defun texinfo-end-vtable () (texinfo-end-indextable 'vtable))
1472
1473 (defun texinfo-end-indextable (table-type)
914 (setq fill-column (+ fill-column 5)) 1474 (setq fill-column (+ fill-column 5))
915 (texinfo-discard-command) 1475 (texinfo-discard-command)
916 (let ((stacktop 1476 (let ((stacktop
917 (texinfo-pop-stack 'ftable))) 1477 (texinfo-pop-stack table-type)))
918 (texinfo-do-itemize (nth 1 stacktop)))) 1478 (texinfo-do-itemize (nth 1 stacktop))))
919 1479
920 1480
1481 ;;; @ifinfo, @iftex, @tex
1482
921 (put 'ifinfo 'texinfo-format 'texinfo-discard-line) 1483 (put 'ifinfo 'texinfo-format 'texinfo-discard-line)
922 (put 'ifinfo 'texinfo-end 'texinfo-discard-command) 1484 (put 'ifinfo 'texinfo-end 'texinfo-discard-command)
923 1485
924 (put 'iftex 'texinfo-format 'texinfo-format-iftex) 1486 (put 'iftex 'texinfo-format 'texinfo-format-iftex)
925 (defun texinfo-format-iftex () 1487 (defun texinfo-format-iftex ()
926 (delete-region texinfo-command-start 1488 (delete-region texinfo-command-start
927 (progn (re-search-forward "@end iftex\n") 1489 (progn (re-search-forward "@end iftex[ \t]*\n")
928 (point)))) 1490 (point))))
929 1491
930 (put 'tex 'texinfo-format 'texinfo-format-tex) 1492 (put 'tex 'texinfo-format 'texinfo-format-tex)
931 (defun texinfo-format-tex () 1493 (defun texinfo-format-tex ()
932 (delete-region texinfo-command-start 1494 (delete-region texinfo-command-start
933 (progn (re-search-forward "@end tex\n") 1495 (progn (re-search-forward "@end tex[ \t]*\n")
934 (point)))) 1496 (point))))
1497
1498
1499 ;;; @titlepage
935 1500
936 (put 'titlepage 'texinfo-format 'texinfo-format-titlepage) 1501 (put 'titlepage 'texinfo-format 'texinfo-format-titlepage)
937 (defun texinfo-format-titlepage () 1502 (defun texinfo-format-titlepage ()
938 (delete-region texinfo-command-start 1503 (delete-region texinfo-command-start
939 (progn (search-forward "@end titlepage\n") 1504 (progn (re-search-forward "@end titlepage[ \t]*\n")
940 (point)))) 1505 (point))))
941 1506
942 (put 'endtitlepage 'texinfo-format 'texinfo-discard-line) 1507 (put 'endtitlepage 'texinfo-format 'texinfo-discard-line)
943 1508
944 ; @titlespec an alternative titling command; ignored by Info 1509 ; @titlespec an alternative titling command; ignored by Info
945 1510
946 (put 'titlespec 'texinfo-format 'texinfo-format-titlespec) 1511 (put 'titlespec 'texinfo-format 'texinfo-format-titlespec)
947 (defun texinfo-format-titlespec () 1512 (defun texinfo-format-titlespec ()
948 (delete-region texinfo-command-start 1513 (delete-region texinfo-command-start
949 (progn (search-forward "@end titlespec\n") 1514 (progn (re-search-forward "@end titlespec[ \t]*\n")
950 (point)))) 1515 (point))))
951 1516
952 (put 'endtitlespec 'texinfo-format 'texinfo-discard-line) 1517 (put 'endtitlespec 'texinfo-format 'texinfo-discard-line)
953 1518
954 ; @today{} 1519
1520 ;;; @today
955 1521
956 (put 'today 'texinfo-format 'texinfo-format-today) 1522 (put 'today 'texinfo-format 'texinfo-format-today)
957 1523
958 ; Produces Day Month Year style of output. eg `1 Jan 1900' 1524 ; Produces Day Month Year style of output. eg `1 Jan 1900'
959 ; The `@today{}' command requires a pair of braces, like `@dots{}'. 1525 ; The `@today{}' command requires a pair of braces, like `@dots{}'.
962 (insert (format "%s %s %s" 1528 (insert (format "%s %s %s"
963 (substring (current-time-string) 8 10) 1529 (substring (current-time-string) 8 10)
964 (substring (current-time-string) 4 7) 1530 (substring (current-time-string) 4 7)
965 (substring (current-time-string) -4)))) 1531 (substring (current-time-string) -4))))
966 1532
1533
1534 ;;; @ignore
967 1535
968 (put 'ignore 'texinfo-format 'texinfo-format-ignore) 1536 (put 'ignore 'texinfo-format 'texinfo-format-ignore)
969 (defun texinfo-format-ignore () 1537 (defun texinfo-format-ignore ()
970 (delete-region texinfo-command-start 1538 (delete-region texinfo-command-start
971 (progn (search-forward "@end ignore\n") 1539 (progn (re-search-forward "@end ignore[ \t]*\n")
972 (point)))) 1540 (point))))
973 1541
974 (put 'endignore 'texinfo-format 'texinfo-discard-line) 1542 (put 'endignore 'texinfo-format 'texinfo-discard-line)
1543
1544
1545 ;;; Define the Info enclosure command: @definfoenclose
1546
1547 ; A `@definfoenclose' command may be used to define a highlighting
1548 ; command for Info, but not for TeX. A command defined using
1549 ; `@definfoenclose' marks text by enclosing it in strings that precede
1550 ; and follow the text.
1551 ;
1552 ; Presumably, if you define a command with `@definfoenclose` for Info,
1553 ; you will also define the same command in the TeX definitions file,
1554 ; `texinfo.tex' in a manner appropriate for typesetting.
1555 ;
1556 ; Write a `@definfoenclose' command on a line and follow it with three
1557 ; arguments separated by commas (commas are used as separators in an
1558 ; `@node' line in the same way). The first argument to
1559 ; `@definfoenclose' is the @-command name \(without the `@'\); the
1560 ; second argument is the Info start delimiter string; and the third
1561 ; argument is the Info end delimiter string. The latter two arguments
1562 ; enclose the highlighted text in the Info file. A delimiter string
1563 ; may contain spaces. Neither the start nor end delimiter is
1564 ; required. However, if you do not provide a start delimiter, you
1565 ; must follow the command name with two commas in a row; otherwise,
1566 ; the Info formatting commands will misinterpret the end delimiter
1567 ; string as a start delimiter string.
1568 ;
1569 ; An enclosure command defined this way takes one argument in braces.
1570 ;
1571 ; For example, you can write:
1572 ;
1573 ; @ifinfo
1574 ; @definfoenclose phoo, //, \\
1575 ; @end ifinfo
1576 ;
1577 ; near the beginning of a Texinfo file at the beginning of the lines
1578 ; to define `@phoo' as an Info formatting command that inserts `//'
1579 ; before and `\\' after the argument to `@phoo'. You can then write
1580 ; `@phoo{bar}' wherever you want `//bar\\' highlighted in Info.
1581 ;
1582 ; Also, for TeX formatting, you could write
1583 ;
1584 ; @iftex
1585 ; @global@let@phoo=@i
1586 ; @end iftex
1587 ;
1588 ; to define `@phoo' as a command that causes TeX to typeset
1589 ; the argument to `@phoo' in italics.
1590 ;
1591 ; Note that each definition applies to its own formatter: one for TeX,
1592 ; the other for texinfo-format-buffer or texinfo-format-region.
1593 ;
1594 ; Here is another example: write
1595 ;
1596 ; @definfoenclose headword, , :
1597 ;
1598 ; near the beginning of the file, to define `@headword' as an Info
1599 ; formatting command that inserts nothing before and a colon after the
1600 ; argument to `@headword'.
1601
1602 (put 'definfoenclose 'texinfo-format 'texinfo-define-info-enclosure)
1603 (defun texinfo-define-info-enclosure ()
1604 (let* ((args (texinfo-format-parse-line-args))
1605 (command-name (nth 0 args))
1606 (beginning-delimiter (or (nth 1 args) ""))
1607 (end-delimiter (or (nth 2 args) "")))
1608 (texinfo-discard-command)
1609 (setq texinfo-enclosure-list
1610 (cons
1611 (list command-name
1612 (list
1613 beginning-delimiter
1614 end-delimiter))
1615 texinfo-enclosure-list))))
1616
1617
1618 ;;; @var, @code and the like
975 1619
976 (put 'var 'texinfo-format 'texinfo-format-var) 1620 (put 'var 'texinfo-format 'texinfo-format-var)
977 ; @sc a small caps font for TeX; formatted as `var' in Info 1621 ; @sc a small caps font for TeX; formatted as `var' in Info
978 (put 'sc 'texinfo-format 'texinfo-format-var) 1622 (put 'sc 'texinfo-format 'texinfo-format-var)
979 (defun texinfo-format-var () 1623 (defun texinfo-format-var ()
980 (insert (upcase (texinfo-parse-arg-discard))) 1624 (insert (upcase (texinfo-parse-arg-discard)))
981 (goto-char texinfo-command-start)) 1625 (goto-char texinfo-command-start))
982 1626
983 ; various noops 1627 ; various noops
984 1628
985 (put 'asis 'texinfo-format 'texinfo-format-noop)
986 (put 'b 'texinfo-format 'texinfo-format-noop) 1629 (put 'b 'texinfo-format 'texinfo-format-noop)
987 (put 't 'texinfo-format 'texinfo-format-noop)
988 (put 'i 'texinfo-format 'texinfo-format-noop) 1630 (put 'i 'texinfo-format 'texinfo-format-noop)
989 (put 'r 'texinfo-format 'texinfo-format-noop) 1631 (put 'r 'texinfo-format 'texinfo-format-noop)
1632 (put 't 'texinfo-format 'texinfo-format-noop)
1633 (put 'w 'texinfo-format 'texinfo-format-noop)
1634 (put 'asis 'texinfo-format 'texinfo-format-noop)
1635 (put 'dmn 'texinfo-format 'texinfo-format-noop)
1636 (put 'key 'texinfo-format 'texinfo-format-noop)
1637 (put 'math 'texinfo-format 'texinfo-format-noop)
990 (put 'titlefont 'texinfo-format 'texinfo-format-noop) 1638 (put 'titlefont 'texinfo-format 'texinfo-format-noop)
991 (put 'key 'texinfo-format 'texinfo-format-noop)
992 (put 'w 'texinfo-format 'texinfo-format-noop)
993 (defun texinfo-format-noop () 1639 (defun texinfo-format-noop ()
994 (insert (texinfo-parse-arg-discard)) 1640 (insert (texinfo-parse-arg-discard))
995 (goto-char texinfo-command-start)) 1641 (goto-char texinfo-command-start))
996 1642
1643 (put 'cite 'texinfo-format 'texinfo-format-code)
997 (put 'code 'texinfo-format 'texinfo-format-code) 1644 (put 'code 'texinfo-format 'texinfo-format-code)
998 (put 'samp 'texinfo-format 'texinfo-format-code)
999 (put 'file 'texinfo-format 'texinfo-format-code) 1645 (put 'file 'texinfo-format 'texinfo-format-code)
1000 (put 'kbd 'texinfo-format 'texinfo-format-code) 1646 (put 'kbd 'texinfo-format 'texinfo-format-code)
1001 (put 'cite 'texinfo-format 'texinfo-format-code) 1647 (put 'samp 'texinfo-format 'texinfo-format-code)
1002 (defun texinfo-format-code () 1648 (defun texinfo-format-code ()
1003 (insert "`" (texinfo-parse-arg-discard) "'") 1649 (insert "`" (texinfo-parse-arg-discard) "'")
1004 (goto-char texinfo-command-start)) 1650 (goto-char texinfo-command-start))
1005 1651
1006 (put 'emph 'texinfo-format 'texinfo-format-emph) 1652 (put 'emph 'texinfo-format 'texinfo-format-emph)
1007 (put 'strong 'texinfo-format 'texinfo-format-emph) 1653 (put 'strong 'texinfo-format 'texinfo-format-emph)
1008 (defun texinfo-format-emph () 1654 (defun texinfo-format-emph ()
1009 (insert "*" (texinfo-parse-arg-discard) "*") 1655 (insert "*" (texinfo-parse-arg-discard) "*")
1010 (goto-char texinfo-command-start)) 1656 (goto-char texinfo-command-start))
1011 1657
1658 (put 'dfn 'texinfo-format 'texinfo-format-defn)
1012 (put 'defn 'texinfo-format 'texinfo-format-defn) 1659 (put 'defn 'texinfo-format 'texinfo-format-defn)
1013 (put 'dfn 'texinfo-format 'texinfo-format-defn)
1014 (defun texinfo-format-defn () 1660 (defun texinfo-format-defn ()
1015 (insert "\"" (texinfo-parse-arg-discard) "\"") 1661 (insert "\"" (texinfo-parse-arg-discard) "\"")
1016 (goto-char texinfo-command-start)) 1662 (goto-char texinfo-command-start))
1017 1663
1018 (put 'bullet 'texinfo-format 'texinfo-format-bullet) 1664 (put 'bullet 'texinfo-format 'texinfo-format-bullet)
1020 "Insert an asterisk. 1666 "Insert an asterisk.
1021 If used within a line, follow `@bullet' with braces." 1667 If used within a line, follow `@bullet' with braces."
1022 (texinfo-optional-braces-discard) 1668 (texinfo-optional-braces-discard)
1023 (insert "*")) 1669 (insert "*"))
1024 1670
1671
1672 ;;; @example, @lisp, @quotation, @display, @smalllisp, @smallexample
1673
1674 (put 'display 'texinfo-format 'texinfo-format-example)
1675 (put 'example 'texinfo-format 'texinfo-format-example)
1676 (put 'lisp 'texinfo-format 'texinfo-format-example)
1677 (put 'quotation 'texinfo-format 'texinfo-format-example)
1025 (put 'smallexample 'texinfo-format 'texinfo-format-example) 1678 (put 'smallexample 'texinfo-format 'texinfo-format-example)
1026 (put 'smalllisp 'texinfo-format 'texinfo-format-example) 1679 (put 'smalllisp 'texinfo-format 'texinfo-format-example)
1027 (put 'example 'texinfo-format 'texinfo-format-example)
1028 (put 'quotation 'texinfo-format 'texinfo-format-example)
1029 (put 'lisp 'texinfo-format 'texinfo-format-example)
1030 (put 'display 'texinfo-format 'texinfo-format-example)
1031 (put 'format 'texinfo-format 'texinfo-format-example)
1032 (put 'flushleft 'texinfo-format 'texinfo-format-example)
1033 (defun texinfo-format-example () 1680 (defun texinfo-format-example ()
1034 (texinfo-push-stack 'example nil) 1681 (texinfo-push-stack 'example nil)
1035 (setq fill-column (- fill-column 5)) 1682 (setq fill-column (- fill-column 5))
1036 (texinfo-discard-line)) 1683 (texinfo-discard-line))
1037 1684
1685 (put 'example 'texinfo-end 'texinfo-end-example)
1686 (put 'display 'texinfo-end 'texinfo-end-example)
1687 (put 'lisp 'texinfo-end 'texinfo-end-example)
1688 (put 'quotation 'texinfo-end 'texinfo-end-example)
1038 (put 'smallexample 'texinfo-end 'texinfo-end-example) 1689 (put 'smallexample 'texinfo-end 'texinfo-end-example)
1039 (put 'example 'texinfo-end 'texinfo-end-example) 1690 (put 'smalllisp 'texinfo-end 'texinfo-end-example)
1040 (put 'quotation 'texinfo-end 'texinfo-end-example)
1041 (put 'lisp 'texinfo-end 'texinfo-end-example)
1042 (put 'display 'texinfo-end 'texinfo-end-example)
1043 (put 'format 'texinfo-end 'texinfo-end-example)
1044 (put 'flushleft 'texinfo-end 'texinfo-end-example)
1045 (defun texinfo-end-example () 1691 (defun texinfo-end-example ()
1046 (setq fill-column (+ fill-column 5)) 1692 (setq fill-column (+ fill-column 5))
1047 (texinfo-discard-command) 1693 (texinfo-discard-command)
1048 (let ((stacktop 1694 (let ((stacktop
1049 (texinfo-pop-stack 'example))) 1695 (texinfo-pop-stack 'example)))
1050 (texinfo-do-itemize (nth 1 stacktop)))) 1696 (texinfo-do-itemize (nth 1 stacktop))))
1051 1697
1052 (put 'exdent 'texinfo-format 'texinfo-format-exdent) 1698 (put 'exdent 'texinfo-format 'texinfo-format-exdent)
1053 (defun texinfo-format-exdent () 1699 (defun texinfo-format-exdent ()
1054 (texinfo-discard-command) 1700 (texinfo-discard-command)
1055 (delete-region (point) 1701 (delete-region (point)
1056 (progn 1702 (progn
1057 (skip-chars-forward " ") 1703 (skip-chars-forward " ")
1058 (point))) 1704 (point)))
1059 (insert ?\b) 1705 (insert ?\b)
1060 ;; Cancel out the deletion that texinfo-do-itemize 1706 ;; Cancel out the deletion that texinfo-do-itemize
1061 ;; is going to do at the end of this line. 1707 ;; is going to do at the end of this line.
1062 (save-excursion 1708 (save-excursion
1063 (end-of-line) 1709 (end-of-line)
1064 (insert "\n "))) 1710 (insert "\n ")))
1065 1711
1066 1712
1067 ;; @flushright ... @end flushright 1713 ;;; @cartouche
1714
1715 ; The @cartouche command is a noop in Info; in a printed manual,
1716 ; it makes a box with rounded corners.
1717
1718 (put 'cartouche 'texinfo-format 'texinfo-discard-line)
1719 (put 'cartouche 'texinfo-end 'texinfo-discard-command)
1720
1721
1722 ;;; @flushleft and @format
1723
1724 ; The @flushleft command left justifies every line but leaves the
1725 ; right end ragged. As far as Info is concerned, @flushleft is a
1726 ; `do-nothing' command
1727
1728 ; The @format command is similar to @example except that it does not
1729 ; indent; this means that in Info, @format is similar to @flushleft.
1730
1731 (put 'format 'texinfo-format 'texinfo-format-flushleft)
1732 (put 'flushleft 'texinfo-format 'texinfo-format-flushleft)
1733 (defun texinfo-format-flushleft ()
1734 (texinfo-discard-line))
1735
1736 (put 'format 'texinfo-end 'texinfo-end-flushleft)
1737 (put 'flushleft 'texinfo-end 'texinfo-end-flushleft)
1738 (defun texinfo-end-flushleft ()
1739 (texinfo-discard-command))
1740
1741
1742 ;;; @flushright
1068 1743
1069 ; The @flushright command right justifies every line but leaves the 1744 ; The @flushright command right justifies every line but leaves the
1070 ; left end ragged. 1745 ; left end ragged. Spaces and tabs at the right ends of lines are
1746 ; removed so that visible text lines up on the right side.
1071 1747
1072 (put 'flushright 'texinfo-format 'texinfo-format-flushright) 1748 (put 'flushright 'texinfo-format 'texinfo-format-flushright)
1073 (defun texinfo-format-flushright () 1749 (defun texinfo-format-flushright ()
1074 (texinfo-push-stack 'flushright nil) 1750 (texinfo-push-stack 'flushright nil)
1075 (texinfo-discard-line)) 1751 (texinfo-discard-line))
1091 (beginning-of-line) 1767 (beginning-of-line)
1092 (insert 1768 (insert
1093 (make-string 1769 (make-string
1094 (- fill-column 1770 (- fill-column
1095 (save-excursion 1771 (save-excursion
1096 (end-of-line) 1772 (end-of-line)
1773 (skip-chars-backward " \t")
1774 (delete-region (point) (progn (end-of-line) (point)))
1097 (current-column))) 1775 (current-column)))
1098 ? ))))) 1776 ? )))))
1099 1777
1100 1778
1779 ;;; @ctrl, @TeX, @copyright, @minus, @dots
1780
1101 (put 'ctrl 'texinfo-format 'texinfo-format-ctrl) 1781 (put 'ctrl 'texinfo-format 'texinfo-format-ctrl)
1102 (defun texinfo-format-ctrl () 1782 (defun texinfo-format-ctrl ()
1103 (let ((str (texinfo-parse-arg-discard))) 1783 (let ((str (texinfo-parse-arg-discard)))
1104 (insert (logand 31 (aref str 0))))) 1784 (insert (logand 31 (aref str 0)))))
1105 1785
1123 (put 'dots 'texinfo-format 'texinfo-format-dots) 1803 (put 'dots 'texinfo-format 'texinfo-format-dots)
1124 (defun texinfo-format-dots () 1804 (defun texinfo-format-dots ()
1125 (texinfo-parse-arg-discard) 1805 (texinfo-parse-arg-discard)
1126 (insert "...")) 1806 (insert "..."))
1127 1807
1808
1809 ;;; Refilling and indenting: @refill, @paragraphindent, @noindent
1810
1811 ;;; Indent only those paragraphs that are refilled as a result of an
1812 ;;; @refill command.
1813
1814 ; * If the value is `asis', do not change the existing indentation at
1815 ; the starts of paragraphs.
1816
1817 ; * If the value zero, delete any existing indentation.
1818
1819 ; * If the value is greater than zero, indent each paragraph by that
1820 ; number of spaces.
1821
1822 ;;; But do not refill paragraphs with an @refill command that are
1823 ;;; preceded by @noindent or are part of a table, list, or deffn.
1824
1825 (defvar texinfo-paragraph-indent "asis"
1826 "Number of spaces for @refill to indent a paragraph; else to leave as is.")
1827
1828 (put 'paragraphindent 'texinfo-format 'texinfo-paragraphindent)
1829
1830 (defun texinfo-paragraphindent ()
1831 "Specify the number of spaces for @refill to indent a paragraph.
1832 Default is to leave the number of spaces as is."
1833 (let ((arg (texinfo-parse-arg-discard)))
1834 (if (string= "asis" arg)
1835 (setq texinfo-paragraph-indent "asis")
1836 (setq texinfo-paragraph-indent (string-to-int arg)))))
1837
1128 (put 'refill 'texinfo-format 'texinfo-format-refill) 1838 (put 'refill 'texinfo-format 'texinfo-format-refill)
1129 (defun texinfo-format-refill () 1839 (defun texinfo-format-refill ()
1840 "Refill paragraph. Also, indent first line as set by @paragraphindent.
1841 Default is to leave paragraph indentation as is."
1130 (texinfo-discard-command) 1842 (texinfo-discard-command)
1131 (fill-paragraph nil)) 1843 (forward-paragraph -1)
1844 (if (looking-at "[ \t\n]*$") (forward-line 1))
1845 ;; Do not indent if an entry in a list, table, or deffn,
1846 ;; or if paragraph is preceded by @noindent.
1847 ;; Otherwise, indent
1848 (cond
1849 ;; delete a @noindent line and do not indent paragraph
1850 ((save-excursion (forward-line -1)
1851 (looking-at "^@noindent"))
1852 (forward-line -1)
1853 (delete-region (point) (progn (forward-line 1) (point))))
1854 ;; do nothing if "asis"
1855 ((equal texinfo-paragraph-indent "asis"))
1856 ;; do no indenting in list, etc.
1857 ((> texinfo-stack-depth 0))
1858 ;; otherwise delete existing whitespace and indent
1859 (t
1860 (delete-region (point) (progn (skip-chars-forward " \t") (point)))
1861 (insert (make-string texinfo-paragraph-indent ? ))))
1862 (forward-paragraph 1)
1863 (forward-line -1)
1864 (end-of-line)
1865 ;; Do not fill a section title line with asterisks, hyphens, etc. that
1866 ;; are used to underline it. This could occur if the line following
1867 ;; the underlining is not an index entry and has text within it.
1868 (let* ((previous-paragraph-separate paragraph-separate)
1869 (paragraph-separate (concat paragraph-separate "\\|^[=*---.]+"))
1870 (previous-paragraph-start paragraph-start)
1871 (paragraph-start (concat paragraph-start "\\|^[=*---.]+")))
1872 (unwind-protect
1873 (fill-paragraph nil)
1874 (setq paragraph-separate previous-paragraph-separate)
1875 (setq paragraph-start previous-paragraph-start))))
1876
1877 (put 'noindent 'texinfo-format 'texinfo-noindent)
1878 (defun texinfo-noindent ()
1879 (save-excursion
1880 (forward-paragraph 1)
1881 (if (search-backward "@refill"
1882 (save-excursion (forward-line -1) (point)) t)
1883 () ; leave @noindent command so @refill command knows not to indent
1884 ;; else
1885 (texinfo-discard-line))))
1132 1886
1133 1887
1134 ;;; Index generation 1888 ;;; Index generation
1135 1889
1136 (put 'vindex 'texinfo-format 'texinfo-format-vindex) 1890 (put 'vindex 'texinfo-format 'texinfo-format-vindex)
1159 1913
1160 (defun texinfo-index (indexvar) 1914 (defun texinfo-index (indexvar)
1161 (let ((arg (texinfo-parse-expanded-arg))) 1915 (let ((arg (texinfo-parse-expanded-arg)))
1162 (texinfo-discard-command) 1916 (texinfo-discard-command)
1163 (set indexvar 1917 (set indexvar
1164 (cons (list arg texinfo-last-node) 1918 (cons (list arg
1165 (symbol-value indexvar))))) 1919 texinfo-last-node
1920 ;; Region formatting may not provide last node position.
1921 (if texinfo-last-node-pos
1922 (1+ (count-lines texinfo-last-node-pos (point)))
1923 1))
1924 (symbol-value indexvar)))))
1166 1925
1167 (defconst texinfo-indexvar-alist 1926 (defconst texinfo-indexvar-alist
1168 '(("cp" . texinfo-cindex) 1927 '(("cp" . texinfo-cindex)
1169 ("fn" . texinfo-findex) 1928 ("fn" . texinfo-findex)
1170 ("vr" . texinfo-vindex) 1929 ("vr" . texinfo-vindex)
1243 ("tp" . texinfo-format-tindex) 2002 ("tp" . texinfo-format-tindex)
1244 ("pg" . texinfo-format-pindex) 2003 ("pg" . texinfo-format-pindex)
1245 ("ky" . texinfo-format-kindex))) 2004 ("ky" . texinfo-format-kindex)))
1246 2005
1247 2006
2007 ;;; Sort and index (for VMS)
2008
2009 ;; Sort an index which is in the current buffer between START and END.
2010 ;; Used on VMS, where the `sort' utility is not available.
2011 (defun texinfo-sort-region (start end)
2012 (require 'sort)
2013 (save-restriction
2014 (narrow-to-region start end)
2015 (sort-subr nil 'forward-line 'end-of-line 'texinfo-sort-startkeyfun)))
2016
2017 ;; Subroutine for sorting an index.
2018 ;; At start of a line, return a string to sort the line under.
2019 (defun texinfo-sort-startkeyfun ()
2020 (let ((line
2021 (buffer-substring (point) (save-excursion (end-of-line) (point)))))
2022 ;; Canonicalize whitespace and eliminate funny chars.
2023 (while (string-match "[ \t][ \t]+\\|[^a-z0-9 ]+" line)
2024 (setq line (concat (substring line 0 (match-beginning 0))
2025 " "
2026 (substring line (match-end 0) (length line)))))
2027 line))
2028
2029
1248 ;;; @printindex 2030 ;;; @printindex
1249 2031
1250 (put 'printindex 'texinfo-format 'texinfo-format-printindex) 2032 (put 'printindex 'texinfo-format 'texinfo-format-printindex)
1251 2033
1252 (defun texinfo-format-printindex () 2034 (defun texinfo-format-printindex ()
1253 (let ((indexelts (symbol-value 2035 (let ((indexelts (symbol-value
1254 (cdr (assoc (texinfo-parse-arg-discard) 2036 (cdr (assoc (texinfo-parse-arg-discard)
1255 texinfo-indexvar-alist)))) 2037 texinfo-indexvar-alist))))
1256 opoint) 2038 opoint)
1257 (insert "\n* Menu:\n\n") 2039 (insert "\n* Menu:\n\n")
1258 (setq opoint (point)) 2040 (setq opoint (point))
1259 (texinfo-print-index nil indexelts) 2041 (texinfo-print-index nil indexelts)
1260 2042
1261 (if (eq system-type 'vax-vms) 2043 (if (eq system-type 'vax-vms)
1263 (shell-command-on-region opoint (point) "sort -fd" 1)))) 2045 (shell-command-on-region opoint (point) "sort -fd" 1))))
1264 2046
1265 (defun texinfo-print-index (file indexelts) 2047 (defun texinfo-print-index (file indexelts)
1266 (while indexelts 2048 (while indexelts
1267 (if (stringp (car (car indexelts))) 2049 (if (stringp (car (car indexelts)))
1268 (insert "* " (car (car indexelts)) 2050 (progn
1269 ": " (if file (concat "(" file ")") "") 2051 (insert "* " (car (car indexelts)) ": " )
1270 (nth 1 (car indexelts)) ".\n") 2052 (indent-to 32)
2053 (insert
2054 (if file (concat "(" file ")") "")
2055 (nth 1 (car indexelts)) ".")
2056 (indent-to 54)
2057 (insert
2058 (if (nth 2 (car indexelts))
2059 (format " %d." (nth 2 (car indexelts)))
2060 "")
2061 "\n"))
1271 ;; index entries from @include'd file 2062 ;; index entries from @include'd file
1272 (texinfo-print-index (nth 1 (car indexelts)) 2063 (texinfo-print-index (nth 1 (car indexelts))
1273 (nth 2 (car indexelts)))) 2064 (nth 2 (car indexelts))))
1274 (setq indexelts (cdr indexelts)))) 2065 (setq indexelts (cdr indexelts))))
1275 2066
1276 2067
1277 ;;; NOTATIONS: @equiv, @error, etc 2068 ;;; Glyphs: @equiv, @error, etc
1278 2069
1279 ;; @equiv to show that two expressions are equivalent 2070 ;; @equiv to show that two expressions are equivalent
1280 ;; @error to show an error message 2071 ;; @error to show an error message
1281 ;; @expansion to show what a macro expands to 2072 ;; @expansion to show what a macro expands to
1282 ;; @point to show the location of point in an example 2073 ;; @point to show the location of point in an example
1312 (defun texinfo-format-result () 2103 (defun texinfo-format-result ()
1313 (texinfo-parse-arg-discard) 2104 (texinfo-parse-arg-discard)
1314 (insert "=>")) 2105 (insert "=>"))
1315 2106
1316 2107
1317 ;;;; Description formatting: @deffn, @defun, etc 2108 ;;; Definition formatting: @deffn, @defun, etc
2109
2110 ;; What definition formatting produces:
2111 ;;
2112 ;; @deffn category name args...
2113 ;; In Info, `Category: name ARGS'
2114 ;; In index: name: node. line#.
2115 ;;
2116 ;; @defvr category name
2117 ;; In Info, `Category: name'
2118 ;; In index: name: node. line#.
2119 ;;
2120 ;; @deftp category name attributes...
2121 ;; `category name attributes...' Note: @deftp args in lower case.
2122 ;; In index: name: node. line#.
2123 ;;
2124 ;; Specialized function-like or variable-like entity:
2125 ;;
2126 ;; @defun, @defmac, @defspec, @defvar, @defopt
2127 ;;
2128 ;; @defun name args In Info, `Function: name ARGS'
2129 ;; @defmac name args In Info, `Macro: name ARGS'
2130 ;; @defvar name In Info, `Variable: name'
2131 ;; etc.
2132 ;; In index: name: node. line#.
2133 ;;
2134 ;; Generalized typed-function-like or typed-variable-like entity:
2135 ;; @deftypefn category data-type name args...
2136 ;; In Info, `Category: data-type name args...'
2137 ;; @deftypevr category data-type name
2138 ;; In Info, `Category: data-type name'
2139 ;; In index: name: node. line#.
2140 ;;
2141 ;; Specialized typed-function-like or typed-variable-like entity:
2142 ;; @deftypefun data-type name args...
2143 ;; In Info, `Function: data-type name ARGS'
2144 ;; In index: name: node. line#.
2145 ;;
2146 ;; @deftypevar data-type name
2147 ;; In Info, `Variable: data-type name'
2148 ;; In index: name: node. line#. but include args after name!?
2149 ;;
2150 ;; Generalized object oriented entity:
2151 ;; @defop category class name args...
2152 ;; In Info, `Category on class: name ARG'
2153 ;; In index: name on class: node. line#.
2154 ;;
2155 ;; @defcv category class name
2156 ;; In Info, `Category of class: name'
2157 ;; In index: name of class: node. line#.
2158 ;;
2159 ;; Specialized object oriented entity:
2160 ;; @defmethod class name args...
2161 ;; In Info, `Method on class: name ARGS'
2162 ;; In index: name on class: node. line#.
2163 ;;
2164 ;; @defivar class name
2165 ;; In Info, `Instance variable of class: name'
2166 ;; In index: name of class: node. line#.
2167
2168
2169 ;;; The definition formatting functions
1318 2170
1319 (defun texinfo-format-defun () 2171 (defun texinfo-format-defun ()
1320 (texinfo-push-stack 'defun nil) 2172 (texinfo-push-stack 'defun nil)
1321 (setq fill-column (- fill-column 5)) 2173 (setq fill-column (- fill-column 5))
1322 (texinfo-format-defun-1 t)) 2174 (texinfo-format-defun-1 t))
1323
1324 (defun texinfo-format-defunx ()
1325 (texinfo-format-defun-1 nil))
1326
1327 (defun texinfo-format-defun-1 (first-p)
1328 (let ((args (texinfo-format-parse-defun-args))
1329 (command-type (get texinfo-command-name 'texinfo-defun-type))
1330 (class "")
1331 (name "")
1332 (classification "")
1333 (data-type ""))
1334 (texinfo-discard-command)
1335
1336 (cond
1337 ;; Generalized object oriented entity: `category class name [args...]'
1338 ;; In Info, `Category on class: name ARG'
1339 ((eq (eval (car command-type)) 'defop-type)
1340 (setq category (car args))
1341 (setq class (car (cdr args)))
1342 (setq name (car args))
1343 (setq args (cdr (cdr args))))
1344
1345 ;; Specialized object oriented entity: @defmethod, @defivar
1346 ;; "Instance Variable" `class name [args...]'
1347 ;; In Info, `Instance variable of class: name'
1348 ((eq (eval (car command-type)) 'defmethod-type)
1349 (setq category (car (cdr command-type)))
1350 (setq class (car args))
1351 (setq name (car args))
1352 (setq args (cdr args)))
1353
1354 ;; Generalized function-like or variable-like entity:
1355 ;; `category name [args...]'
1356 ;; In Info, `Category: name ARGS'
1357 ((or (eq (eval (car command-type)) 'deffn-type)
1358 (eq (eval (car command-type)) 'deftp-type))
1359 (setq category (car args))
1360 (setq args (cdr args))
1361 (setq name (car args)))
1362
1363 ;; Specialized function-like or variable-like entity:
1364 ;; "Macro" `name [args...]'
1365 ;; In Info, `Macro: Name ARGS'
1366 ((eq (eval (car command-type)) 'defun-type)
1367 (setq category (car (cdr command-type)))
1368 (setq name (car args)))
1369
1370 ;; Generalized typed-function-like or typed-variable-like entity:
1371 ;; `Classification data-type name [args...]'
1372 ;; In Info, `Classification: data-type name ARGS'
1373 ((or (eq (eval (car command-type)) 'deftypefn-type)
1374 (eq (eval (car command-type)) 'deftypevr-type))
1375 (setq classification (car args))
1376 (setq data-type (car (cdr args)))
1377 (setq name (car (cdr (cdr args))))
1378 (setq args (cdr (cdr (cdr args)))))
1379
1380 ;; Specialized typed-function-like or typed-variable-like entity:
1381 ;; `data-type name [args...]'
1382 ;; In Info, `Function: data-type name ARGS'
1383 ;; or, `Variable: data-type name'
1384 ((or (eq (eval (car command-type)) 'deftypefun-type)
1385 (eq (eval (car command-type)) 'deftypevar-type))
1386 (setq classification (car (cdr command-type)))
1387 (setq data-type (car args))
1388 (setq name (car (cdr args)))
1389 (setq args (cdr (cdr args)))))
1390
1391 ;; Delete extra newline inserted after previous header line.
1392 (if (not first-p)
1393 (delete-char -1))
1394
1395 (let ((formatter (get texinfo-command-name 'texinfo-defun-format-type)))
1396 (cond
1397 ;; if typed function or variable
1398 ((eq formatter 'texinfo-format-deftypefn-type)
1399 (insert "* " classification ": " data-type " " name)
1400 (let ((args args))
1401 (while args
1402 (insert " " (car args))
1403 (setq args (cdr args)))))
1404 (t
1405 ;; and if object oriented, set category
1406 (if (or (eq formatter 'texinfo-format-defop-type)
1407 (eq formatter 'texinfo-format-defcv-type))
1408 (setq category (funcall formatter category class)))
1409 (insert "* " category ": " name)
1410 (let ((args (cdr args)))
1411 (while args
1412 (insert " "
1413 (if (or (= ?& (aref (car args) 0))
1414 (eq (eval (car command-type)) 'deftp-type))
1415 (car args)
1416 (upcase (car args))))
1417 (setq args (cdr args)))))))
1418
1419 ;; Insert extra newline so that paragraph filling does not mess
1420 ;; with header line.
1421 (insert "\n\n")
1422 (rplaca (cdr (cdr (car texinfo-stack))) (point))
1423
1424 (let ((indexvar (get texinfo-command-name 'texinfo-defun-index))
1425 (index-formatter
1426 (get texinfo-command-name 'texinfo-defun-format-index)))
1427 (set indexvar
1428 (cons (list
1429 (cond
1430 ;; if object oriented
1431 ((or (eq index-formatter 'texinfo-format-defop-index)
1432 (eq index-formatter 'texinfo-format-defcv-index))
1433 (funcall index-formatter name class))
1434 ((eq index-formatter 'texinfo-format-deftypefn-index)
1435 (funcall index-formatter name data-type))
1436 (t (car args)))
1437 texinfo-last-node)
1438 (symbol-value indexvar))))))
1439 2175
1440 (defun texinfo-end-defun () 2176 (defun texinfo-end-defun ()
1441 (setq fill-column (+ fill-column 5)) 2177 (setq fill-column (+ fill-column 5))
1442 (texinfo-discard-command) 2178 (texinfo-discard-command)
1443 (let ((start (nth 1 (texinfo-pop-stack 'defun)))) 2179 (let ((start (nth 1 (texinfo-pop-stack 'defun))))
1445 ;; Delete extra newline inserted after header. 2181 ;; Delete extra newline inserted after header.
1446 (save-excursion 2182 (save-excursion
1447 (goto-char start) 2183 (goto-char start)
1448 (delete-char -1)))) 2184 (delete-char -1))))
1449 2185
1450 (defun texinfo-format-defop-type (category class) 2186 (defun texinfo-format-defunx ()
1451 (format "%s on %s" category class)) 2187 (texinfo-format-defun-1 nil))
1452 2188
1453 (defun texinfo-format-defop-index (name class) 2189 (defun texinfo-format-defun-1 (first-p)
1454 (format "%s on %s" name class)) 2190 (let ((parse-args (texinfo-format-parse-defun-args))
1455 2191 (command-type (get texinfo-command-name 'texinfo-defun-type)))
1456 (defun texinfo-format-defcv-type (category class) 2192 (texinfo-discard-command)
1457 (format "%s of %s" category class)) 2193 ;; Delete extra newline inserted after previous header line.
1458 2194 (if (not first-p)
1459 (defun texinfo-format-defcv-index (name class) 2195 (delete-char -1))
1460 (format "%s of %s" name class)) 2196 (funcall
2197 (get texinfo-command-name 'texinfo-deffn-formatting-property) parse-args)
2198 ;; Insert extra newline so that paragraph filling does not mess
2199 ;; with header line.
2200 (insert "\n\n")
2201 (rplaca (cdr (cdr (car texinfo-stack))) (point))
2202 (funcall
2203 (get texinfo-command-name 'texinfo-defun-indexing-property) parse-args)))
2204
2205 ;;; Formatting the first line of a definition
2206
2207 ;; @deffn, @defvr, @deftp
2208 (put 'deffn 'texinfo-deffn-formatting-property 'texinfo-format-deffn)
2209 (put 'deffnx 'texinfo-deffn-formatting-property 'texinfo-format-deffn)
2210 (put 'defvr 'texinfo-deffn-formatting-property 'texinfo-format-deffn)
2211 (put 'defvrx 'texinfo-deffn-formatting-property 'texinfo-format-deffn)
2212 (put 'deftp 'texinfo-deffn-formatting-property 'texinfo-format-deffn)
2213 (put 'deftpx 'texinfo-deffn-formatting-property 'texinfo-format-deffn)
2214 (defun texinfo-format-deffn (parsed-args)
2215 ;; Generalized function-like, variable-like, or generic data-type entity:
2216 ;; @deffn category name args...
2217 ;; In Info, `Category: name ARGS'
2218 ;; @deftp category name attributes...
2219 ;; `category name attributes...' Note: @deftp args in lower case.
2220 (let ((category (car parsed-args))
2221 (name (car (cdr parsed-args)))
2222 (args (cdr (cdr parsed-args))))
2223 (insert " -- " category ": " name)
2224 (while args
2225 (insert " "
2226 (if (or (= ?& (aref (car args) 0))
2227 (eq (eval (car command-type)) 'deftp-type))
2228 (car args)
2229 (upcase (car args))))
2230 (setq args (cdr args)))))
2231
2232 ;; @defun, @defmac, @defspec, @defvar, @defopt: Specialized, simple
2233 (put 'defun 'texinfo-deffn-formatting-property
2234 'texinfo-format-specialized-defun)
2235 (put 'defunx 'texinfo-deffn-formatting-property
2236 'texinfo-format-specialized-defun)
2237 (put 'defmac 'texinfo-deffn-formatting-property
2238 'texinfo-format-specialized-defun)
2239 (put 'defmacx 'texinfo-deffn-formatting-property
2240 'texinfo-format-specialized-defun)
2241 (put 'defspec 'texinfo-deffn-formatting-property
2242 'texinfo-format-specialized-defun)
2243 (put 'defspecx 'texinfo-deffn-formatting-property
2244 'texinfo-format-specialized-defun)
2245 (put 'defvar 'texinfo-deffn-formatting-property
2246 'texinfo-format-specialized-defun)
2247 (put 'defvarx 'texinfo-deffn-formatting-property
2248 'texinfo-format-specialized-defun)
2249 (put 'defopt 'texinfo-deffn-formatting-property
2250 'texinfo-format-specialized-defun)
2251 (put 'defoptx 'texinfo-deffn-formatting-property
2252 'texinfo-format-specialized-defun)
2253 (defun texinfo-format-specialized-defun (parsed-args)
2254 ;; Specialized function-like or variable-like entity:
2255 ;; @defun name args In Info, `Function: Name ARGS'
2256 ;; @defmac name args In Info, `Macro: Name ARGS'
2257 ;; @defvar name In Info, `Variable: Name'
2258 ;; Use cdr of command-type to determine category:
2259 (let ((category (car (cdr command-type)))
2260 (name (car parsed-args))
2261 (args (cdr parsed-args)))
2262 (insert " -- " category ": " name)
2263 (while args
2264 (insert " "
2265 (if (= ?& (aref (car args) 0))
2266 (car args)
2267 (upcase (car args))))
2268 (setq args (cdr args)))))
2269
2270 ;; @deftypefn, @deftypevr: Generalized typed
2271 (put 'deftypefn 'texinfo-deffn-formatting-property 'texinfo-format-deftypefn)
2272 (put 'deftypefnx 'texinfo-deffn-formatting-property 'texinfo-format-deftypefn)
2273 (put 'deftypevr 'texinfo-deffn-formatting-property 'texinfo-format-deftypefn)
2274 (put 'deftypevrx 'texinfo-deffn-formatting-property 'texinfo-format-deftypefn)
2275 (defun texinfo-format-deftypefn (parsed-args)
2276 ;; Generalized typed-function-like or typed-variable-like entity:
2277 ;; @deftypefn category data-type name args...
2278 ;; In Info, `Category: data-type name args...'
2279 ;; @deftypevr category data-type name
2280 ;; In Info, `Category: data-type name'
2281 ;; Note: args in lower case, unless modified in command line.
2282 (let ((category (car parsed-args))
2283 (data-type (car (cdr parsed-args)))
2284 (name (car (cdr (cdr parsed-args))))
2285 (args (cdr (cdr (cdr parsed-args)))))
2286 (insert " -- " category ": " data-type " " name)
2287 (while args
2288 (insert " " (car args))
2289 (setq args (cdr args)))))
2290
2291 ;; @deftypefun, @deftypevar: Specialized typed
2292 (put 'deftypefun 'texinfo-deffn-formatting-property 'texinfo-format-deftypefun)
2293 (put 'deftypefunx 'texinfo-deffn-formatting-property
2294 'texinfo-format-deftypefun)
2295 (put 'deftypevar 'texinfo-deffn-formatting-property 'texinfo-format-deftypefun)
2296 (put 'deftypevarx 'texinfo-deffn-formatting-property
2297 'texinfo-format-deftypefun)
2298 (defun texinfo-format-deftypefun (parsed-args)
2299 ;; Specialized typed-function-like or typed-variable-like entity:
2300 ;; @deftypefun data-type name args...
2301 ;; In Info, `Function: data-type name ARGS'
2302 ;; @deftypevar data-type name
2303 ;; In Info, `Variable: data-type name'
2304 ;; Note: args in lower case, unless modified in command line.
2305 ;; Use cdr of command-type to determine category:
2306 (let ((category (car (cdr command-type)))
2307 (data-type (car parsed-args))
2308 (name (car (cdr parsed-args)))
2309 (args (cdr (cdr parsed-args))))
2310 (insert " -- " category ": " data-type " " name)
2311 (while args
2312 (insert " " (car args))
2313 (setq args (cdr args)))))
2314
2315 ;; @defop: Generalized object-oriented
2316 (put 'defop 'texinfo-deffn-formatting-property 'texinfo-format-defop)
2317 (put 'defopx 'texinfo-deffn-formatting-property 'texinfo-format-defop)
2318 (defun texinfo-format-defop (parsed-args)
2319 ;; Generalized object oriented entity:
2320 ;; @defop category class name args...
2321 ;; In Info, `Category on class: name ARG'
2322 ;; Note: args in upper case; use of `on'
2323 (let ((category (car parsed-args))
2324 (class (car (cdr parsed-args)))
2325 (name (car (cdr (cdr parsed-args))))
2326 (args (cdr (cdr (cdr parsed-args)))))
2327 (insert " -- " category " on " class ": " name)
2328 (while args
2329 (insert " " (upcase (car args)))
2330 (setq args (cdr args)))))
2331
2332 ;; @defcv: Generalized object-oriented
2333 (put 'defcv 'texinfo-deffn-formatting-property 'texinfo-format-defcv)
2334 (put 'defcvx 'texinfo-deffn-formatting-property 'texinfo-format-defcv)
2335 (defun texinfo-format-defcv (parsed-args)
2336 ;; Generalized object oriented entity:
2337 ;; @defcv category class name
2338 ;; In Info, `Category of class: name'
2339 ;; Note: args in upper case; use of `of'
2340 (let ((category (car parsed-args))
2341 (class (car (cdr parsed-args)))
2342 (name (car (cdr (cdr parsed-args))))
2343 (args (cdr (cdr (cdr parsed-args)))))
2344 (insert " -- " category " of " class ": " name)
2345 (while args
2346 (insert " " (upcase (car args)))
2347 (setq args (cdr args)))))
2348
2349 ;; @defmethod: Specialized object-oriented
2350 (put 'defmethod 'texinfo-deffn-formatting-property 'texinfo-format-defmethod)
2351 (put 'defmethodx 'texinfo-deffn-formatting-property 'texinfo-format-defmethod)
2352 (defun texinfo-format-defmethod (parsed-args)
2353 ;; Specialized object oriented entity:
2354 ;; @defmethod class name args...
2355 ;; In Info, `Method on class: name ARGS'
2356 ;; Note: args in upper case; use of `on'
2357 ;; Use cdr of command-type to determine category:
2358 (let ((category (car (cdr command-type)))
2359 (class (car parsed-args))
2360 (name (car (cdr parsed-args)))
2361 (args (cdr (cdr parsed-args))))
2362 (insert " -- " category " on " class ": " name)
2363 (while args
2364 (insert " " (upcase (car args)))
2365 (setq args (cdr args)))))
2366
2367 ;; @defivar: Specialized object-oriented
2368 (put 'defivar 'texinfo-deffn-formatting-property 'texinfo-format-defivar)
2369 (put 'defivarx 'texinfo-deffn-formatting-property 'texinfo-format-defivar)
2370 (defun texinfo-format-defivar (parsed-args)
2371 ;; Specialized object oriented entity:
2372 ;; @defivar class name
2373 ;; In Info, `Instance variable of class: name'
2374 ;; Note: args in upper case; use of `of'
2375 ;; Use cdr of command-type to determine category:
2376 (let ((category (car (cdr command-type)))
2377 (class (car parsed-args))
2378 (name (car (cdr parsed-args)))
2379 (args (cdr (cdr parsed-args))))
2380 (insert " -- " category " of " class ": " name)
2381 (while args
2382 (insert " " (upcase (car args)))
2383 (setq args (cdr args)))))
2384
2385
2386 ;;; Indexing for definitions
2387
2388 ;; An index entry has three parts: the `entry proper', the node name, and the
2389 ;; line number. Depending on the which command is used, the entry is
2390 ;; formatted differently:
2391 ;;
2392 ;; @defun,
2393 ;; @defmac,
2394 ;; @defspec,
2395 ;; @defvar,
2396 ;; @defopt all use their 1st argument as the entry-proper
2397 ;;
2398 ;; @deffn,
2399 ;; @defvr,
2400 ;; @deftp
2401 ;; @deftypefun
2402 ;; @deftypevar all use their 2nd argument as the entry-proper
2403 ;;
2404 ;; @deftypefn,
2405 ;; @deftypevr both use their 3rd argument as the entry-proper
2406 ;;
2407 ;; @defmethod uses its 2nd and 1st arguments as an entry-proper
2408 ;; formatted: NAME on CLASS
2409
2410 ;; @defop uses its 3rd and 2nd arguments as an entry-proper
2411 ;; formatted: NAME on CLASS
2412 ;;
2413 ;; @defivar uses its 2nd and 1st arguments as an entry-proper
2414 ;; formatted: NAME of CLASS
2415 ;;
2416 ;; @defcv uses its 3rd and 2nd argument as an entry-proper
2417 ;; formatted: NAME of CLASS
2418
2419 (put 'defun 'texinfo-defun-indexing-property 'texinfo-index-defun)
2420 (put 'defunx 'texinfo-defun-indexing-property 'texinfo-index-defun)
2421 (put 'defmac 'texinfo-defun-indexing-property 'texinfo-index-defun)
2422 (put 'defmacx 'texinfo-defun-indexing-property 'texinfo-index-defun)
2423 (put 'defspec 'texinfo-defun-indexing-property 'texinfo-index-defun)
2424 (put 'defspecx 'texinfo-defun-indexing-property 'texinfo-index-defun)
2425 (put 'defvar 'texinfo-defun-indexing-property 'texinfo-index-defun)
2426 (put 'defvarx 'texinfo-defun-indexing-property 'texinfo-index-defun)
2427 (put 'defopt 'texinfo-defun-indexing-property 'texinfo-index-defun)
2428 (put 'defoptx 'texinfo-defun-indexing-property 'texinfo-index-defun)
2429 (defun texinfo-index-defun (parsed-args)
2430 ;; use 1st parsed-arg as entry-proper
2431 ;; `index-list' will be texinfo-findex or the like
2432 (let ((index-list (get texinfo-command-name 'texinfo-defun-index)))
2433 (set index-list
2434 (cons
2435 ;; Three elements: entry-proper, node-name, line-number
2436 (list
2437 (car parsed-args)
2438 texinfo-last-node
2439 ;; Region formatting may not provide last node position.
2440 (if texinfo-last-node-pos
2441 (1+ (count-lines texinfo-last-node-pos (point)))
2442 1))
2443 (symbol-value index-list)))))
2444
2445 (put 'deffn 'texinfo-defun-indexing-property 'texinfo-index-deffn)
2446 (put 'deffnx 'texinfo-defun-indexing-property 'texinfo-index-deffn)
2447 (put 'defvr 'texinfo-defun-indexing-property 'texinfo-index-deffn)
2448 (put 'defvrx 'texinfo-defun-indexing-property 'texinfo-index-deffn)
2449 (put 'deftp 'texinfo-defun-indexing-property 'texinfo-index-deffn)
2450 (put 'deftpx 'texinfo-defun-indexing-property 'texinfo-index-deffn)
2451 (put 'deftypefun 'texinfo-defun-indexing-property 'texinfo-index-deffn)
2452 (put 'deftypefunx 'texinfo-defun-indexing-property 'texinfo-index-deffn)
2453 (put 'deftypevar 'texinfo-defun-indexing-property 'texinfo-index-deffn)
2454 (put 'deftypevarx 'texinfo-defun-indexing-property 'texinfo-index-deffn)
2455 (defun texinfo-index-deffn (parsed-args)
2456 ;; use 2nd parsed-arg as entry-proper
2457 ;; `index-list' will be texinfo-findex or the like
2458 (let ((index-list (get texinfo-command-name 'texinfo-defun-index)))
2459 (set index-list
2460 (cons
2461 ;; Three elements: entry-proper, node-name, line-number
2462 (list
2463 (car (cdr parsed-args))
2464 texinfo-last-node
2465 ;; Region formatting may not provide last node position.
2466 (if texinfo-last-node-pos
2467 (1+ (count-lines texinfo-last-node-pos (point)))
2468 1))
2469 (symbol-value index-list)))))
2470
2471 (put 'deftypefn 'texinfo-defun-indexing-property 'texinfo-index-deftypefn)
2472 (put 'deftypefnx 'texinfo-defun-indexing-property 'texinfo-index-deftypefn)
2473 (put 'deftypevr 'texinfo-defun-indexing-property 'texinfo-index-deftypefn)
2474 (put 'deftypevrx 'texinfo-defun-indexing-property 'texinfo-index-deftypefn)
2475 (defun texinfo-index-deftypefn (parsed-args)
2476 ;; use 3rd parsed-arg as entry-proper
2477 ;; `index-list' will be texinfo-findex or the like
2478 (let ((index-list (get texinfo-command-name 'texinfo-defun-index)))
2479 (set index-list
2480 (cons
2481 ;; Three elements: entry-proper, node-name, line-number
2482 (list
2483 (car (cdr (cdr parsed-args)))
2484 texinfo-last-node
2485 ;; Region formatting may not provide last node position.
2486 (if texinfo-last-node-pos
2487 (1+ (count-lines texinfo-last-node-pos (point)))
2488 1))
2489 (symbol-value index-list)))))
2490
2491 (put 'defmethod 'texinfo-defun-indexing-property 'texinfo-index-defmethod)
2492 (put 'defmethodx 'texinfo-defun-indexing-property 'texinfo-index-defmethod)
2493 (defun texinfo-index-defmethod (parsed-args)
2494 ;; use 2nd on 1st parsed-arg as entry-proper
2495 ;; `index-list' will be texinfo-findex or the like
2496 (let ((index-list (get texinfo-command-name 'texinfo-defun-index)))
2497 (set index-list
2498 (cons
2499 ;; Three elements: entry-proper, node-name, line-number
2500 (list
2501 (format "%s on %s"
2502 (car (cdr parsed-args))
2503 (car parsed-args))
2504 texinfo-last-node
2505 ;; Region formatting may not provide last node position.
2506 (if texinfo-last-node-pos
2507 (1+ (count-lines texinfo-last-node-pos (point)))
2508 1))
2509 (symbol-value index-list)))))
2510
2511 (put 'defop 'texinfo-defun-indexing-property 'texinfo-index-defop)
2512 (put 'defopx 'texinfo-defun-indexing-property 'texinfo-index-defop)
2513 (defun texinfo-index-defop (parsed-args)
2514 ;; use 3rd on 2nd parsed-arg as entry-proper
2515 ;; `index-list' will be texinfo-findex or the like
2516 (let ((index-list (get texinfo-command-name 'texinfo-defun-index)))
2517 (set index-list
2518 (cons
2519 ;; Three elements: entry-proper, node-name, line-number
2520 (list
2521 (format "%s on %s"
2522 (car (cdr (cdr parsed-args)))
2523 (car (cdr parsed-args)))
2524 texinfo-last-node
2525 ;; Region formatting may not provide last node position.
2526 (if texinfo-last-node-pos
2527 (1+ (count-lines texinfo-last-node-pos (point)))
2528 1))
2529 (symbol-value index-list)))))
2530
2531 (put 'defivar 'texinfo-defun-indexing-property 'texinfo-index-defivar)
2532 (put 'defivarx 'texinfo-defun-indexing-property 'texinfo-index-defivar)
2533 (defun texinfo-index-defivar (parsed-args)
2534 ;; use 2nd of 1st parsed-arg as entry-proper
2535 ;; `index-list' will be texinfo-findex or the like
2536 (let ((index-list (get texinfo-command-name 'texinfo-defun-index)))
2537 (set index-list
2538 (cons
2539 ;; Three elements: entry-proper, node-name, line-number
2540 (list
2541 (format "%s of %s"
2542 (car (cdr parsed-args))
2543 (car parsed-args))
2544 texinfo-last-node
2545 ;; Region formatting may not provide last node position.
2546 (if texinfo-last-node-pos
2547 (1+ (count-lines texinfo-last-node-pos (point)))
2548 1))
2549 (symbol-value index-list)))))
2550
2551 (put 'defcv 'texinfo-defun-indexing-property 'texinfo-index-defcv)
2552 (put 'defcvx 'texinfo-defun-indexing-property 'texinfo-index-defcv)
2553 (defun texinfo-index-defcv (parsed-args)
2554 ;; use 3rd of 2nd parsed-arg as entry-proper
2555 ;; `index-list' will be texinfo-findex or the like
2556 (let ((index-list (get texinfo-command-name 'texinfo-defun-index)))
2557 (set index-list
2558 (cons
2559 ;; Three elements: entry-proper, node-name, line-number
2560 (list
2561 (format "%s of %s"
2562 (car (cdr (cdr parsed-args)))
2563 (car (cdr parsed-args)))
2564 texinfo-last-node
2565 ;; Region formatting may not provide last node position.
2566 (if texinfo-last-node-pos
2567 (1+ (count-lines texinfo-last-node-pos (point)))
2568 1))
2569 (symbol-value index-list)))))
2570
2571
2572 ;;; Properties for definitions
2573
2574 ;; Each definition command has six properties:
2575 ;;
2576 ;; 1. texinfo-deffn-formatting-property to format definition line
2577 ;; 2. texinfo-defun-indexing-property to create index entry
2578 ;; 3. texinfo-format formatting command
2579 ;; 4. texinfo-end end formatting command
2580 ;; 5. texinfo-defun-type type of deffn to format
2581 ;; 6. texinfo-defun-index type of index to use
2582 ;;
2583 ;; The `x' forms of each definition command are used for the second
2584 ;; and subsequent header lines.
2585
2586 ;; The texinfo-deffn-formatting-property and texinfo-defun-indexing-property
2587 ;; are listed just before the appropriate formatting and indexing commands.
1461 2588
1462 (put 'deffn 'texinfo-format 'texinfo-format-defun) 2589 (put 'deffn 'texinfo-format 'texinfo-format-defun)
1463 (put 'deffnx 'texinfo-format 'texinfo-format-defunx) 2590 (put 'deffnx 'texinfo-format 'texinfo-format-defunx)
1464 (put 'deffn 'texinfo-end 'texinfo-end-defun) 2591 (put 'deffn 'texinfo-end 'texinfo-end-defun)
1465 (put 'deffn 'texinfo-defun-type '('deffn-type nil)) 2592 (put 'deffn 'texinfo-defun-type '('deffn-type nil))
1544 (put 'defop 'texinfo-format 'texinfo-format-defun) 2671 (put 'defop 'texinfo-format 'texinfo-format-defun)
1545 (put 'defopx 'texinfo-format 'texinfo-format-defunx) 2672 (put 'defopx 'texinfo-format 'texinfo-format-defunx)
1546 (put 'defop 'texinfo-end 'texinfo-end-defun) 2673 (put 'defop 'texinfo-end 'texinfo-end-defun)
1547 (put 'defop 'texinfo-defun-type '('defop-type nil)) 2674 (put 'defop 'texinfo-defun-type '('defop-type nil))
1548 (put 'defopx 'texinfo-defun-type '('defop-type nil)) 2675 (put 'defopx 'texinfo-defun-type '('defop-type nil))
1549 (put 'defop 'texinfo-defun-format-type 'texinfo-format-defop-type)
1550 (put 'defopx 'texinfo-defun-format-type 'texinfo-format-defop-type)
1551 (put 'defop 'texinfo-defun-index 'texinfo-findex) 2676 (put 'defop 'texinfo-defun-index 'texinfo-findex)
1552 (put 'defopx 'texinfo-defun-index 'texinfo-findex) 2677 (put 'defopx 'texinfo-defun-index 'texinfo-findex)
1553 (put 'defop 'texinfo-defun-format-index 'texinfo-format-defop-index)
1554 (put 'defopx 'texinfo-defun-format-index 'texinfo-format-defop-index)
1555 2678
1556 (put 'defmethod 'texinfo-format 'texinfo-format-defun) 2679 (put 'defmethod 'texinfo-format 'texinfo-format-defun)
1557 (put 'defmethodx 'texinfo-format 'texinfo-format-defunx) 2680 (put 'defmethodx 'texinfo-format 'texinfo-format-defunx)
1558 (put 'defmethod 'texinfo-end 'texinfo-end-defun) 2681 (put 'defmethod 'texinfo-end 'texinfo-end-defun)
1559 (put 'defmethod 'texinfo-defun-type '('defmethod-type "Operation")) 2682 (put 'defmethod 'texinfo-defun-type '('defmethod-type "Method"))
1560 (put 'defmethodx 'texinfo-defun-type '('defmethod-type "Operation")) 2683 (put 'defmethodx 'texinfo-defun-type '('defmethod-type "Method"))
1561 (put 'defmethod 'texinfo-defun-format-type 'texinfo-format-defop-type)
1562 (put 'defmethodx 'texinfo-defun-format-type 'texinfo-format-defop-type)
1563 (put 'defmethod 'texinfo-defun-index 'texinfo-findex) 2684 (put 'defmethod 'texinfo-defun-index 'texinfo-findex)
1564 (put 'defmethodx 'texinfo-defun-index 'texinfo-findex) 2685 (put 'defmethodx 'texinfo-defun-index 'texinfo-findex)
1565 (put 'defmethod 'texinfo-defun-format-index 'texinfo-format-defop-index)
1566 (put 'defmethodx 'texinfo-defun-format-index 'texinfo-format-defop-index)
1567 2686
1568 (put 'defcv 'texinfo-format 'texinfo-format-defun) 2687 (put 'defcv 'texinfo-format 'texinfo-format-defun)
1569 (put 'defcvx 'texinfo-format 'texinfo-format-defunx) 2688 (put 'defcvx 'texinfo-format 'texinfo-format-defunx)
1570 (put 'defcv 'texinfo-end 'texinfo-end-defun) 2689 (put 'defcv 'texinfo-end 'texinfo-end-defun)
1571 (put 'defcv 'texinfo-defun-type '('defop-type nil)) 2690 (put 'defcv 'texinfo-defun-type '('defop-type nil))
1572 (put 'defcvx 'texinfo-defun-type '('defop-type nil)) 2691 (put 'defcvx 'texinfo-defun-type '('defop-type nil))
1573 (put 'defcv 'texinfo-defun-format-type 'texinfo-format-defcv-type)
1574 (put 'defcvx 'texinfo-defun-format-type 'texinfo-format-defcv-type)
1575 (put 'defcv 'texinfo-defun-index 'texinfo-vindex) 2692 (put 'defcv 'texinfo-defun-index 'texinfo-vindex)
1576 (put 'defcvx 'texinfo-defun-index 'texinfo-vindex) 2693 (put 'defcvx 'texinfo-defun-index 'texinfo-vindex)
1577 (put 'defcv 'texinfo-defun-format-index 'texinfo-format-defcv-index)
1578 (put 'defcvx 'texinfo-defun-format-index 'texinfo-format-defcv-index)
1579 2694
1580 (put 'defivar 'texinfo-format 'texinfo-format-defun) 2695 (put 'defivar 'texinfo-format 'texinfo-format-defun)
1581 (put 'defivarx 'texinfo-format 'texinfo-format-defunx) 2696 (put 'defivarx 'texinfo-format 'texinfo-format-defunx)
1582 (put 'defivar 'texinfo-end 'texinfo-end-defun) 2697 (put 'defivar 'texinfo-end 'texinfo-end-defun)
1583 (put 'defivar 'texinfo-defun-type '('defmethod-type "Instance variable")) 2698 (put 'defivar 'texinfo-defun-type '('defmethod-type "Instance variable"))
1584 (put 'defivarx 'texinfo-defun-type '('defmethod-type "Instance variable")) 2699 (put 'defivarx 'texinfo-defun-type '('defmethod-type "Instance variable"))
1585 (put 'defivar 'texinfo-defun-format-type 'texinfo-format-defcv-type)
1586 (put 'defivarx 'texinfo-defun-format-type 'texinfo-format-defcv-type)
1587 (put 'defivar 'texinfo-defun-index 'texinfo-vindex) 2700 (put 'defivar 'texinfo-defun-index 'texinfo-vindex)
1588 (put 'defivarx 'texinfo-defun-index 'texinfo-vindex) 2701 (put 'defivarx 'texinfo-defun-index 'texinfo-vindex)
1589 (put 'defivar 'texinfo-defun-format-index 'texinfo-format-defcv-index)
1590 (put 'defivarx 'texinfo-defun-format-index 'texinfo-format-defcv-index)
1591 2702
1592 ;;; Typed functions and variables 2703 ;;; Typed functions and variables
1593
1594 (defun texinfo-format-deftypefn-type (classification data-type)
1595 (format "%s" classification data-type))
1596
1597 (defun texinfo-format-deftypefn-index (name data-type)
1598 (format "%s of type %s" name data-type))
1599
1600 2704
1601 (put 'deftypefn 'texinfo-format 'texinfo-format-defun) 2705 (put 'deftypefn 'texinfo-format 'texinfo-format-defun)
1602 (put 'deftypefnx 'texinfo-format 'texinfo-format-defunx) 2706 (put 'deftypefnx 'texinfo-format 'texinfo-format-defunx)
1603 (put 'deftypefn 'texinfo-end 'texinfo-end-defun) 2707 (put 'deftypefn 'texinfo-end 'texinfo-end-defun)
1604 (put 'deftypefn 'texinfo-defun-type '('deftypefn-type nil)) 2708 (put 'deftypefn 'texinfo-defun-type '('deftypefn-type nil))
1605 (put 'deftypefnx 'texinfo-defun-type '('deftypefn-type nil)) 2709 (put 'deftypefnx 'texinfo-defun-type '('deftypefn-type nil))
1606 (put 'deftypefn 'texinfo-defun-format-type 'texinfo-format-deftypefn-type)
1607 (put 'deftypefnx 'texinfo-defun-format-type 'texinfo-format-deftypefn-type)
1608 (put 'deftypefn 'texinfo-defun-index 'texinfo-findex) 2710 (put 'deftypefn 'texinfo-defun-index 'texinfo-findex)
1609 (put 'deftypefnx 'texinfo-defun-index 'texinfo-findex) 2711 (put 'deftypefnx 'texinfo-defun-index 'texinfo-findex)
1610 (put 'deftypefn 'texinfo-defun-format-index 'texinfo-format-deftypefn-index)
1611 (put 'deftypefnx 'texinfo-defun-format-index 'texinfo-format-deftypefn-index)
1612 2712
1613 (put 'deftypefun 'texinfo-format 'texinfo-format-defun) 2713 (put 'deftypefun 'texinfo-format 'texinfo-format-defun)
1614 (put 'deftypefunx 'texinfo-format 'texinfo-format-defunx) 2714 (put 'deftypefunx 'texinfo-format 'texinfo-format-defunx)
1615 (put 'deftypefun 'texinfo-end 'texinfo-end-defun) 2715 (put 'deftypefun 'texinfo-end 'texinfo-end-defun)
1616 (put 'deftypefun 'texinfo-defun-type '('deftypefun-type "Function")) 2716 (put 'deftypefun 'texinfo-defun-type '('deftypefun-type "Function"))
1617 (put 'deftypefunx 'texinfo-defun-type '('deftypefun-type "Function")) 2717 (put 'deftypefunx 'texinfo-defun-type '('deftypefun-type "Function"))
1618 (put 'deftypefun 'texinfo-defun-format-type 'texinfo-format-deftypefn-type)
1619 (put 'deftypefunx 'texinfo-defun-format-type 'texinfo-format-deftypefn-type)
1620 (put 'deftypefun 'texinfo-defun-index 'texinfo-findex) 2718 (put 'deftypefun 'texinfo-defun-index 'texinfo-findex)
1621 (put 'deftypefunx 'texinfo-defun-index 'texinfo-findex) 2719 (put 'deftypefunx 'texinfo-defun-index 'texinfo-findex)
1622 (put 'deftypefun 'texinfo-defun-format-index 'texinfo-format-deftypefn-index)
1623 (put 'deftypefunx 'texinfo-defun-format-index 'texinfo-format-deftypefn-index)
1624 2720
1625 (put 'deftypevr 'texinfo-format 'texinfo-format-defun) 2721 (put 'deftypevr 'texinfo-format 'texinfo-format-defun)
1626 (put 'deftypevrx 'texinfo-format 'texinfo-format-defunx) 2722 (put 'deftypevrx 'texinfo-format 'texinfo-format-defunx)
1627 (put 'deftypevr 'texinfo-end 'texinfo-end-defun) 2723 (put 'deftypevr 'texinfo-end 'texinfo-end-defun)
1628 (put 'deftypevr 'texinfo-defun-type '('deftypefn-type nil)) 2724 (put 'deftypevr 'texinfo-defun-type '('deftypefn-type nil))
1629 (put 'deftypevrx 'texinfo-defun-type '('deftypefn-type nil)) 2725 (put 'deftypevrx 'texinfo-defun-type '('deftypefn-type nil))
1630 (put 'deftypevr 'texinfo-defun-format-type 'texinfo-format-deftypefn-type)
1631 (put 'deftypevrx 'texinfo-defun-format-type 'texinfo-format-deftypefn-type)
1632 (put 'deftypevr 'texinfo-defun-index 'texinfo-vindex) 2726 (put 'deftypevr 'texinfo-defun-index 'texinfo-vindex)
1633 (put 'deftypevrx 'texinfo-defun-index 'texinfo-vindex) 2727 (put 'deftypevrx 'texinfo-defun-index 'texinfo-vindex)
1634 (put 'deftypevr 'texinfo-defun-format-index 'texinfo-format-deftypefn-index)
1635 (put 'deftypevrx 'texinfo-defun-format-index 'texinfo-format-deftypefn-index)
1636 2728
1637 (put 'deftypevar 'texinfo-format 'texinfo-format-defun) 2729 (put 'deftypevar 'texinfo-format 'texinfo-format-defun)
1638 (put 'deftypevarx 'texinfo-format 'texinfo-format-defunx) 2730 (put 'deftypevarx 'texinfo-format 'texinfo-format-defunx)
1639 (put 'deftypevar 'texinfo-end 'texinfo-end-defun) 2731 (put 'deftypevar 'texinfo-end 'texinfo-end-defun)
1640 (put 'deftypevar 'texinfo-defun-type '('deftypevar-type "Variable")) 2732 (put 'deftypevar 'texinfo-defun-type '('deftypevar-type "Variable"))
1641 (put 'deftypevarx 'texinfo-defun-type '('deftypevar-type "Variable")) 2733 (put 'deftypevarx 'texinfo-defun-type '('deftypevar-type "Variable"))
1642 (put 'deftypevar 'texinfo-defun-format-type 'texinfo-format-deftypefn-type)
1643 (put 'deftypevarx 'texinfo-defun-format-type 'texinfo-format-deftypefn-type)
1644 (put 'deftypevar 'texinfo-defun-index 'texinfo-vindex) 2734 (put 'deftypevar 'texinfo-defun-index 'texinfo-vindex)
1645 (put 'deftypevarx 'texinfo-defun-index 'texinfo-vindex) 2735 (put 'deftypevarx 'texinfo-defun-index 'texinfo-vindex)
1646 (put 'deftypevar 'texinfo-defun-format-index 'texinfo-format-deftypefn-index) 2736
1647 (put 'deftypevarx 'texinfo-defun-format-index 'texinfo-format-deftypefn-index) 2737
1648 2738 ;;; @set, @clear, @ifset, @ifclear
1649 2739
1650 ;; process included files: `@include' command 2740 ;; If a flag is set with @set FLAG, then text between @ifset and @end
2741 ;; ifset is formatted normally, but if the flag is is cleared with
2742 ;; @clear FLAG, then the text is not formatted; it is ignored.
2743
2744 ;; If a flag is cleared with @clear FLAG, then text between @ifclear
2745 ;; and @end ifclear is formatted normally, but if the flag is is set with
2746 ;; @set FLAG, then the text is not formatted; it is ignored. @ifclear
2747 ;; is the opposite of @ifset.
2748
2749 ;; If a flag is set to a string with @set FLAG,
2750 ;; replace @value{FLAG} with the string.
2751 ;; If a flag with a value is cleared,
2752 ;; @value{FLAG} is invalid,
2753 ;; as if there had never been any @set FLAG previously.
2754
2755 (put 'clear 'texinfo-format 'texinfo-clear)
2756 (defun texinfo-clear ()
2757 "Clear the value of the flag."
2758 (let* ((arg (texinfo-parse-arg-discard))
2759 (flag (car (read-from-string arg)))
2760 (value (substring arg (cdr (read-from-string arg)))))
2761 (put flag 'texinfo-whether-setp 'flag-cleared)
2762 (put flag 'texinfo-set-value "")))
2763
2764 (put 'set 'texinfo-format 'texinfo-set)
2765 (defun texinfo-set ()
2766 "Set the value of the flag, optionally to a string.
2767 The command `@set foo This is a string.'
2768 sets flag foo to the value: `This is a string.'
2769 The command `@value{foo}' expands to the value."
2770 (let* ((arg (texinfo-parse-arg-discard))
2771 (flag (car (read-from-string arg)))
2772 (value (substring arg (cdr (read-from-string arg)))))
2773 (put flag 'texinfo-whether-setp 'flag-set)
2774 (put flag 'texinfo-set-value value)))
2775
2776 (put 'value 'texinfo-format 'texinfo-value)
2777 (defun texinfo-value ()
2778 "Insert the string to which the flag is set.
2779 The command `@set foo This is a string.'
2780 sets flag foo to the value: `This is a string.'
2781 The command `@value{foo}' expands to the value."
2782 (let ((arg (texinfo-parse-arg-discard)))
2783 (cond ((and
2784 (eq (get (car (read-from-string arg)) 'texinfo-whether-setp)
2785 'flag-set)
2786 (get (car (read-from-string arg)) 'texinfo-set-value))
2787 (insert (get (car (read-from-string arg)) 'texinfo-set-value)))
2788 ((eq (get (car (read-from-string arg)) 'texinfo-whether-setp)
2789 'flag-cleared)
2790 (insert (format "{No value for \"%s\"}" arg)))
2791 ((eq (get (car (read-from-string arg)) 'texinfo-whether-setp) nil)
2792 (insert (format "{No value for \"%s\"}" arg))))))
2793
2794 (put 'ifset 'texinfo-end 'texinfo-discard-command)
2795 (put 'ifset 'texinfo-format 'texinfo-if-set)
2796 (defun texinfo-if-set ()
2797 "If set, continue formatting; else do not format region up to @end ifset"
2798 (let ((arg (texinfo-parse-arg-discard)))
2799 (cond
2800 ((eq (get (car (read-from-string arg)) 'texinfo-whether-setp)
2801 'flag-set)
2802 ;; Format the text (i.e., do not remove it); do nothing here.
2803 ())
2804 ((eq (get (car (read-from-string arg)) 'texinfo-whether-setp)
2805 'flag-cleared)
2806 ;; Clear region (i.e., cause the text to be ignored).
2807 (delete-region texinfo-command-start
2808 (progn (re-search-forward "@end ifset[ \t]*\n")
2809 (point))))
2810 ((eq (get (car (read-from-string arg)) 'texinfo-whether-setp)
2811 nil)
2812 (error "@ifset flag `%s' is not defined by @set or @clear." arg)))))
2813
2814 (put 'ifclear 'texinfo-end 'texinfo-discard-command)
2815 (put 'ifclear 'texinfo-format 'texinfo-if-clear)
2816 (defun texinfo-if-clear ()
2817 "If clear, continue formatting; if set, do not format up to @end ifset"
2818 (let ((arg (texinfo-parse-arg-discard)))
2819 (cond
2820 ((eq (get (car (read-from-string arg)) 'texinfo-whether-setp)
2821 'flag-set)
2822 ;; Clear region (i.e., cause the text to be ignored).
2823 (delete-region texinfo-command-start
2824 (progn (re-search-forward "@end ifclear[ \t]*\n")
2825 (point))))
2826 ((eq (get (car (read-from-string arg)) 'texinfo-whether-setp)
2827 'flag-cleared)
2828 ;; Format the text (i.e., do not remove it); do nothing here.
2829 ())
2830 ((eq (get (car (read-from-string arg)) 'texinfo-whether-setp)
2831 nil)
2832 (error "@ifclear flag `%s' is not defined by @clear or @set." arg)))))
2833
2834
2835 ;;; Process included files: `@include' command
1651 2836
1652 ;; Updated 19 October 1990 2837 ;; Updated 19 October 1990
1653 ;; In the original version, include files were ignored by Info but 2838 ;; In the original version, include files were ignored by Info but
1654 ;; incorporated in to the printed manual. To make references to the 2839 ;; incorporated in to the printed manual. To make references to the
1655 ;; included file, the Texinfo source file has to refer to the included 2840 ;; included file, the Texinfo source file has to refer to the included
1656 ;; files using the `(filename)nodename' format for referring to other 2841 ;; files using the `(filename)nodename' format for refering to other
1657 ;; Info files. Also, the included files had to be formatted on their 2842 ;; Info files. Also, the included files had to be formatted on their
1658 ;; own. It was just like they were another file. 2843 ;; own. It was just like they were another file.
1659 2844
1660 ;; Currently, include files are inserted into the buffer that is 2845 ;; Currently, include files are inserted into the buffer that is
1661 ;; formatted for Info. If large, the resulting info file is split and 2846 ;; formatted for Info. If large, the resulting info file is split and
1662 ;; tagified. For current include files to work, the master menu must 2847 ;; tagified. For current include files to work, the master menu must
1663 ;; refer to all the nodes, and the highest level nodes in the include 2848 ;; refer to all the nodes, and the highest level nodes in the include
1664 ;; files must have the correct next, prev, and up pointers. 2849 ;; files must have the correct next, prev, and up pointers.
1665 2850
1666 ;; The included file may have an @setfilename and even an @settitle, 2851 ;; The included file may have an @setfilename and even an @settitle,
1667 ;; but not an /input texinfo 2852 ;; but not an `\input texinfo' line.
2853
2854 ;; Updated 24 March 1993
2855 ;; In order for @raisesections and @lowersections to work, included
2856 ;; files must be inserted into the buffer holding the outer file
2857 ;; before other Info formatting takes place. So @include is no longer
2858 ;; is treated like other @-commands.
2859 (put 'include 'texinfo-format 'texinfo-format-noop)
1668 2860
1669 ; Original definition: 2861 ; Original definition:
1670 ; (defun texinfo-format-include () 2862 ; (defun texinfo-format-include ()
1671 ; (let ((filename (texinfo-parse-arg-discard)) 2863 ; (let ((filename (texinfo-parse-arg-discard))
1672 ; (default-directory input-directory) 2864 ; (default-directory input-directory)
1673 ; subindex) 2865 ; subindex)
1674 ; (setq subindex 2866 ; (setq subindex
1675 ; (save-excursion 2867 ; (save-excursion
1676 ; (progn (find-file 2868 ; (progn (find-file
1677 ; (cond ((file-readable-p (concat filename ".texinfo")) 2869 ; (cond ((file-readable-p (concat filename ".texinfo"))
1678 ; (concat filename ".texinfo")) 2870 ; (concat filename ".texinfo"))
1679 ; ((file-readable-p (concat filename ".texi")) 2871 ; ((file-readable-p (concat filename ".texi"))
1680 ; (concat filename ".texi")) 2872 ; (concat filename ".texi"))
1681 ; ((file-readable-p (concat filename ".tex")) 2873 ; ((file-readable-p (concat filename ".tex"))
1682 ; (concat filename ".tex")) 2874 ; (concat filename ".tex"))
1683 ; ((file-readable-p filename) 2875 ; ((file-readable-p filename)
1684 ; filename) 2876 ; filename)
1685 ; (t (error "@include'd file %s not found" 2877 ; (t (error "@include'd file %s not found"
1686 ; filename)))) 2878 ; filename))))
1687 ; (texinfo-format-buffer-1)))) 2879 ; (texinfo-format-buffer-1))))
1688 ; (texinfo-subindex 'texinfo-vindex (car subindex) (nth 1 subindex)) 2880 ; (texinfo-subindex 'texinfo-vindex (car subindex) (nth 1 subindex))
1689 ; (texinfo-subindex 'texinfo-findex (car subindex) (nth 2 subindex)) 2881 ; (texinfo-subindex 'texinfo-findex (car subindex) (nth 2 subindex))
1690 ; (texinfo-subindex 'texinfo-cindex (car subindex) (nth 3 subindex)) 2882 ; (texinfo-subindex 'texinfo-cindex (car subindex) (nth 3 subindex))
1691 ; (texinfo-subindex 'texinfo-pindex (car subindex) (nth 4 subindex)) 2883 ; (texinfo-subindex 'texinfo-pindex (car subindex) (nth 4 subindex))
1692 ; (texinfo-subindex 'texinfo-tindex (car subindex) (nth 5 subindex)) 2884 ; (texinfo-subindex 'texinfo-tindex (car subindex) (nth 5 subindex))
1693 ; (texinfo-subindex 'texinfo-kindex (car subindex) (nth 6 subindex)))) 2885 ; (texinfo-subindex 'texinfo-kindex (car subindex) (nth 6 subindex))))
1694 2886 ;
1695 (defun texinfo-subindex (indexvar file content) 2887 ;(defun texinfo-subindex (indexvar file content)
1696 (set indexvar (cons (list 'recurse file content) 2888 ; (set indexvar (cons (list 'recurse file content)
1697 (symbol-value indexvar)))) 2889 ; (symbol-value indexvar))))
1698 2890
1699 (put 'include 'texinfo-format 'texinfo-format-include) 2891 ; Second definition:
1700 (defun texinfo-format-include () 2892 ; (put 'include 'texinfo-format 'texinfo-format-include)
1701 (let ((filename (concat input-directory 2893 ; (defun texinfo-format-include ()
1702 (texinfo-parse-arg-discard))) 2894 ; (let ((filename (concat input-directory
1703 (default-directory input-directory)) 2895 ; (texinfo-parse-arg-discard)))
1704 (message "Reading: %s" filename) 2896 ; (default-directory input-directory))
1705 (save-excursion 2897 ; (message "Reading: %s" filename)
1706 (insert-file-contents filename))) 2898 ; (save-excursion
1707 (setq last-input-buffer input-buffer) ; to bypass setfilename 2899 ; (save-restriction
1708 ) 2900 ; (narrow-to-region
1709 2901 ; (point)
1710 2902 ; (+ (point) (car (cdr (insert-file-contents filename)))))
1711 2903 ; (goto-char (point-min))
1712 ;; Lots of bolio constructs do nothing in texinfo. 2904 ; (texinfo-append-refill)
1713 2905 ; (texinfo-format-convert (point-min) (point-max))))
1714 (put 'page 'texinfo-format 'texinfo-discard-line-with-args) 2906 ; (setq last-input-buffer input-buffer) ; to bypass setfilename
2907 ; ))
2908
2909
2910 ;;; Numerous commands do nothing in Texinfo
2911
2912 ;; These commands are defined in texinfo.tex for printed output.
2913
2914 (put 'bye 'texinfo-format 'texinfo-discard-line)
1715 (put 'c 'texinfo-format 'texinfo-discard-line-with-args) 2915 (put 'c 'texinfo-format 'texinfo-discard-line-with-args)
1716 (put 'comment 'texinfo-format 'texinfo-discard-line-with-args) 2916 (put 'comment 'texinfo-format 'texinfo-discard-line-with-args)
2917 (put 'contents 'texinfo-format 'texinfo-discard-line-with-args)
2918 (put 'finalout 'texinfo-format 'texinfo-discard-line)
2919 (put 'group 'texinfo-end 'texinfo-discard-line-with-args)
2920 (put 'group 'texinfo-format 'texinfo-discard-line-with-args)
2921 (put 'headings 'texinfo-format 'texinfo-discard-line-with-args)
2922 (put 'hsize 'texinfo-format 'texinfo-discard-line-with-args)
2923 (put 'itemindent 'texinfo-format 'texinfo-discard-line-with-args)
2924 (put 'lispnarrowing 'texinfo-format 'texinfo-discard-line-with-args)
2925 (put 'need 'texinfo-format 'texinfo-discard-line-with-args)
2926 (put 'nopara 'texinfo-format 'texinfo-discard-line-with-args)
2927 (put 'page 'texinfo-format 'texinfo-discard-line-with-args)
2928 (put 'parindent 'texinfo-format 'texinfo-discard-line-with-args)
1717 (put 'setchapternewpage 'texinfo-format 'texinfo-discard-line-with-args) 2929 (put 'setchapternewpage 'texinfo-format 'texinfo-discard-line-with-args)
1718 (put 'contents 'texinfo-format 'texinfo-discard-line-with-args)
1719 (put 'summarycontents 'texinfo-format 'texinfo-discard-line-with-args)
1720 (put 'shortcontents 'texinfo-format 'texinfo-discard-line-with-args)
1721 (put 'nopara 'texinfo-format 'texinfo-discard-line-with-args)
1722 (put 'noindent 'texinfo-format 'texinfo-discard-line-with-args)
1723 (put 'setx 'texinfo-format 'texinfo-discard-line-with-args)
1724 (put 'setq 'texinfo-format 'texinfo-discard-line-with-args) 2930 (put 'setq 'texinfo-format 'texinfo-discard-line-with-args)
1725 (put 'settitle 'texinfo-format 'texinfo-discard-line-with-args) 2931 (put 'settitle 'texinfo-format 'texinfo-discard-line-with-args)
1726 (put 'hsize 'texinfo-format 'texinfo-discard-line-with-args) 2932 (put 'setx 'texinfo-format 'texinfo-discard-line-with-args)
1727 (put 'parindent 'texinfo-format 'texinfo-discard-line-with-args) 2933 (put 'shortcontents 'texinfo-format 'texinfo-discard-line-with-args)
1728 (put 'lispnarrowing 'texinfo-format 'texinfo-discard-line-with-args)
1729 (put 'itemindent 'texinfo-format 'texinfo-discard-line-with-args)
1730 (put 'headings 'texinfo-format 'texinfo-discard-line-with-args)
1731 (put 'group 'texinfo-format 'texinfo-discard-line-with-args)
1732 (put 'group 'texinfo-end 'texinfo-discard-line-with-args)
1733 (put 'need 'texinfo-format 'texinfo-discard-line-with-args)
1734 (put 'bye 'texinfo-format 'texinfo-discard-line)
1735 (put 'smallbook 'texinfo-format 'texinfo-discard-line) 2934 (put 'smallbook 'texinfo-format 'texinfo-discard-line)
1736 2935 (put 'summarycontents 'texinfo-format 'texinfo-discard-line-with-args)
1737 (defun texinfo-discard-line-with-args () 2936
1738 (goto-char texinfo-command-start) 2937
1739 (delete-region (point) (progn (forward-line 1) (point)))) 2938 ;;; Some commands cannot be handled
1740
1741 ;; Sort an index which is in the current buffer between START and END.
1742 ;; Used on VMS, where the `sort' utility is not available.
1743 (defun texinfo-sort-region (start end)
1744 (require 'sort)
1745 (save-restriction
1746 (narrow-to-region start end)
1747 (sort-subr nil 'forward-line 'end-of-line 'texinfo-sort-startkeyfun)))
1748
1749 ;; Subroutine for sorting an index.
1750 ;; At start of a line, return a string to sort the line under.
1751 (defun texinfo-sort-startkeyfun ()
1752 (let ((line
1753 (buffer-substring (point) (save-excursion (end-of-line) (point)))))
1754 ;; Canonicalize whitespace and eliminate funny chars.
1755 (while (string-match "[ \t][ \t]+\\|[^a-z0-9 ]+" line)
1756 (setq line (concat (substring line 0 (match-beginning 0))
1757 " "
1758 (substring line (match-end 0) (length line)))))
1759 line))
1760
1761 ;; Some cannot be handled
1762 2939
1763 (defun texinfo-unsupported () 2940 (defun texinfo-unsupported ()
1764 (error "%s is not handled by texinfo" 2941 (error "%s is not handled by texinfo"
1765 (buffer-substring texinfo-command-start texinfo-command-end))) 2942 (buffer-substring texinfo-command-start texinfo-command-end)))
1766 2943
1767 ;;;###autoload 2944 ;;; Batch formatting
2945
1768 (defun batch-texinfo-format () 2946 (defun batch-texinfo-format ()
1769 "Runs `texinfo-format-buffer' on the files remaining on the command line. 2947 "Runs texinfo-format-buffer on the files remaining on the command line.
1770 Must be used only with -batch, and kills emacs on completion. 2948 Must be used only with -batch, and kills emacs on completion.
1771 Each file will be processed even if an error occurred previously. 2949 Each file will be processed even if an error occurred previously.
1772 For example, invoke 2950 For example, invoke
1773 \"emacs -batch -funcall batch-texinfo-format $docs/ ~/*.texinfo\"." 2951 \"emacs -batch -funcall batch-texinfo-format $docs/ ~/*.texinfo\"."
1774 (if (not noninteractive) 2952 (if (not noninteractive)
1775 (error "batch-texinfo-format may only be used -batch.")) 2953 (error "batch-texinfo-format may only be used -batch."))
1776 (let ((version-control t) 2954 (let ((version-control t)
1777 (auto-save-default nil) 2955 (auto-save-default nil)
1778 (find-file-run-dired nil) 2956 (find-file-run-dired nil)
1779 (kept-old-versions 259259) 2957 (kept-old-versions 259259)
1780 (kept-new-versions 259259)) 2958 (kept-new-versions 259259))
1781 (let ((error 0) 2959 (let ((error 0)
1782 file 2960 file
1783 (files ())) 2961 (files ()))
1784 (while command-line-args-left 2962 (while command-line-args-left
1785 (setq file (expand-file-name (car command-line-args-left))) 2963 (setq file (expand-file-name (car command-line-args-left)))
1786 (cond ((not (file-exists-p file)) 2964 (cond ((not (file-exists-p file))
1787 (message ">> %s does not exist!" file) 2965 (message ">> %s does not exist!" file)
1788 (setq error 1 2966 (setq error 1
1789 command-line-args-left (cdr command-line-args-left))) 2967 command-line-args-left (cdr command-line-args-left)))
1790 ((file-directory-p file) 2968 ((file-directory-p file)
1791 (setq command-line-args-left 2969 (setq command-line-args-left
1792 (nconc (directory-files file) 2970 (nconc (directory-files file)
1793 (cdr command-line-args-left)))) 2971 (cdr command-line-args-left))))
1794 (t 2972 (t
1795 (setq files (cons file files) 2973 (setq files (cons file files)
1796 command-line-args-left (cdr command-line-args-left))))) 2974 command-line-args-left (cdr command-line-args-left)))))
1797 (while files 2975 (while files
1798 (setq file (car files) 2976 (setq file (car files)
1799 files (cdr files)) 2977 files (cdr files))
1800 (condition-case err 2978 (condition-case err
1801 (progn 2979 (progn
1802 (if buffer-file-name (kill-buffer (current-buffer))) 2980 (if buffer-file-name (kill-buffer (current-buffer)))
1803 (find-file file) 2981 (find-file file)
1804 (buffer-disable-undo (current-buffer)) 2982 (buffer-flush-undo (current-buffer))
1805 (set-buffer-modified-p nil) 2983 (set-buffer-modified-p nil)
1806 (texinfo-mode) 2984 (texinfo-mode)
1807 (message "texinfo formatting %s..." file) 2985 (message "texinfo formatting %s..." file)
1808 (texinfo-format-buffer nil) 2986 (texinfo-format-buffer nil)
1809 (if (buffer-modified-p) 2987 (if (buffer-modified-p)
1810 (progn (message "Saving modified %s" (buffer-file-name)) 2988 (progn (message "Saving modified %s" (buffer-file-name))
1811 (save-buffer)))) 2989 (save-buffer))))
1812 (error 2990 (error
1813 (message ">> Error: %s" (prin1-to-string err)) 2991 (message ">> Error: %s" (prin1-to-string err))
1814 (message ">> point at") 2992 (message ">> point at")
1815 (let ((s (buffer-substring (point) 2993 (let ((s (buffer-substring (point)
1816 (min (+ (point) 100) 2994 (min (+ (point) 100)
1817 (point-max)))) 2995 (point-max))))
1818 (tem 0)) 2996 (tem 0))
1819 (while (setq tem (string-match "\n+" s tem)) 2997 (while (setq tem (string-match "\n+" s tem))
1820 (setq s (concat (substring s 0 (match-beginning 0)) 2998 (setq s (concat (substring s 0 (match-beginning 0))
1821 "\n>> " 2999 "\n>> "
1822 (substring s (match-end 0))) 3000 (substring s (match-end 0)))
1823 tem (1+ tem))) 3001 tem (1+ tem)))
1824 (message ">> %s" s)) 3002 (message ">> %s" s))
1825 (setq error 1)))) 3003 (setq error 1))))
1826 (kill-emacs error)))) 3004 (kill-emacs error))))
1827 3005
3006
3007 ;;; Place `provide' at end of file.
1828 (provide 'texinfmt) 3008 (provide 'texinfmt)
1829 3009
1830 ;;; texinfmt.el ends here 3010 ;;; texinfmt.el ends here.