(defun dot () (point))

(defvar latex-italics-toggle nil "*latex-mode italics toggle")
(defvar latex-quotes-toggle nil "*latex-mode quotes toggle")
(defvar latex-bold-toggle nil "*latex-mode bold toggle")
(defvar latex-ref-toggle nil "*latex-mode ref toggle")
(defvar latex-subscript-toggle nil "*latex-mode subscript toggle")
(defvar latex-alltt-toggle nil "*latex-mode alltt toggle")
(defvar in-latex-list-toggle nil "*latex-mode in-list-mode toggle")
(defvar in-latex-enum-toggle nil "*latex-mode in-enum-mode toggle")
(defvar enuming nil "*latex-mode: Are we enuming or listing?")

(defun insert-latex-header () (interactive)
  (insert-file "~/tex/lib/in-art11")
  (next-line 2)
  (open-line 1)
)

(defun 
    begin/end-latex-italics () (interactive)
	(if (toggle-var 'latex-italics-toggle)
	    (insert-string (concat "{\\it "))
	    (insert-string (concat "}"))
	)
)

(defun 
    begin/end-latex-quotes () (interactive)
	(if (toggle-var 'latex-quotes-toggle)
	    (insert-string "``")
	    (insert-string "''")
	)
)

(defun
    begin/end-latex-bold () (interactive)
	(if (toggle-var 'latex-bold-toggle)
	    (insert-string "{\\bf ")
	    (insert-string "}")
	)
)

(defun
    begin/end-latex-ref () (interactive)
	(if (toggle-var 'latex-ref-toggle)
	    (insert-string "{\\cite ")
	    (insert-string "}")
	)
)

;(defun 
;    (begin/end-latex-subscript
;	(if (toggle-var "latex-subscript-toggle")
;	    (insert-string (concat double-backslash "*<"))
;	    (insert-string (concat double-backslash "*>"))
;	)
;    )
;)

(defun
    insert-bullet-item  () (interactive)
	(insert-string
	    (concat (int-to-string enum-item-spacing)
		    "\\item\n\n"
	    )
	)
	(previous-line 1)
)

;(defun 
;    (check-match-of-latex-font-changes
;	(while 1
;	       (if (error-occured
;		       (re-search-forward "\\fB\\|\\fI"))
;		   (progn   
;		       (beginning-of-file)
;		       (error-message "Font changes match OK")
;		   )
;	       )
;	       (search-forward "\\f")
;	       (if (!= (following-char) 'P')
;		   (error-message "Font change mismatch")
;	       )
;	)
;    )
;)

(defvar list-item-spacing 3 "*")
(defvar enum-item-spacing 3 "*")
(defvar list-item (concat "\\item\n") "*")
(defvar enum-item (concat "\\item\n") "*")

(defun set-list-item-spacing (a1)
        (interactive "slist item spacing: ")
	(setq list-item-spacing a1)
	(setq enum-item-spacing list-item-spacing)
	;(setq list-item (concat ".sp ." (int-to-string list-item-spacing) "v\nlist\n"))
	;(setq enum-item (concat ".sp ." (int-to-string enum-item-spacing) "v\nenum\n"))
)

(defun 
    insert-list-item (sp) (interactive "P")
        (if (not (null sp))
	    (set-list-item-spacing sp)
	)
	(insert-string
	    (if enuming
		enum-item
		list-item
	    )
	)
)


(defun 
    Es (sp) (interactive "P")
       (setq enuming t)
       (if (not (null sp))
	   (set-list-item-spacing sp)
       )
       (insert-string
	   (concat "\\BeginEnum{" (int-to-string enum-item-spacing) "}"
		   enum-item
	   )
       )
)
(defun 
    Ee () (interactive)
       (insert-string "\\EndEnum\n")
       (local-unset-key "\^l")
)

(defun 
    Ls (sp) (interactive "P")
       (setq enuming nil)			;i.e., we're listing now
       (if (not (null sp))
	   (set-list-item-spacing sp)
       ) 
       (insert-string
	   (concat ".(l F\n.(L 1\n"
		   list-item
	   )
       )
)
(defun 
    Le () (interactive)
       (insert-string ".)L 1\n.)l F\n")
)

(defun 
    begin/end-latex-list () (interactive)
	(if (toggle-var 'in-latex-list-toggle)
	    (Ls)
	    (Le)
	)
)

(defun 
    begin/end-latex-enum () (interactive)
	(if (toggle-var "in-latex-enum-toggle")
	    (Es)
	    (Ee)
	)
)

(defun
  insert-latex-list-template (sp)
  (interactive "P")
	(setq enuming nil)			;i.e., we`re listing now
	(if (null sp)
	  (insert-latex-list-template-1 "1")
	   (progn
	     (set-list-item-spacing sp)
	     (call-interactively 'insert-latex-list-template-1)
           )
	)
)
(defun
    insert-latex-list-template-1 (af)
    (interactive "sType of list (I, A, 1, a, i): ")
        (if (string= af "") (setq af 1))
	(insert-string 
	    "\\BeginList" af "{0." list-item-spacing "}\n"
	    list-item
	    "\n"
	    "\\EndList\n"
	)
	(previous-line 2)
)

;The following doesnt work currently due to some misunderstanding of and/or
;bug in gosmacs lisp parm passing.
;(defun 
;    (insert-indented-latex-list-template-bogus af
;	(insert-string ".(l F\n")
;	(if prefix-argument-provided
;	    (provide-prefix-argument prefix-argument
;		(insert-latex-list-template af))
;	    (insert-latex-list-template af)
;	)
;	(next-line) (next-line)
;	(insert-string ".)l F\n")
;	(previous-line) (previous-line) (previous-line)
;    )
;)

;(defun
;    (insert-indented-latex-list-template af
;	(setq enuming 0)			;i.e., we`re listing now
;	(if prefix-argument-provided
;	    (progn   
;		(setq af (arg 1 "Type of list (I, A, 1, a, i): "))
;		(if (!= prefix-argument 0)
;		    (set-list-item-spacing prefix-argument)
;		)
;	    )
;	    (setq af "1")
;	)
;	(insert-string)
;	(insert-string ".(l F\n")
;	(insert-string 
;	    ".(L " af "\n"
;	    list-item
;	    "\n"
;	    ".)L " af "\n"
;	)
;	(insert-string ".)l F\n")
;	(previous-line) (previous-line) (previous-line)
;	(local-bind-to-key "insert-list-item" "\^l")
;    )
;)

(defun 
    insert-latex-enum-template () (interactive)
	(setq enuming t)
	(insert-string 
	    "\\BeginEnum" "{0." enum-item-spacing "}\n"
	    enum-item
	    "\n"
	    "\\EndEnum\n"
	)
	(previous-line 2)
)

;(defun 
;    (insert-indented-latex-enum-template af
;	(insert-string ".(l F\n")
;	(insert-latex-enum-template)
;	(next-line) (next-line)
;	(insert-string ".)l F\n")
;	(previous-line) (previous-line) (previous-line)
;    )
;)


(defun 
    insert-latex-alltt-template () (interactive)
	(insert-string
	    "\\begin{alltt}\n"
	    "\n"
	    "\\end{alltt}\n"
	)
	(previous-line 2)
)

(defun 
    insert-latex-section (s)
      (interactive "NSection depth: ")
	(if (= s 1)
	    (insert-string "\\section{}")
	    (if (= s 2)
		(insert-string "\\subsection{}")
		(if (= s 3)
		    (insert-string "\\subsubsection{}")
		    (if (= s 4)
			(insert-string "\\paragraph{}\\medskip")
		        (error "Section depth must be between 1 and 5")
		    )
		)
	    )
	)
	(insert-string "\\indent")
	(backward-char 8)
)

(defun 
    insert-latex-center-template () (interactive)
	(insert-string 
	    "\\begin{center}\n"
	    "\n"
	    "\\end{center}\n"
	)
	(previous-line 2)
)

(defun 
    insert-latex-verbatim-template () (interactive)
	(insert-string 
	    "\\begin{verbatim}\n"
	    "\n"
	    "\\end{verbatim}\n"
	)
	(previous-line 2)
)

(defun
    insert-latex-figure-template () (interactive)
	(insert-string 
	    "\\begin{figure}\n"
	    "\\label{Fig:}\n"
	    "\\ \n"
	    "\\centering\n"
	    "\\scaledpicture HHHin by WWWin (FigXXX scaled SSS)\n"
	    "\caption{}\n"
	    "\\end{figure}\n"
	)
	(previous-line 6)
	(beginning-of-line)
	(end-of-line)
	(backward-char 1)
)

(defun find-latex-sections (buf)
"Put all latex section in current paper into BUF."
  (interactive "BPut latex sections in buffer: ")
  (save-excursion
    (beginning-of-buffer)
    (while (condition-case nil (re-search-forward "^\\\\.*section") (error nil))
      (beginning-of-line)
      (setq p (point))
      (next-line 1)
      (append-to-buffer buf p (dot))
    )
  )
)

(defun my-latex-mode ()
"Much like standard gnu latex mode, but with some new bindings for template
insertion.  See the code in my-LaTeX-mode.el for further details."
    (interactive)
    (read-abbrev-file "~/emacs/lib/text-mode-abbrev-table")
    (latex-mode)
    (abbrev-mode 1)
	(local-set-key "H" 'insert-latex-header)
	(local-set-key "'" 'begin/end-latex-italics)
	(local-set-key "\"" 'begin/end-latex-quotes)
	(local-set-key "_" 'begin/end-latex-bold)
	(local-set-key "[" 'begin/end-latex-ref)
	(local-set-key "i" 'insert-list-item)
	(local-set-key " " 'set-list-item-spacing)
	;(local-set-key "begin/end-latex-list" "\^xL")
	;(local-set-key "begin/end-latex-enum" "\^xE")
	(local-set-key "L" 'insert-latex-list-template)
	(local-set-key "E" 'insert-latex-enum-template)
;	(local-set-key "insert-indented-latex-enum-template" "\^xI")
;	(local-set-key "insert-indented-latex-list-template" "\^xK")
	(local-set-key "A" 'insert-latex-alltt-template)
	(local-set-key "S" 'insert-latex-section)
	(local-set-key "C" 'insert-latex-center-template)
	(local-set-key "V" 'insert-latex-verbatim-template)
	(local-set-key "F" 'insert-latex-figure-template)
;	(Remove-local-binding "\e/")
 	(setq fill-prefix nil)
	(setq fill-column 79)
	(auto-fill-mode 1)
	(setq case-fold-search nil)
	(setq truncate-lines nil)
	(setq mode-name "my-LaTeX")
)