如何在组织模式下转义*以防止粗体显示字体


12

如果我*shrug*在org模式下编写类似的内容,则会自动将其字体设置为粗体文本。如何防止这种情况发生,即*shrug*在导出时实际出现逐字记录?

编辑:

我仍然希望能够使用粗体字体化(而不必更改粗体文本的默认星型语法),并且与我的组织文件导出的文件格式无关,例如,它应该适用于Markdown和HTML出口。

这是一些重要的东西,这就是为什么它以粗体显示的原因。但是对于其他事情,我没有任何想法。


1
如果稍后将其导出到LaTeX,则可以尝试使用HTML \ast{}shrug\ast{}\star{}shrug\star{},类似的方法,使用实体编码:&#2a;,或者如果在星号之前或之后添加空格也是可行的。
wvxvw

suvayu的答案似乎只是将其包装在逐字标记中。或者,您可以修改org-emphasis-alist,以便将另一个字符用于加粗文本。
user2699 2015年

不完全是。= * shrug * =导致导出的HTML被包装在code-tag中,并且markdown中带有反引号。我希望它完全不格式化。
timor

修改过的问题可以反映出,改变组织强调专家并不是真正的选择。我不想更改.org文件中已经存在的所有粗体。
帝汶

2
\ast{}shrug\ast{}通过wvxvw提到的可能是你最好的选择。它会使用适当的字符实体导出为html ∗shrug∗以及乳胶$\ast$shrug$\ast$org-toggle-pretty-entities在组织缓冲区中将它们显示为UTF8字符。
mutbuerger 2015年

Answers:


9

emacs-org-mode GNU列表上的集体建议使用org-entityC-h i g (org) Special symbols\ast{}而不是零宽度的空格字符(我在此处的其他答案中建议)后,得出这个答案

以下是一种通用解决方案,用户无需记住各种符号的组织实体。用户执行操作时,它将插入组织实体(如果有)C-u SYMBOL适用于C-u *C-u /C-u =,等。

(defun modi/org-entity-get-name (char)
  "Return the entity name for CHAR. For example, return \"ast\" for *."
  (let ((ll (append org-entities-user
                    org-entities))
        e name utf8)
    (catch 'break
      (while ll
        (setq e (pop ll))
        (when (not (stringp e))
          (setq utf8 (nth 6 e))
          (when (string= char utf8)
            (setq name (car e))
            (throw 'break name)))))))

(defun modi/org-insert-org-entity-maybe (&rest args)
  "When the universal prefix C-u is used before entering any character,
    insert the character's `org-entity' name if available.

    If C-u prefix is not used and if `org-entity' name is not available, the
    returned value `entity-name' will be nil."
  ;; It would be fine to use just (this-command-keys) instead of
  ;; (substring (this-command-keys) -1) below in emacs 25+.
  ;; But if the user pressed "C-u *", then
  ;;  - in emacs 24.5, (this-command-keys) would return "^U*", and
  ;;  - in emacs 25.x, (this-command-keys) would return "*".
  ;; But in both versions, (substring (this-command-keys) -1) will return
  ;; "*", which is what we want.
  ;; http://thread.gmane.org/gmane.emacs.orgmode/106974/focus=106996
  (let ((pressed-key (substring (this-command-keys) -1))
        entity-name)
    (when (and (listp args) (eq 4 (car args)))
      (setq entity-name (modi/org-entity-get-name pressed-key))
      (when entity-name
        (setq entity-name (concat "\\" entity-name "{}"))
        (insert entity-name)
        (message (concat "Inserted `org-entity' "
                         (propertize entity-name
                                     'face 'font-lock-function-name-face)
                         " for the symbol "
                         (propertize pressed-key
                                     'face 'font-lock-function-name-face)
                         "."))))
    entity-name))

;; Run `org-self-insert-command' only if `modi/org-insert-org-entity-maybe'
;; returns nil.
(advice-add 'org-self-insert-command :before-until #'modi/org-insert-org-entity-maybe)

因此,当用户键入C-u *\ast{}并在回显区域中显示以下消息时,

为符号*插入'org-entity'\ ast {}。

如果org-pretty-entitiest上方设置,插入的\ast{}显示*

如果org-entity字符X不存在,并且用户使用C-u X,则X会被简单地插入4次(C-u通常是这样)。


1
看起来真的很方便。剩下的一个drwaback(以我的观点)是,到目前为止,.org文件尚不包含任何LaTeX构造,现在在整个文件中散布了一些非组织模式语法(LaTeX)。顺便说一句,有没有理由不\*thisisnotbold\*存在类似的构造?
帝汶

1
这也是组织语法。查看org-entities文档。
Kaushal Modi 2015年

8

使用ZERO WIDTH SPACE Unicode字符

通过在第一个星号之前或第二个星号之后添加零宽度空格字符(在下面的代码片段中由[ZWS]表示),可以使粗体强调解析失败。

在我的测试中,以下两个代码片段都可以很好地导出到HTML:

  • [ZWS] 第一个星号之前

    This is some *bold* test and this is ​[ZWS]*not bold*.
    
  • 第二个星号的[ZWS]

    This is some *bold* test and this is *not bold*​[ZWS].
    

您可以通过执行输入零宽度空间(统一名称)C-x 8 RET 200b RET
我经常使用它,因此我将其绑定到C-x 8 0


更新资料

根据对emacs-org-mode邮件列表讨论,不建议使用非ASCII字符进行转义;org-entities如果适用,应改为使用。我也对此表示同意,并提出了另一种解决方案,使插入变得org-entities非常容易(C-u *在这种情况下)。


从技术上讲,这是解决问题的快速方法。它是否依靠org-mode而不将ZWS解释为空格?另外,我担心对于其他编辑组织文件的人来说,解决方案是不可行的……
timor

@timor我已经在emacs-orgmode@gnu.org邮件列表上提到了这个讨论。如果有兴趣,您可以在此处关注/添加讨论。
Kaushal Modi

@timor,这并不明显,但是在这里给出的所有解决方案中,这是唯一一种无需修改emacs配置即可工作的解决方案,因此,如果要共享文件,这是最明显的。
user2699

@ user2699 FWIW,无需任何用户配置即可立即使用文件中的org实体。.只是\ast{}文件中使用纯ascii 。我的其他解决方案只是使输入\ast{}变得更快,更容易记住。
Kaushal Modi 2015年

3

逐字逐句地,如果您实际上是在导出的LaTeX中使用一些标记,则可以使用=*shrug*=。但是,如果您只希望将其导出为*shrug*,并且一直希望这样做,则建议您使用filter。但是,如果仅在的某些实例中需要此功能*shrug*,则应使用@wvxvw建议的替代方法。您可以使用干净地执行此操作。以下是一些示例。

筛选器

(defun my-bold (contents backend info)
  (when (org-export-derived-backend-p backend 'latex)
    (replace-regexp-in-string "\\`\\\\textbf{\\(.+\\)}"
                              "\\\\ast{}\\1\\\\ast{}" contents)))

(add-to-list 'org-export-filter-bold-functions 'my-bold)

基本上,上述过滤器会\textbf{..}在转码后的字符串中查找标记,然后将其替换为\ast{}..\ast{},而无需更改包装在其中的内容{..}。我尚未测试正则表达式和替换字符串,因此可能会出现错误,但是您明白了。类似地,为了涵盖其他后端,可以包含一些额外的片段,如下所示:

(when (org-export-derived-backend-p backend 'html)
   (replace-regexp-in-string "<b>\\(.+\\)</b>" "\&#2a;\\1\&#2a;" contents))

同样的警告适用于上述正则表达式。

巨集

组织来源:

#+macro: nobold @@latex:\ast{}$1\ast{}@@ @@html:&#2a;$1&#2a;@@

This text is *bold* this is nobold{{{not}}}

出口到乳胶为:

This text is \textbf{bold} this is \ast{}not\ast{}

并将HTML更改为:

This text is <b>bold</b> this is  &#2a;not&#2a;

当然,您可以向宏中添加任意数量的后端。

编辑:正如Kaushal在评论中指出的那样,乳胶的导出代码段在这种情况下是可选的。但是,我更喜欢在涉及裸乳胶的情况下使用它们,因为我发现很难跟踪org-entitiesOrg源中识别裸乳胶的列表和特定规则。

注意:

  • 过滤器示例未经测试,
  • 我什么都不知道HTML,所以各自的位可能有一些错误。

这个宏定义不应该满足#+macro: nobold \ast{}$1\ast{}吗?ast是的成员之一org-entities列表,指定什么乳胶,HTML,ASCII等出口应该是这样的:("ast" "\\ast" t "&lowast;" "*" "*" "*")。该列表中元素的顺序为“名称,LaTeX替换,LaTeX Mathp,HTML替换,ASCII替换,Latin1替换,utf-8替换”。
Kaushal Modi 2015年

@kaushalmodi是的,但是由于我们已经知道它是LaTeX,因此将其放入乳胶代码段中不会有任何危害。以我的经验,由于片段的含糊不清,因此使用片段要健壮得多。
Quarky 2015年

-1

这由变量org-emphasis-alist控制,并且可以轻松修改。

  • 将光标放在粗体上,使用命令what-c​​ursor-position C-u C-x =查找面孔,注意它具有属性org-emphasis
  • 致电customize-group并搜索组织重点
  • 应该显示org-emphasis-alist,并带有用于标记文本的各种选项。
  • 删除对应于*的条目
  • 应用更改,然后重新启动org-mode或emacs
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.