From 57d80846b312b023670aa3e66e5836d1c054fb29 Mon Sep 17 00:00:00 2001 From: Bastien Guerry Date: Fri, 19 Sep 2008 21:48:47 +0200 Subject: [PATCH] Implement export of descriptive lists. Prevent special chars from being converted when in a LaTeX environment. Fix a bug about conversion of "&" conversion in tables. --- lisp/org-export-latex.el | 80 ++++++++++++++++++++++++++++++---------- 1 file changed, 61 insertions(+), 19 deletions(-) diff --git a/lisp/org-export-latex.el b/lisp/org-export-latex.el index 20ff59872..1cec17ce3 100644 --- a/lisp/org-export-latex.el +++ b/lisp/org-export-latex.el @@ -61,7 +61,7 @@ (defvar org-export-latex-sectioning "") (defvar org-export-latex-sectioning-depth 0) (defvar org-export-latex-list-beginning-re - "^\\([ \t]*\\)\\([-+*]\\|[0-9]+[.)]\\) +?") + "^\\([ \t]*\\)\\([-+*]\\|[0-9]+[.)]\\) +\\(.*\\)$") (defvar org-export-latex-special-string-regexps '(org-ts-regexp @@ -988,7 +988,7 @@ Regexps are those from `org-export-latex-special-string-regexps'." (let* ((tbl (concat "\\begin{verbatim}\n" raw-table "\\end{verbatim}\n"))) (apply 'delete-region (list beg end)) - (insert tbl)) + (insert (org-export-latex-protect-string tbl))) (progn (setq lines (split-string raw-table "\n" t)) (apply 'delete-region (list beg end)) @@ -1035,8 +1035,9 @@ Regexps are those from `org-export-latex-special-string-regexps'." (split-string (org-trim elem) "|" t))) lines)) (when insert - (insert (orgtbl-to-latex - lines `(:tstart ,(concat "\\begin{tabular}{" align "}"))) + (insert (org-export-latex-protect-string + (orgtbl-to-latex + lines `(:tstart ,(concat "\\begin{tabular}{" align "}")))) "\n\n"))))))) (defun org-export-latex-fontify () @@ -1115,6 +1116,15 @@ Regexps are those from `org-export-latex-special-string-regexps'." (add-text-properties (match-beginning 0) (match-end 0) '(org-protected t))) + ;; Preserve latex environments + (goto-char (point-min)) + (while (search-forward "\\begin{" nil t) + (let ((start (progn (beginning-of-line) (point))) + (end (or (and (search-forward "\\end{" nil t) + (end-of-line) (point)) + (point-max)))) + (add-text-properties start end '(org-protected t)))) + ;; Convert LaTeX to \LaTeX{} (goto-char (point-min)) (let ((case-fold-search nil) rpl) @@ -1224,11 +1234,16 @@ Return a list containing first level items as strings and sublevels as a list of strings." (let ((start (org-list-item-begin)) (end (org-list-end)) - output itemsep) + output itemsep ltype) (while (re-search-forward org-export-latex-list-beginning-re end t) - (setq itemsep (if (save-match-data - (string-match "^[0-9]" (match-string 2))) - "[0-9]+\\(?:\\.\\|)\\)" "[-+]")) + (goto-char (match-beginning 3)) + (save-match-data + (cond ((string-match "[0-9]" (match-string 2)) + (setq itemsep "[0-9]+\\(?:\\.\\|)\\)" + ltype 'ordered)) + ((string-match "^.*::" (match-string 0)) + (setq itemsep "[-+]" ltype 'descriptive)) + (t (setq itemsep "[-+]" ltype 'unordered)))) (let* ((indent1 (match-string 1)) (nextitem (save-excursion (save-match-data @@ -1254,8 +1269,7 @@ sublevels as a list of strings." (widen)))) (when delete (delete-region start end)) (setq output (nreverse output)) - (push (if (string-match "^\\[0" itemsep) - 'ordered 'unordered) output))) + (push ltype output))) (defun org-list-item-begin () "Find the beginning of the list item and return its position." @@ -1343,6 +1357,13 @@ Valid parameters are :ostart String to start an ordered list :oend String to end an ordered list +:dstart String to start a descriptive list +:dend String to end a descriptive list +:dtstart String to start a descriptive term +:dtend String to end a descriptive term +:ddstart String to start a description +:ddend String to end a description + :splice When set to t, return only list body lines, don't wrap them into :[u/o]start and :[u/o]end. Default is nil. @@ -1357,6 +1378,12 @@ Valid parameters are (oend (plist-get p :oend)) (ustart (plist-get p :ustart)) (uend (plist-get p :uend)) + (dstart (plist-get p :dstart)) + (dend (plist-get p :dend)) + (dtstart (plist-get p :dtstart)) + (dtend (plist-get p :dtend)) + (ddstart (plist-get p :ddstart)) + (ddend (plist-get p :ddend)) (istart (plist-get p :istart)) (iend (plist-get p :iend)) (isep (plist-get p :isep)) @@ -1365,18 +1392,24 @@ Valid parameters are (cond ((eq (car list) 'ordered) (concat ostart "\n%s" oend "\n")) ((eq (car list) 'unordered) - (concat ustart "\n%s" uend "\n")))) - rtn) + (concat ustart "\n%s" uend "\n")) + ((eq (car list) 'descriptive) + (concat dstart "\n%s" dend "\n")))) + rtn term defstart defend) (while (setq sublist (pop list)) (cond ((symbolp sublist) nil) ((stringp sublist) - (setq rtn (concat rtn istart sublist iend isep))) - (t - (setq rtn (concat rtn ;; previous list - lsep ;; list separator - (org-list-to-generic sublist p) - lsep ;; list separator - ))))) + (when (string-match "^\\(.*\\) ::" sublist) + (setq term (org-trim (format (concat dtstart "%s" dtend) + (match-string 1 sublist)))) + (setq sublist (substring sublist (1+ (length term))))) + (setq rtn (concat rtn istart term ddstart + sublist ddend iend isep))) + (t (setq rtn (concat rtn ;; previous list + lsep ;; list separator + (org-list-to-generic sublist p) + lsep ;; list separator + ))))) (format wrapper rtn)))) (defun org-list-to-latex (list) @@ -1384,6 +1417,9 @@ Valid parameters are (org-list-to-generic list '(:splicep nil :ostart "\\begin{enumerate}" :oend "\\end{enumerate}" :ustart "\\begin{itemize}" :uend "\\end{itemize}" + :dstart "\\begin{description}" :dend "\\end{description}" + :dtstart "[" :dtend "]" + :ddstart "" :ddend "" :istart "\\item " :iend "" :isep "\n" :lsep "\n"))) @@ -1392,6 +1428,9 @@ Valid parameters are (org-list-to-generic list '(:splicep nil :ostart "
    " :oend "
" :ustart "" + :dstart "
" :dend "
" + :dtstart "
" :dtend "
" + :ddstart "
" :ddend "
" :istart "
  • " :iend "
  • " :isep "\n" :lsep "\n"))) @@ -1400,6 +1439,9 @@ Valid parameters are (org-list-to-generic list '(:splicep nil :ostart "@itemize @minus" :oend "@end itemize" :ustart "@enumerate" :uend "@end enumerate" + :dstart "@table" :dend "@end table" + :dtstart "@item " :dtend "\n" + :ddstart "" :ddend "" :istart "@item\n" :iend "" :isep "\n" :lsep "\n")))