浏览代码

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.
Bastien Guerry 16 年之前
父节点
当前提交
57d80846b3
共有 1 个文件被更改,包括 61 次插入19 次删除
  1. 61 19
      lisp/org-export-latex.el

+ 61 - 19
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 "<ol>" :oend "</ol>"
                        :ustart "<ul>" :uend "</ul>"
+                       :dstart "<dl>" :dend "</dl>"
+                       :dtstart "<dt>" :dtend "</dt>"
+                       :ddstart "<dd>" :ddend "</dd>"
                        :istart "<li>" :iend "</li>"
                        :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")))