Browse Source

org-e-latex: Allow formal "booktabs" display of tables

* EXPERIMENTAL/org-e-latex.el (org-e-latex-tables-booktabs): New
  variable.
(org-e-latex-table): Use special "booktabs" rules when previous
variable is non-nil or "booktabs=yes" attribute is provided.
Nicolas Goaziou 13 years ago
parent
commit
f4a568f06a
1 changed files with 61 additions and 29 deletions
  1. 61 29
      EXPERIMENTAL/org-e-latex.el

+ 61 - 29
EXPERIMENTAL/org-e-latex.el

@@ -382,6 +382,15 @@ encompasses both."
   :group 'org-export-e-latex
   :type 'boolean)
 
+(defcustom org-e-latex-tables-booktabs nil
+  "When non-nil, display tables in a formal \"booktabs\" style.
+This option assumes that the \"booktabs\" package is properly
+loaded in the header of the document.  This value can be ignored
+locally with \"booktabs=yes\" and \"booktabs=no\" LaTeX
+attributes."
+  :group 'org-export-e-latex
+  :type 'boolean)
+
 (defcustom org-e-latex-table-caption-above t
   "When non-nil, place caption string at the beginning of the table.
 Otherwise, place it near the end."
@@ -1846,41 +1855,64 @@ CONTENTS is nil.  INFO is a plist holding contextual information."
      ;; Case 3: Standard table.
      (t
       (let* ((table-info (org-export-table-format-info raw-table))
-	     (clean-table (org-export-clean-table
-			   raw-table (plist-get table-info :special-column-p)))
-	     (columns-number (length (plist-get table-info :alignment))))
+	     (columns-number (length (plist-get table-info :alignment)))
+	     (longtablep (and attr (string-match "\\<longtable\\>" attr)))
+	     (booktabsp
+	      (or (and attr (string-match "\\<booktabs=\\(yes\\|t\\)\\>" attr))
+		  org-e-latex-tables-booktabs))
+	     ;; CLEAN-TABLE is a table turned into a list, much like
+	     ;; `org-table-to-lisp', with special column and
+	     ;; formatting cookies removed, and cells already
+	     ;; transcoded.
+	     (clean-table
+	      (mapcar
+	       (lambda (row)
+		 (if (string-match org-table-hline-regexp row) 'hline
+		   (mapcar
+		    (lambda (cell)
+		      (org-export-secondary-string
+		       (org-element-parse-secondary-string
+			cell
+			(cdr (assq 'table org-element-string-restrictions)))
+		       'e-latex info))
+		    (org-split-string row "[ \t]*|[ \t]*"))))
+	       (org-split-string
+		(org-export-clean-table
+		 raw-table (plist-get table-info :special-column-p))
+		"\n"))))
+	;; If BOOKTABSP is non-nil, remove any rule at the beginning
+	;; and the end of the table, since booktabs' special rules
+	;; will be inserted instead.
+	(when booktabsp
+	  (when (eq (car clean-table) 'hline)
+	    (setq clean-table (cdr clean-table)))
+	  (when (eq (car (last clean-table)) 'hline)
+	    (setq clean-table (butlast clean-table))))
 	;; Convert ROWS to send them to `orgtbl-to-latex'.  In
 	;; particular, send each cell to
 	;; `org-element-parse-secondary-string' to expand any Org
-	;; object within.  Eventually, flesh the format string out with
-	;; the table.
-	(format (org-e-latex-table--format-string table table-info info)
-		(orgtbl-to-latex
-		 (mapcar
-		  (lambda (row)
-		    (if (string-match org-table-hline-regexp row)
-			'hline
-		      (mapcar
-		       (lambda (cell)
-			 (org-export-secondary-string
-			  (org-element-parse-secondary-string
-			   cell
-			   (cdr (assq 'table org-element-string-restrictions)))
-			  'e-latex info))
-		       (org-split-string row "[ \t]*|[ \t]*"))))
-		  (org-split-string clean-table "\n"))
-		 `(:tstart nil :tend nil
-			   ;; Longtable environment requires specific
-			   ;; header line end.
-			   :hlend ,(and attr
-					(string-match "\\<longtable\\>" attr)
-					(format "\\\\
-\\hline
+	;; object within.  Eventually, flesh the format string out
+	;; with the table.
+	(format
+	 (org-e-latex-table--format-string table table-info info)
+	 (orgtbl-to-latex
+	  clean-table
+	  ;; Parameters passed to `orgtbl-to-latex'.
+	  `(:tstart ,(and booktabsp "\\toprule")
+		    :tend ,(and booktabsp "\\bottomrule")
+		    :hline ,(if booktabsp "\\midrule" "\\hline")
+		    ;; Longtable environment requires specific header
+		    ;; lines end string.
+		    :hlend ,(and longtablep
+				 (format "\\\\
+%s
 \\endhead
-\\hline\\multicolumn{%d}{r}{Continued on next page}\\\\
+%s\\multicolumn{%d}{r}{Continued on next page}\\\\
 \\endfoot
 \\endlastfoot"
-						columns-number))))))))))
+					 (if booktabsp "\\midrule" "\\hline")
+					 (if booktabsp "\\midrule" "\\hline")
+					 columns-number))))))))))
 
 
 ;;;; Target