;;;; papers.el -- organize research papers ;;; Time-stamp: <2005-08-02 16:42:47 jcgs> (provide 'papers) ;; a paper is a .tex file in a directory called "papers' ;; it is referred to by its basename and the name of the directory above "papers" (require 'cl) (defvar papers-name-regexp "/\\([^/]+\\)/papers/\\([^\\./]+\\)\\.tex$" "How to recognize a paper. The two marked subpatterns go to make up the name.") (defun papers-find-all (directory &optional list-holder) "Return an alist of all the papers you are writing, in DIRECTORY or below." (unless list-holder (setq list-holder (list 'papers))) (dolist (file (directory-files directory t nil t)) (if (file-directory-p file) (if (not (string-match "/\\.?\\.$" file)) (papers-find-all file list-holder)) (if (string-match papers-name-regexp file) (let* ((name-from-filename (format "%s:%s" (match-string 1 file) (match-string 2 file))) (filebuf (find-buffer-visiting file)) (name (if filebuf (save-excursion (set-buffer filebuf) (save-excursion (goto-char (point-min)) (if (re-search-forward "\\\\title{\\([^}]+\\)}" (point-max) t) (match-string-no-properties 1) name-from-filename))) name-from-filename))) (rplacd list-holder (cons (cons name file) (cdr list-holder))))))) (cdr list-holder)) (defvar papers-list nil "List of your papers.") (defvar papers-directory (substitute-in-file-name "$COMMON/research") "Your papers tree.") ;;;###autoload (defun papers-list (&optional force) "Return a list of your papers." (interactive (list t)) (unless (and papers-list (not force)) (setq papers-list (papers-find-all papers-directory))) (if (interactive-p) (with-output-to-temp-buffer "*Papers*" (let ((item-format (format "%% %ds: %%s\n" (apply 'max (mapcar 'length (mapcar 'car papers-list)))))) (dolist (paper papers-list) (princ (format item-format (car paper) (cdr paper))))))) papers-list) (defun papers-index () "Make an index of your papers." (interactive) (let ((papers (papers-list))) (find-file (expand-file-name "papers.tex" papers-directory)) (erase-buffer) (insert "\\documentclass{article}\n") (insert "\\begin{document}\n") (insert "\\begin{itemize}\n") (LaTeX-mode) (while papers (insert " \\item " (caar papers) " (\\texttt{" (cdar papers) "})\n") (setq papers (cdr papers))) (insert "\\end{itemize}\n") (insert "\\end{document}\n") (basic-save-buffer))) ;;;###autoload (defun find-paper (paper) "Find PAPER." (interactive (list (let ((completion-ignore-case t)) (completing-read "Paper: " (papers-list))))) (find-file (cdr (assoc paper (papers-list))))) ;;; end of papers.el