diff options
author | Carsten Dominik <carsten.dominik@gmail.com> | 2010-03-28 09:48:03 +0200 |
---|---|---|
committer | Carsten Dominik <carsten.dominik@gmail.com> | 2010-04-01 12:44:01 +0200 |
commit | da556cee82f98ced8ba03abd186d3a8886844db0 (patch) | |
tree | b3943c8751ec388a073522f012986d987410cea6 | |
parent | 31b19b1afcbbb48f38d49b7ac5eb8a0faf3a95b3 (diff) | |
download | org-mode-da556cee82f98ced8ba03abd186d3a8886844db0.tar.gz |
Implement new and better support for entities
-rw-r--r-- | lisp/org-ascii.el | 26 | ||||
-rw-r--r-- | lisp/org-docbook.el | 8 | ||||
-rw-r--r-- | lisp/org-entities.el | 446 | ||||
-rw-r--r-- | lisp/org-exp.el | 309 | ||||
-rw-r--r-- | lisp/org-html.el | 8 | ||||
-rw-r--r-- | lisp/org-latex.el | 66 | ||||
-rw-r--r-- | lisp/org.el | 8 |
7 files changed, 526 insertions, 345 deletions
diff --git a/lisp/org-ascii.el b/lisp/org-ascii.el index 00840fa..8ac5403 100644 --- a/lisp/org-ascii.el +++ b/lisp/org-ascii.el @@ -72,6 +72,21 @@ i.e. with \"=>\" as ellipsis." :group 'org-export-ascii :type 'boolean) +(defcustom org-export-ascii-entities 'ascii + "The ascii representation to be used during ascii export. +Possible values are: + +ascii Only use plain ASCII characters +latin1 Include Latin-1 character +utf8 Use all UTF-8 characters +coding-system Automatically adapt to the coding system of the output file + This setting is not yet implemented." + :group 'org-export-ascii + :type '(choice + (const :tag "Use what the file coding system supports (not yet implemented)" coding-system) + (const :tag "Plain ASCII only" ascii) + (const :tag "Add Latin-1 characters" latin1) + (const :tag "Use utf8 representations" utf8))) ;;; Hooks (defvar org-export-ascii-final-hook nil @@ -504,6 +519,8 @@ publishing directory." (when org-export-ascii-table-widen-columns (let ((org-table-do-narrow nil)) (goto-char (point-min)) + (org-ascii-replace-entities) + (goto-char (point-min)) (org-table-map-tables (lambda () (org-if-unprotected @@ -531,6 +548,15 @@ publishing directory." (setq line (replace-match "" nil nil line)))) line) +(defun org-ascii-replace-entities () + "Replace entities with the ASCII representation." + (let (e) + (while (re-search-forward "\\\\\\([a-zA-Z]+[0-9]*\\)" nil t) + (org-if-unprotected-at (match-beginning 1) + (setq e (org-entity-get-representation (match-string 1 line) + org-export-ascii-entities)) + (and e (replace-match e t t)))))) + (defun org-export-ascii-wrap (line where) "Wrap LINE at or before WHERE." (let ((ind (org-get-indentation line)) diff --git a/lisp/org-docbook.el b/lisp/org-docbook.el index 1449f55..cf4c6f7 100644 --- a/lisp/org-docbook.el +++ b/lisp/org-docbook.el @@ -1259,16 +1259,14 @@ string, don't modify these." (if org-export-with-sub-superscripts (setq s (org-export-docbook-convert-sub-super s))) (if org-export-with-TeX-macros - (let ((start 0) wd ass) + (let ((start 0) wd rep) (while (setq start (string-match "\\\\\\([a-zA-Z]+\\)\\({}\\)?" s start)) (if (get-text-property (match-beginning 0) 'org-protected s) (setq start (match-end 0)) (setq wd (match-string 1 s)) - (if (setq ass (assoc wd org-html-entities)) - (setq s (replace-match (or (cdr ass) - (concat "&" (car ass) ";")) - t t s)) + (if (setq ass (org-entity-get-representation wd 'html)) + (setq s (replace-match rep t t s)) (setq start (+ start (length wd)))))))) s) diff --git a/lisp/org-entities.el b/lisp/org-entities.el new file mode 100644 index 0000000..d9e4d5a --- /dev/null +++ b/lisp/org-entities.el @@ -0,0 +1,446 @@ +;;; org-entities.el --- Support for special entities in Org-mode + +;; Copyright (C) 2010 Free Software Foundation, Inc. + +;; Author: Carsten Dominik <carsten at orgmode dot org>, +;; Ulf Stegemann <ulf at zeitform dot de> +;; Keywords: outlines, calendar, wp +;; Homepage: http://orgmode.org +;; Version: 6.34trans +;; +;; This file is part of GNU Emacs. +;; +;; GNU Emacs is free software: you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. + +;; GNU Emacs is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; +;;; Commentary: + +(eval-when-compile + (require 'cl)) + +(defgroup org-entities nil + "Options concerning entities in Org-mode." + :tag "Org Entities" + :group 'org) + +(defcustom org-entities-ascii-explanatory nil + "Non-nil means replace special entities in ASCII. +For example, this will replace \"\\nsup\" with \"[not a superset of]\" +in backends where the corresponding character is not available." + :group 'org-entities + :type 'boolean) + +(defcustom org-entities-user nil + "User-defined entities used in Org-mode to preduce special characters. +Each entry in this list is a list of strings. It associate the name +of the entity that can be inserted into an Org file as \\name with the +appropriate replacements for the different export backends. The order +of the fields is he following + +name As a string, without the leading backslash +LaTeX replacement In ready LaTeX, no further processing will take place +LaTeX mathp A Boolean, either t or nil. t if this entity needs + to be in math mode. +HTML replacement In ready HTML, no further processing will take place. + Usually this will be an &...; entity. +ASCII replacement Plain ASCII, no extensions. Symbols that cannot be + represented will be written out as an explanatory text. + But see the variable `org-entities-ascii-keep-macro-form'. +Latin1 replacement Use the special characters available in latin1. +utf-8 replacement Use special character available in utf-8." + :group 'org-entities + :type '(repeat + (list + (string :tag "name ") + (string :tag "LaTeX ") + (boolean :tag "Require LaTeX math?") + (string :tag "HTML ") + (string :tag "ASCII ") + (string :tag "Latin1") + (string :tag "utf-8 ")))) + +(defconst org-entities + '(("nbsp" "~" nil " " " " " " " ") + ("iexcl" "!`" nil "¡" "!" "¡" "¡") + ("cent" "\\textcent" nil "¢" "cent" "¢" "¢") + ("pound" "\\pounds" nil "£" "pound" "£" "£") + ("curren" "\\textcurrency" nil "¤" "curr." "¤" "¤") + ("yen" "\\textyen" nil "¥" "yen" "¥" "¥") + ("brvbar" "\\textbrokenbar" nil "¦" "|" "¦" "¦") + ("vert" "\\vert" t "|" "|" "|" "|") + ("sect" "\\S" nil "§" "paragraph" "§" "§") + ("uml" "\\textasciidieresis" nil "¨" "[diaeresis]" "¨" "¨") + ("copy" "\\textcopyright" nil "©" "(c)" "©" "©") + ("ordf" "\\textordfeminine" nil "ª" "_a_" "ª" "ª") + ("laquo" "\\guillemotleft" nil "«" "<<" "«" "«") + ("not" "\\textlnot" nil "¬" "[angled dash]" "¬" "¬") + ("shy" "\\-" nil "­" "" "" "") + ("reg" "\\textregistered" nil "®" "(r)" "®" "®") + ("macr" "\\textasciimacron" nil "¯" "[macron]" "¯" "¯") + ("deg" "\\textdegree" nil "deg" "degree" "°" "°") + ("pm" "\\textpm" nil "±" "+-" "±" "±") + ("plusmn" "\\textpm" nil "±" "+-" "±" "±") + ("sup2" "\\texttwosuperior" nil "²" "^2" "²" "²") + ("sup3" "\\textthreesuperior" nil "³" "^3" "³" "³") + ("acute x" "\\acute x" t "´ x;" "'x" "'x" "𝑥́") + ("micro" "\\textmu" nil "µ" "micro" "µ" "µ") + ("para" "\\P" nil "¶" "[pilcrow]" "¶" "¶") + ("middot" "\\textperiodcentered" nil "·" "." "·" "·") + ("odot" "\\odot" t "o" "[circled dot]" "[circled dot]" "ʘ") + ("star" "\\star" t "*" "*" "*" "⋆") + ("cedil" "\\c" nil "¸" "[cedilla]" "¸" "¸") + ("sup1" "\\textonesuperior" nil "¹" "^1" "¹" "¹") + ("ordm" "\\textordmasculine" nil "º" "_o_" "º" "º") + ("raquo" "\\guillemotright" nil "»" ">>" "»" "»") + ("iquest" "?`" nil "¿" "?" "¿" "¿") + ("Agrave" "\\`{A}" nil "À" "A" "À" "À") + ("Aacute" "\\'{A}" nil "Á" "A" "Á" "Á") + ("Acirc" "\\^{A}" nil "Â" "A" "Â" "Â") + ("Atilde" "\\~{A}" nil "Ã" "A" "Ã" "Ã") + ("Auml" "\\\"{A}" nil "Ä" "Ae" "Ä" "Ä") + ("Aring" "\\AA" nil "Å" "A" "Å" "Å") + ("AA" "\\AA" nil "Å" "A" "Å" "Å") + ("AElig" "\\AE" nil "Æ" "AE" "Æ" "Æ") + ("Ccedil" "\\c{C}" nil "Ç" "C" "Ç" "Ç") + ("Egrave" "\\`{E}" nil "È" "E" "È" "È") + ("Eacute" "\\'{E}" nil "É" "E" "É" "É") + ("Ecirc" "\\^{E}" nil "Ê" "E" "Ê" "Ê") + ("Euml" "\\\"{E}" nil "Ë" "E" "Ë" "Ë") + ("Igrave" "\\`{I}" nil "Ì" "I" "Ì" "Ì") + ("Iacute" "\\'{I}" nil "Í" "I" "Í" "Í") + ("Icirc" "\\^{I}" nil "Î" "I" "Î" "Î") + ("Iuml" "\\\"{I}" nil "Ï" "I" "Ï" "Ï") + ("ETH" "\\DH" nil "Ð" "D" "Ð" "Ð") + ("Ntilde" "\\~{N}" nil "Ñ" "N" "Ñ" "Ñ") + ("Ograve" "\\`{O}" nil "Ò" "O" "Ò" "Ò") + ("Oacute" "\\'{O}" nil "Ó" "O" "Ó" "Ó") + ("Ocirc" "\\^{O}" nil "Ô" "O" "Ô" "Ô") + ("Otilde" "\\~{O}" nil "Õ" "O" "Õ" "Õ") + ("Ouml" "\\\"{O}" nil "Ö" "Oe" "Ö" "Ö") + ("times" "\\texttimes" nil "×" "*" "×" "×") + ("Oslash" "\\O" nil "Ø" "O" "Ø" "Ø") + ("Ugrave" "\\`{U}" nil "Ù" "U" "Ù" "Ù") + ("Uacute" "\\'{U}" nil "Ú" "U" "Ú" "Ú") + ("Ucirc" "\\^{U}" nil "Û" "U" "Û" "Û") + ("Uuml" "\\\"{U}" nil "Ü" "Ue" "Ü" "Ü") + ("Yacute" "\\'{Y}" nil "Ý" "Y" "Ý" "Ý") + ("THORN" "\\TH" nil "Þ" "TH" "Þ" "Þ") + ("szlig" "\\ss" nil "ß" "ss" "ß" "ß") + ("agrave" "\\`{a}" nil "à" "a" "à" "à") + ("aacute" "\\'{a}" nil "á" "a" "á" "á") + ("acirc" "\\^{a}" nil "â" "a" "â" "â") + ("atilde" "\\~{a}" nil "ã" "a" "ã" "ã") + ("auml" "\\\"{a}" nil "ä" "ae" "ä" "ä") + ("aring" "\\aa" nil "å" "a" "å" "å") + ("aelig" "\\ae" nil "æ" "ae" "æ" "æ") + ("ccedil" "\\c{c}" nil "ç" "c" "ç" "ç") + ("checkmark" "\\checkmark" t "✓" "[checkmark]" "[checkmark]" "✓") + ("egrave" "\\`{e}" nil "è" "e" "è" "è") + ("eacute" "\\'{e}" nil "é" "e" "é" "é") + ("ecirc" "\\^{e}" nil "ê" "e" "ê" "ê") + ("euml" "\\\"{e}" nil "ë" "e" "ë" "ë") + ("igrave" "\\`{i}" nil "ì" "i" "ì" "ì") + ("iacute" "\\'{i}" nil "í" "i" "í" "í") + ("icirc" "\\^{i}" nil "î" "i" "î" "î") + ("iuml" "\\\"{i}" nil "ï" "i" "ï" "ï") + ("eth" "\\dh" nil "ð" "dh" "ð" "ð") + ("ntilde" "\\~{n}" nil "ñ" "n" "ñ" "ñ") + ("ograve" "\\`{o}" nil "ò" "o" "ò" "ò") + ("oacute" "\\'{o}" nil "ó" "o" "ó" "ó") + ("ocirc" "\\^{o}" nil "ô" "o" "ô" "ô") + ("otilde" "\\~{o}" nil "õ" "o" "õ" "õ") + ("ouml" "\\\"{o}" nil "ö" "oe" "ö" "ö") + ("oslash" "\\o" nil "ø" "o" "ø" "ø") + ("ugrave" "\\`{u}" nil "ù" "u" "ù" "ù") + ("uacute" "\\'{u}" nil "ú" "u" "ú" "ú") + ("ucirc" "\\^{u}" nil "û" "u" "û" "û") + ("uuml" "\\\"{u}" nil "ü" "ue" "ü" "ü") + ("yacute" "\\'{y}" nil "ý" "y" "ý" "ý") + ("thorn" "\\th" nil "þ" "th" "þ" "þ") + ("yuml" "\\\"{y}" nil "ÿ" "y" "ÿ" "ÿ") + ("fnof" "\\textit{f}" nil "ƒ" "f" "f" "ƒ") + ("Alpha" "A" nil "Α" "Alpha" "Alpha" "Α") + ("Beta" "B" nil "Β" "Beta" "Beta" "Β") + ("Gamma" "\\Gamma" t "Γ" "Gamma" "Gamma" "Γ") + ("Delta" "\\Delta" t "Δ" "Delta" "Gamma" "Δ") + ("Epsilon" "E" nil "Ε" "Epsilon" "Epsilon" "Ε") + ("Zeta" "Z" nil "Ζ" "Zeta" "Zeta" "Ζ") + ("Eta" "H" nil "Η" "Eta" "Eta" "Η") + ("Theta" "\\Theta" t "Θ" "Theta" "Theta" "Θ") + ("Iota" "I" nil "Ι" "Iota" "Iota" "Ι") + ("Kappa" "K" nil "Κ" "Kappa" "Kappa" "Κ") + ("Lambda" "\\Lambda" t "Λ" "Lambda" "Lambda" "Λ") + ("Mu" "M" nil "Μ" "Mu" "Mu" "Μ") + ("Nu" "N" nil "Ν" "Nu" "Nu" "Ν") + ("Xi" "\\Xi" t "Ξ" "Xi" "Xi" "Ξ") + ("Omicron" "O" nil "Ο" "Omicron" "Omicron" "Ο") + ("Pi" "\\Pi" t "Π" "Pi" "Pi" "Π") + ("Rho" "P" nil "Ρ" "Rho" "Rho" "Ρ") + ("Sigma" "\\Sigma" t "Σ" "Sigma" "Sigma" "Σ") + ("Tau" "T" nil "Τ" "Tau" "Tau" "Τ") + ("Upsilon" "\\Upsilon" t "Υ" "Upsilon" "Upsilon" "Υ") + ("Phi" "\\Phi" t "Φ" "Phi" "Phi" "Φ") + ("Chi" "X" nil "Χ" "Chi" "Chi" "Χ") + ("Psi" "\\Psi" t "Ψ" "Psi" "Psi" "Ψ") + ("Omega" "\\Omega" t "Ω" "Omega" "Omega" "Ω") + ("alpha" "\\alpha" t "α" "alpha" "alpha" "α") + ("beta" "\\beta" t "β" "beta" "beta" "β") + ("gamma" "\\gamma" t "γ" "gamma" "gamma" "γ") + ("delta" "\\delta" t "δ" "delta" "delta" "δ") + ("epsilon" "\\epsilon" t "ε" "epsilon" "epsilon" "ε") + ("varepsilon" "\\varepsilon" t "ε" "varepsilon" "varepsilon" "ε") + ("zeta" "\\zeta" t "ζ" "zeta" "zeta" "ζ") + ("eta" "\\eta" t "η" "eta" "eta" "η") + ("theta" "\\theta" t "θ" "theta" "theta" "θ") + ("iota" "\\iota" t "ι" "iota" "iota" "ι") + ("kappa" "\\kappa" t "κ" "kappa" "kappa" "κ") + ("lambda" "\\lambda" t "λ" "lambda" "lambda" "λ") + ("mu" "\\mu" t "μ" "mu" "mu" "μ") + ("nu" "\\nu" t "ν" "nu" "nu" "ν") + ("xi" "\\xi" t "ξ" "xi" "xi" "ξ") + ("omicron" "\\textit{o}" nil "ο" "omicron" "omicron" "ο") + ("pi" "\\pi" t "π" "pi" "pi" "π") + ("rho" "\\rho" t "ρ" "rho" "rho" "ρ") + ("sigmaf" "\\varsigma" t "ς" "sigmaf" "sigmaf" "ς") + ("varsigma" "\\varsigma" t "ς" "varsigma" "varsigma" "ς") + ("sigma" "\\sigma" t "σ" "sigma" "sigma" "σ") + ("tau" "\\tau" t "τ" "tau" "tau" "τ") + ("upsilon" "\\upsilon" t "υ" "upsilon" "upsilon" "υ") + ("phi" "\\phi" t "φ" "phi" "phi" "φ") + ("chi" "\\chi" t "χ" "chi" "chi" "χ") + ("psi" "\\psi" t "ψ" "psi" "psi" "ψ") + ("omega" "\\omega" t "ω" "omega" "omega" "ω") + ("thetasym" "\\vartheta" t "ϑ" "theta" "theta" "ϑ") + ("vartheta" "\\vartheta" t "ϑ" "theta" "theta" "ϑ") + ("upsih" "\\Upsilon" t "ϒ" "upsilon" "upsilon" "ϒ") + ("piv" "\\varpi" t "ϖ" "omega-pi" "omega-pi" "ϖ") + ("bull" "\\textbullet" nil "•" "*" "*" "•") + ("bullet" "\\textbullet" nil "•" "*" "*" "•") + ("hellip" "\\dots" nil "…" "..." "..." "…") + ("dots" "\\dots" nil "…" "..." "..." "…") + ("prime" "\\prime" t "′" "'" "'" "′") + ("Prime" "\\prime{}\\prime" t "″" "''" "''" "″") + ("oline" "\\overline{~}" t "‾" "[overline]" "¯" "‾") + ("frasl" "/" nil "⁄" "/" "/" "⁄") + ("weierp" "\\wp" t "℘" "P" "P" "℘") + ("image" "\\Im" t "ℑ" "I" "I" "ℑ") + ("real" "\\Re" t "ℜ" "R" "R" "ℜ") + ("trade" "\\texttrademark" nil "™" "TM" "TM" "™") + ("alefsym" "\\aleph" t "ℵ" "aleph" "aleph" "ℵ") + ("larr" "\\leftarrow" t "←" "<-" "<-" "←") + ("leftarrow" "\\leftarrow" t "←" "<-" "<-" "←") + ("gets" "\\gets" t "←" "<-" "<-" "←") + ("uarr" "\\uparrow" t "↑" "[uparrow]" "[uparrow]" "↑") + ("uparrow" "\\uparrow" t "↑" "[uparrow]" "[uparrow]" "↑") + ("rarr" "\\rightarrow" t "→" "->" "->" "→") + ("to" "\\to" t "→" "->" "->" "→") + ("rightarrow" "\\rightarrow" t "→" "->" "->" "→") + ("darr" "\\downarrow" t "↓" "[downarrow]" "[downarrow]" "↓") + ("downarrow" "\\downarrow" t "↓" "[downarrow]" "[downarrow]" "↓") + ("harr" "\\leftrightarrow" t "↔" "<->" "<->" "↔") + ("leftrightarrow" "\\leftrightarrow" t "↔" "<->" "<->" "↔") + ("crarr" "\\hookleftarrow" t "↵" "<-'" "<-'" "↵") + ("hookleftarrow" "\\hookleftarrow" t "↵" "<-'" "<-'" "↵") + ("lArr" "\\Leftarrow" t "⇐" "<=" "<=" "⇐") + ("Leftarrow" "\\Leftarrow" t "⇐" "<=" "<=" "⇐") + ("uArr" "\\Uparrow" t "⇑" "[dbluparrow]" "[dbluparrow]" "⇑") + ("Uparrow" "\\Uparrow" t "⇑" "[dbluparrow]" "[dbluparrow]" "⇑") + ("rArr" "\\Rightarrow" t "⇒" "=>" "=>" "⇒") + ("Rightarrow" "\\Rightarrow" t "⇒" "=>" "=>" "⇒") + ("dArr" "\\Downarrow" t "⇓" "[dbldownarrow]" "[dbldownarrow]" "⇓") + ("Downarrow" "\\Downarrow" t "⇓" "[dbldownarrow]" "[dbldownarrow]" "⇓") + ("hArr" "\\Leftrightarrow" t "⇔" "<=>" "<=>" "⇔") + ("Leftrightarrow" "\\Leftrightarrow" t "⇔" "<=>" "<=>" "⇔") + ("forall" "\\forall" t "∀" "[for all]" "[for all]" "∀") + ("partial" "\\partial" t "∂" "[partial differential]" "[partial differential]" "∂") + ("exist" "\\exists" t "∃" "[there exists]" "[there exists]" "∃") + ("exists" "\\exists" t "∃" "[there exists]" "[there exists]" "∃") + ("empty" "\\empty" t "∅" "[empty set]" "[empty set]" "∅") + ("emptyset" "\\emptyset" t "∅" "[empty set]" "[empty set]" "∅") + ("nabla" "\\nabla" t "∇" "[nabla]" "[nabla]" "∇") + ("isin" "\\in" t "∈" "[element of]" "[element of]" "∈") + ("in" "\\in" t "∈" "[element of]" "[element of]" "∈") + ("notin" "\\notin" t "∉" "[not an element of]" "[not an element of]" "∉") + ("ni" "\\ni" t "∋" "[contains as member]" "[contains as member]" "∋") + ("prod" "\\prod" t "∏" "[product]" "[n-ary product]" "∏") + ("sum" "\\sum" t "∑" "[sum]" "[sum]" "∑") +; ("minus" "\\minus" t "−" "-" "-" "−") + ("minus" "-" t "−" "-" "-" "−") + ("lowast" "\\ast" t "∗" "*" "*" "∗") + ("ast" "\\ast" t "∗" "*" "*" "*") + ("radic" "\\sqrt{\,}" t "√" "[square root]" "[square root]" "√") + ("prop" "\\propto" t "∝" "[proportional to]" "[proportional to]" "∝") + ("proptp" "\\propto" t "∝" "[proportional to]" "[proportional to]" "∝") + ("infin" "\\propto" t "∞" "[infinity]" "[infinity]" "∞") + ("infty" "\\infty" t "∞" "[infinity]" "[infinity]" "∞") + ("ang" "\\angle" t "∠" "[angle]" "[angle]" "∠") + ("angle" "\\angle" t "∠" "[angle]" "[angle]" "∠") + ("and" "\\wedge" t "∧" "[logical and]" "[logical and]" "∧") + ("wedge" "\\wedge" t "∧" "[logical and]" "[logical and]" "∧") + ("or" "\\vee" t "∨" "[logical or]" "[logical or]" "∨") + ("vee" "\\vee" t "∨" "[logical or]" "[logical or]" "∨") + ("cap" "\\cap" t "∩" "[intersection]" "[intersection]" "∩") + ("cup" "\\cup" t "∪" "[union]" "[union]" "∪") + ("int" "\\int" t "∫" "[integral]" "[integral]" "∫") +; ("there4" "\\uptherefore" t "∴" "[therefore]" "[therefore]" "∴") + ("there4" "\\therefore" t "∴" "[therefore]" "[therefore]" "∴") + ("sim" "\\sim" t "∼" "~" "~" "∼") + ("cong" "\\cong" t "≅" "[approx. equal to]" "[approx. equal to]" "≅") + ("simeq" "\\simeq" t "≅" "[approx. equal to]" "[approx. equal to]" "≅") + ("asymp" "\\asymp" t "≈" "[almost equal to]" "[almost equal to]" "≈") + ("approx" "\\approx" t "≈" "[almost equal to]" "[almost equal to]" "≈") + ("ne" "\\ne" t "≠" "[not equal to]" "[not equal to]" "≠") + ("neq" "\\neq" t "≠" "[not equal to]" "[not equal to]" "≠") + ("equiv" "\\equiv" t "≡" "[identical to]" "[identical to]" "≡") + ("le" "\\le" t "≤" "<=" "<=" "≤") + ("ge" "\\ge" t "≥" ">=" ">=" "≥") + ("sub" "\\subset" t "⊂" "[subset of]" "[subset of]" "⊂") + ("subset" "\\subset" t "⊂" "[subset of]" "[subset of]" "⊂") + ("sup" "\\supset" t "⊃" "[superset of]" "[superset of]" "⊃") + ("supset" "\\supset" t "⊃" "[superset of]" "[superset of]" "⊃") + ("nsub" "\\not\\subset" t "⊄" "[not a subset of]" "[not a subset of" "⊄") + ("sube" "\\subseteq" t "⊆" "[subset of or equal to]" "[subset of or equal to]" "⊆") + ("supe" "\\supseteq" t "⊇" "[superset of or equal to]" "[superset of or equal to]" "⊇") + ("oplus" "\\oplus" t "⊕" "[circled plus]" "[circled plus]" "⊕") + ("otimes" "\\otimes" t "⊗" "[circled times]" "[circled times]" "⊗") + ("perp" "\\perp" t "⊥" "[up tack]" "[up tack]" "⊥") + ("sdot" "\\cdot" t "⋅" "[dot]" "[dot]" "⋅") + ("cdot" "\\cdot" t "⋅" "[dot]" "[dot]" "⋅") + ("lceil" "\\lceil" t "⌈" "[left ceiling]" "[left ceiling]" "⌈") + ("rceil" "\\rceil" t "⌉" "[right ceiling]" "[right ceiling]" "⌉") + ("lfloor" "\\lfloor" t "⌊" "[left floor]" "[left floor]" "⌊") + ("rfloor" "\\rfloor" t "⌋" "[right floor]" "[right floor]" "⌋") + ("lang" "\\langle" t "⟨" "<" "<" "⟨") + ("rang" "\\rangle" t "⟩" ">" ">" "⟩") + ("loz" "\\diamond" t "◊" "[lozenge]" "[lozenge]" "◊") + ("Diamond" "\\diamond" t "⋄" "[diamond]" "[diamond]" "⋄") + ("spades" "\\spadesuit" t "♠" "[spades]" "[spades]" "♠") + ("spadesuit" "\\spadesuit" t "♠" "[spades]" "[spades]" "♠") + ("clubs" "\\clubsuit" t "♣" "[clubs]" "[clubs]" "♣") + ("clubsuit" "\\clubsuit" t "♣" "[clubs]" "[clubs]" "♣") + ("hearts" "\\heartsuit" t "♥" "[hearts]" "[hearts]" "♥") + ("heartsuit" "\\heartsuit" t "♥" "[hearts]" "[hearts]" "♥") + ("diamondsuit" "\\diamondsuit" t "♦" "[diamonds]" "[diamonds]" "♦") + ("diams" "\\diamondsuit" t "♦" "[diamonds]" "[diamonds]" "♦") + ("smile" "\\smile" t "☺" ":-)" ":-)" "⌣") + ("blacksmile" "\\blacksmiley" nil "☻" ":-)" ":-)" "☻") + ("sad" "\\frownie" nil "☹" ":-(" ":-(" "☹") + ("quot" "\\textquotedbl" nil """ "\"" "\"" "\"") + ("amp" "\\&" nil "&" "&" "&" "&") + ("lt" "\\textless" nil "<" "<" "<" "<") + ("gt" "\\textgreater" nil ">" ">" ">" ">") + ("OElig" "\\OE" nil "Œ" "OE" "OE" "Œ") + ("oelig" "\\oe" nil "œ" "oe" "oe" "œ") + ("Scaron" "\\v{S}" nil "Š" "S" "S" "Š") + ("scaron" "\\v{s}" nil "š" "s" "s" "š") + ("Yuml" "\\\"{Y}" nil "Ÿ" "Y" "Y" "Ÿ") + ("circ" "\\circ" t "ˆ" "^" "^" "ˆ") + ("tilde" "\~{}" nil "˜" "~" "~" "~") + ("ensp" "\\hspace*{.5em}" nil " " " " " " " ") + ("emsp" "\\hspace*{1em}" nil " " " " " " " ") + ("thinsp" "\\hspace*{.2em}" nil " " " " " " " ") + ("zwnj" "\\/{}" nil "‌" "" "" "") + ("zwj" "" nil "‍" "" "" "") + ("lrm" "" nil "‎" "" "" "") + ("rlm" "" nil "‏" "" "" "") + ("ndash" "--" nil "–" "-" "-" "–") + ("mdash" "---" nil "—" "--" "--" "—") + ("lsquo" "\\textquoteleft" nil "‘" "`" "`" "‘") + ("rsquo" "\\textquoteright" nil "’" "'" "'" "’") + ("sbquo" "\\quotesinglbase" nil "‚" "," "," "‚") + ("ldquo" "\\textquotedblleft" nil "“" "\"" "\"" "“") + ("rdquo" "\\textquotedblright" nil "”" "\"" "\"" "”") + ("bdquo" "\\quotedblbase" nil "„" "\"" "\"" "„") + ("dagger" "\\textdagger" nil "†" "[dagger]" "[dagger]" "†") + ("Dagger" "\\textdaggerdbl" nil "‡" "[doubledagger]" "[doubledagger]" "‡") + ("permil" "\\textperthousand" nil "‰" "per thousand" "per thousand" "‰") + ("lsaquo" "\\guilsinglleft" nil "‹" "<" "<" "‹") + ("rsaquo" "\\guilsinglright" nil "›" ">" ">" "›") + ("euro" "\\texteuro" nil "€" "EUR" "EUR" "€") + ("EUR" "\\EUR" nil "€" "EUR" "EUR" "€") + ("EURdig" "\\EURdig" nil "€" "EUR" "EUR" "€") + ("EURhv" "\\EURhv" nil "€" "EUR" "EUR" "€") + ("EURcr" "\\EURcr" nil "€" "EUR" "EUR" "€") + ("EURtm" "\\EURtm" nil "€" "EUR" "EUR" "€") + ("arccos" "\\arccos" t "arccos" "arccos" "arccos" "arccos") + ("arcsin" "\\arcsin" t "arcsin" "arcsin" "arcsin" "arcsin") + ("arctan" "\\arctan" t "arctan" "arctan" "arctan" "arctan") + ("arg" "\\arg" t "arg" "arg" "arg" "arg") + ("cos" "\\cos" t "cos" "cos" "cos" "cos") + ("cosh" "\\cosh" t "cosh" "cosh" "cosh" "cosh") + ("cot" "\\cot" t "cot" "cot" "cot" "cot") + ("coth" "\\coth" t "coth" "coth" "coth" "coth") + ("csc" "\\csc" t "csc" "csc" "csc" "csc") + ("deg" "\\deg" t "°" "deg" "deg" "deg") + ("det" "\\det" t "det" "det" "det" "det") + ("dim" "\\dim" t "dim" "dim" "dim" "dim") + ("exp" "\\exp" t "exp" "exp" "exp" "exp") + ("gcd" "\\gcd" t "gcd" "gcd" "gcd" "gcd") + ("hom" "\\hom" t "hom" "hom" "hom" "hom") + ("inf" "\\inf" t "inf" "inf" "inf" "inf") + ("ker" "\\ker" t "ker" "ker" "ker" "ker") + ("lg" "\\lg" t "lg" "lg" "lg" "lg") + ("lim" "\\lim" t "lim" "lim" "lim" "lim") + ("liminf" "\\liminf" t "liminf" "liminf" "liminf" "liminf") + ("limsup" "\\limsup" t "limsup" "limsup" "limsup" "limsup") + ("ln" "\\ln" t "ln" "ln" "ln" "ln") + ("log" "\\log" t "log" "log" "log" "log") + ("max" "\\max" t "max" "max" "max" "max") + ("min" "\\min" t "min" "min" "min" "min") + ("Pr" "\\Pr" t "Pr" "Pr" "Pr" "Pr") + ("sec" "\\sec" t "sec" "sec" "sec" "sec") + ("sin" "\\sin" t "sin" "sin" "sin" "sin") + ("sinh" "\\sinh" t "sinh" "sinh" "sinh" "sinh") + ("sup" "\\sup" t "⊃" "sup" "sup" "sup") + ("tan" "\\tan" t "tan" "tan" "tan" "tan") + ("tanh" "\\tanh" t "tanh" "tanh" "tanh" "tanh") + ("frac12" "\\textonehalf" nil "½" "1/2" "½" "½") + ("frac14" "\\textonequarter" nil "¼" "1/4" "¼" "¼") + ("frac34" "\\textthreequarters" nil "¾" "3/4" "¾" "¾") + ("div" "\\textdiv" nil "÷" "/" "÷" "÷") + ("acute" "\\textasciiacute" nil "´" "'" "´" "´") + ("nsup" "\\not\\supset" t "⊅" "[not a superset of]" "[not a superset of]" "⊅") + ("smiley" "\\smiley" nil "☺" ":-)" ":-)" "☺") + ) + "Default entities used in Org-mode to preduce special characters. +For details see `org-entities-user'.") + +(defsubst org-entity-get (name) + "Get the proper association for NAME from the entity lists. +This first checks the user list, then the built-in list." + (or (assoc name org-entities-user) + (assoc name org-entities))) + +(defun org-entity-get-representation (name kind) + "Get the correct representation of entity NAME for export type KIND. +Kind can be any of `latex', `html', `ascii', `latin1', or `utf8'." + (let* ((e (org-entity-get name)) + (n (cdr (assq kind '((latex . 1) (html . 3) (ascii . 4) + (latin1 . 5) (utf8 . 6))))) + (r (and e n (nth n e)))) + (if (and (not org-entities-ascii-explanatory) + (memq kind '(ascii latin1 utf8)) + (= (string-to-char r) ?\[)) + (concat "\\" name) + r))) + +(defsubst org-entity-latex-math-p (name) + "Does entity NAME require math mode in LaTeX?" + (nth 2 (org-entity-get name))) + +(provide 'org-entities) + +;; arch-tag: e6bd163f-7419-4009-9c93-a74623016424 + +;;; org-entities.el ends here diff --git a/lisp/org-exp.el b/lisp/org-exp.el index 0add47f..07f0b05 100644 --- a/lisp/org-exp.el +++ b/lisp/org-exp.el @@ -480,7 +480,8 @@ This option can also be set with the +OPTIONS line, e.g. \"^:nil\"." For example, HTML export converts \\alpha to α and \\AA to Å. Not only real TeX macros will work here, but the standard HTML entities for math can be used as macro names as well. For a list of supported -names in HTML export, see the constant `org-html-entities'. +names in HTML export, see the constant `org-entities' and the user option +`org-entities-user'. Not all export backends support this. This option can also be set with the +OPTIONS line, e.g. \"TeX:nil\"." @@ -989,312 +990,6 @@ value of `org-export-run-in-background'." (setq status (substring status 0 -1))) (message "Background process \"%s\": %s" process status)) -(defconst org-html-entities - '(("nbsp") - ("iexcl") - ("cent") - ("pound") - ("curren") - ("yen") - ("brvbar") - ("vert" . "|") - ("sect") - ("uml") - ("copy") - ("ordf") - ("laquo") - ("not") - ("shy") - ("reg") - ("macr") - ("deg") - ("pm" . "±") - ("plusmn") - ("sup2") - ("sup3") - ("acute") - ("micro") - ("para") - ("middot") - ("odot"."o") - ("star"."*") - ("cedil") - ("sup1") - ("ordm") - ("raquo") - ("frac14") - ("frac12") - ("frac34") - ("iquest") - ("Agrave") - ("Aacute") - ("Acirc") - ("Atilde") - ("Auml") - ("Aring") ("AA"."Å") - ("AElig") - ("Ccedil") - ("Egrave") - ("Eacute") - ("Ecirc") - ("Euml") - ("Igrave") - ("Iacute") - ("Icirc") - ("Iuml") - ("ETH") - ("Ntilde") - ("Ograve") - ("Oacute") - ("Ocirc") - ("Otilde") - ("Ouml") - ("times") - ("Oslash") - ("Ugrave") - ("Uacute") - ("Ucirc") - ("Uuml") - ("Yacute") - ("THORN") - ("szlig") - ("agrave") - ("aacute") - ("acirc") - ("atilde") - ("auml") - ("aring") - ("aelig") - ("ccedil") - ("checkmark" . "✓") - ("egrave") - ("eacute") - ("ecirc") - ("euml") - ("igrave") - ("iacute") - ("icirc") - ("iuml") - ("eth") - ("ntilde") - ("ograve") - ("oacute") - ("ocirc") - ("otilde") - ("ouml") - ("divide") - ("oslash") - ("ugrave") - ("uacute") - ("ucirc") - ("uuml") - ("yacute") - ("thorn") - ("yuml") - ("fnof") - ("Alpha") - ("Beta") - ("Gamma") - ("Delta") - ("Epsilon") - ("Zeta") - ("Eta") - ("Theta") - ("Iota") - ("Kappa") - ("Lambda") - ("Mu") - ("Nu") - ("Xi") - ("Omicron") - ("Pi") - ("Rho") - ("Sigma") - ("Tau") - ("Upsilon") - ("Phi") - ("Chi") - ("Psi") - ("Omega") - ("alpha") - ("beta") - ("gamma") - ("delta") - ("epsilon") - ("varepsilon"."ε") - ("zeta") - ("eta") - ("theta") - ("iota") - ("kappa") - ("lambda") - ("mu") - ("nu") - ("xi") - ("omicron") - ("pi") - ("rho") - ("sigmaf") ("varsigma"."ς") - ("sigma") - ("tau") - ("upsilon") - ("phi") - ("chi") - ("psi") - ("omega") - ("thetasym") ("vartheta"."ϑ") - ("upsih") - ("piv") - ("bull") ("bullet"."•") - ("hellip") ("dots"."…") - ("prime") - ("Prime") - ("oline") - ("frasl") - ("weierp") - ("image") - ("real") - ("trade") - ("alefsym") - ("larr") ("leftarrow"."←") ("gets"."←") - ("uarr") ("uparrow"."↑") - ("rarr") ("to"."→") ("rightarrow"."→") - ("darr")("downarrow"."↓") - ("harr") ("leftrightarrow"."↔") - ("crarr") ("hookleftarrow"."↵") ; has round hook, not quite CR - ("lArr") ("Leftarrow"."⇐") - ("uArr") ("Uparrow"."⇑") - ("rArr") ("Rightarrow"."⇒") - ("dArr") ("Downarrow"."⇓") - ("hArr") ("Leftrightarrow"."⇔") - ("forall") - ("part") ("partial"."∂") - ("exist") ("exists"."∃") - ("empty") ("emptyset"."∅") - ("nabla") - ("isin") ("in"."∈") - ("notin") - ("ni") - ("prod") - ("sum") - ("minus") - ("lowast") ("ast"."∗") - ("radic") - ("prop") ("proptp"."∝") - ("infin") ("infty"."∞") - ("ang") ("angle"."∠") - ("and") ("wedge"."∧") - ("or") ("vee"."∨") - ("cap") - ("cup") - ("int") - ("there4") - ("sim") - ("cong") ("simeq"."≅") - ("asymp")("approx"."≈") - ("ne") ("neq"."≠") - ("equiv") - ("le") - ("ge") - ("sub") ("subset"."⊂") - ("sup") ("supset"."⊃") - ("nsub") - ("sube") - ("supe") - ("oplus") - ("otimes") - ("perp") - ("sdot") ("cdot"."⋅") - ("lceil") - ("rceil") - ("lfloor") - ("rfloor") - ("lang") - ("rang") - ("loz") ("Diamond"."◊") - ("spades") ("spadesuit"."♠") - ("clubs") ("clubsuit"."♣") - ("hearts") - ("diams") ("diamondsuit"."♦") - ("smile"."☺") ("blacksmile"."☻") ("sad"."☹") - ("quot") - ("amp") - ("lt") - ("gt") - ("OElig") - ("oelig") - ("Scaron") - ("scaron") - ("Yuml") - ("circ") - ("tilde") - ("ensp") - ("emsp") - ("thinsp") - ("zwnj") - ("zwj") - ("lrm") - ("rlm") - ("ndash") - ("mdash") - ("lsquo") - ("rsquo") - ("sbquo") - ("ldquo") - ("rdquo") - ("bdquo") - ("dagger") - ("Dagger") - ("permil") - ("lsaquo") - ("rsaquo") - ("euro") - ("EUR"."€") - ("EURdig"."€") - ("EURhv"."€") - ("EURcr"."€") - ("EURtm"."€") - ("arccos"."arccos") - ("arcsin"."arcsin") - ("arctan"."arctan") - ("arg"."arg") - ("cos"."cos") - ("cosh"."cosh") - ("cot"."cot") - ("coth"."coth") - ("csc"."csc") - ("deg"."deg") - ("det"."det") - ("dim"."dim") - ("exp"."exp") - ("gcd"."gcd") - ("hom"."hom") - ("inf"."inf") - ("ker"."ker") - ("lg"."lg") - ("lim"."lim") - ("liminf"."liminf") - ("limsup"."limsup") - ("ln"."ln") - ("log"."log") - ("max"."max") - ("min"."min") - ("Pr"."Pr") - ("sec"."sec") - ("sin"."sin") - ("sinh"."sinh") - ("sup"."sup") - ("tan"."tan") - ("tanh"."tanh") - ) - "Entities for TeX->HTML translation. -Entries can be like (\"ent\"), in which case \"\\ent\" will be translated to -\"&ent;\". An entry can also be a dotted pair like (\"ent\".\"&other;\"). -In that case, \"\\ent\" will be translated to \"&other;\". -The list contains HTML entities for Latin-1, Greek and other symbols. -It is supplemented by a number of commonly used TeX macros with appropriate -translations. There is currently no way for users to extend this.") - ;;; General functions for all backends (defvar org-export-target-aliases nil diff --git a/lisp/org-html.el b/lisp/org-html.el index 8b1f8d1..787240f 100644 --- a/lisp/org-html.el +++ b/lisp/org-html.el @@ -1911,16 +1911,14 @@ If there are links in the string, don't modify these." (if org-export-with-sub-superscripts (setq s (org-export-html-convert-sub-super s))) (if org-export-with-TeX-macros - (let ((start 0) wd ass) + (let ((start 0) wd rep) (while (setq start (string-match "\\\\\\([a-zA-Z]+\\)\\({}\\)?" s start)) (if (get-text-property (match-beginning 0) 'org-protected s) (setq start (match-end 0)) (setq wd (match-string 1 s)) - (if (setq ass (assoc wd org-html-entities)) - (setq s (replace-match (or (cdr ass) - (concat "&" (car ass) ";")) - t t s)) + (if (setq rep (org-entity-get-representation wd 'html)) + (setq s (replace-match rep t t s)) (setq start (+ start (length wd)))))))) s) diff --git a/lisp/org-latex.el b/lisp/org-latex.el index 03c30a6..d167b5c 100644 --- a/lisp/org-latex.el +++ b/lisp/org-latex.el @@ -99,6 +99,10 @@ \\usepackage{float} \\usepackage{wrapfig} \\usepackage{soul} +\\usepackage{t1enc} +\\usepackage{textcomp} +\\usepackage{marvosym} +\\usepackage{wasysym} \\usepackage{latexsym} \\usepackage{amssymb} \\usepackage{hyperref}" @@ -116,6 +120,10 @@ \\usepackage{float} \\usepackage{wrapfig} \\usepackage{soul} +\\usepackage{t1enc} +\\usepackage{textcomp} +\\usepackage{marvosym} +\\usepackage{wasysym} \\usepackage{latexsym} \\usepackage{amssymb} \\usepackage{hyperref}" @@ -133,6 +141,10 @@ \\usepackage{float} \\usepackage{wrapfig} \\usepackage{soul} +\\usepackage{t1enc} +\\usepackage{textcomp} +\\usepackage{marvosym} +\\usepackage{wasysym} \\usepackage{latexsym} \\usepackage{amssymb} \\usepackage{hyperref}" @@ -150,6 +162,10 @@ \\usepackage{float} \\usepackage{wrapfig} \\usepackage{soul} +\\usepackage{t1enc} +\\usepackage{textcomp} +\\usepackage{marvosym} +\\usepackage{wasysym} \\usepackage{latexsym} \\usepackage{amssymb} \\usepackage{hyperref}" @@ -1489,31 +1505,31 @@ Convert CHAR depending on STRING-BEFORE and STRING-AFTER." (defun org-export-latex-treat-backslash-char (string-before string-after) "Convert the \"$\" special character to LaTeX. The conversion is made depending of STRING-BEFORE and STRING-AFTER." - (cond ((member (list string-after) org-html-entities) - ;; backslash is part of a special entity (like "\alpha") - (concat string-before "$\\" - (or (cdar (member (list string-after) org-html-entities)) - string-after) "$")) - ((and (not (string-match "^[ \n\t]" string-after)) - (not (string-match "[ \t]\\'\\|^" string-before))) - ;; backslash is inside a word - (concat string-before - (org-export-latex-protect-string - (concat "\\textbackslash{}" string-after)))) - ((not (or (equal string-after "") - (string-match "^[ \t\n]" string-after))) - ;; backslash might escape a character (like \#) or a user TeX - ;; macro (like \setcounter) - (concat string-before - (org-export-latex-protect-string (concat "\\" string-after)))) - ((and (string-match "^[ \t\n]" string-after) - (string-match "[ \t\n]\\'" string-before)) - ;; backslash is alone, convert it to $\backslash$ - (org-export-latex-protect-string - (concat string-before "\\textbackslash{}" string-after))) - (t (org-export-latex-protect-string - (concat string-before "\\textbackslash{}" string-after))))) - + (let ((ass (org-entity-get string-after))) + (cond + (ass (if (nth 2 ass) + (concat string-before "$" (nth 1 ass) "$") + (concat "\\" string-after))) + ((and (not (string-match "^[ \n\t]" string-after)) + (not (string-match "[ \t]\\'\\|^" string-before))) + ;; backslash is inside a word + (concat string-before + (org-export-latex-protect-string + (concat "\\textbackslash{}" string-after)))) + ((not (or (equal string-after "") + (string-match "^[ \t\n]" string-after))) + ;; backslash might escape a character (like \#) or a user TeX + ;; macro (like \setcounter) + (concat string-before + (org-export-latex-protect-string (concat "\\" string-after)))) + ((and (string-match "^[ \t\n]" string-after) + (string-match "[ \t\n]\\'" string-before)) + ;; backslash is alone, convert it to $\backslash$ + (org-export-latex-protect-string + (concat string-before "\\textbackslash{}" string-after))) + (t (org-export-latex-protect-string + (concat string-before "\\textbackslash{}" string-after)))))) + (defun org-export-latex-keywords () "Convert special keywords to LaTeX." (goto-char (point-min)) diff --git a/lisp/org.el b/lisp/org.el index 1eb5a3f..988dab1 100644 --- a/lisp/org.el +++ b/lisp/org.el @@ -85,6 +85,7 @@ (require 'easymenu) (require 'org-macs) +(require 'org-entities) (require 'org-compat) (require 'org-faces) (require 'org-list) @@ -4222,7 +4223,7 @@ This is for getting out of special buffers like remember.") (defvar date) ;; Defined somewhere in this file, but used before definition. -(defvar org-html-entities) +(defvar org-entities) ;; defined in org-entities.el (defvar org-struct-menu) (defvar org-org-menu) (defvar org-tbl-menu) @@ -4887,7 +4888,8 @@ will be prompted for." (if org-export-with-TeX-macros (list (concat "\\\\" (regexp-opt - (append (mapcar 'car org-html-entities) + (append (mapcar 'car (append org-entities-user + org-entities)) (if (boundp 'org-latex-entities) (mapcar (lambda (x) (or (car-safe x) x)) @@ -9987,7 +9989,7 @@ At all other locations, this simply calls the value of org-link-abbrev-alist)) (texp (setq type :tex) - org-html-entities) + (append org-entities-user org-entities)) ((string-match "\\`\\*+[ \t]+\\'" (buffer-substring (point-at-bol) beg)) (setq type :todo) |