如何在org-mode中使单词的部分加粗?

27

我如何使org-mode标记对一个单词的一部分起作用?例如,我希望它适用于以下情况:

=Class=es

并且这个:

/Method/s
根据我的测试,似乎org-mode的标记语法只适用于完整的单词。

1
如果要通过LaTeX导出PDF,可以直接在org缓冲区中使用LaTeX解决方案。例如,\textbf{V}alence \texttt{Aware} Dictionary将仅以粗体形式打印“V”,并且整个单词“Aware”将以org =verbatim=样式显示。 - n1k31t4
7个回答

38

现在,有一种方法可以实现这一点(不使用引用的HTML标记):

(setcar org-emphasis-regexp-components " \t('\"{[:alpha:]")
(setcar (nthcdr 1 org-emphasis-regexp-components) "[:alpha:]- \t.,:!?;'\")}\\")
(org-set-emph-re 'org-emphasis-regexp-components org-emphasis-regexp-components)

解释

手册中提到org-emphasis-regexp-components可用于调整标记字符前后允许的字符。它是一个包含五个条目的列表。第一个条目列出了允许立即在标记字符之前出现的字符,第二个条目列出了允许在标记字符之后出现的字符。默认情况下,字母不包括在这两个条目中。因此,为了成功地将格式应用于紧接着或跟随字母的字符串,我们必须将[:alpha:](它匹配任何字母)添加到这两个条目中。

这就是对setcar的调用所做的事情。第三行的目的是基于修改后的org-emphasis-regexp-components重新构建强调的正则表达式。


不错!对于那些追求完美的CL爱好者来说,它也适用于设置org-emphasis-regexp-componentscarcadr - Dan
...而对org-set-emph-re的调用不仅影响粗体(* *),还包括斜体(/ /)、下划线(_ _)和删除线(+ +)。非常好! - Dan
@Dan 谢谢!是的,它应该是一个通用解决方案。可惜还没有人提出一个通用的问题;) - itsjeyd
@itsjeyd 不错的解决方案!不确定为什么,但我在视觉上有一个问题:LaTeX 代码的下标启用 org-mode 中的下划线字体。即在以下 LaTeX 片段中 (\bigcup_{i=1} F_i),“{i=1} F” 在 org-mode 缓冲区中被下划线标记。这无论如何都不会影响输出 PDF。 - Firmin Martin
3
很不幸,如果一个强调跟在另一个强调后面,这种方法就行不通了。 以下方法不可行: HiDPI: *Hi*gh *D*ots *P*er *I*nch 得到的结果是 High Dots Per Inch,只有第一个和最后一个 * 能匹配上。 org-mode 版本9.5 - stfl
@stfl 你可能会发现我的问题的答案在这里很有用 https://emacs.stackexchange.com/questions/72514/font-changes-inside-words/72520 - Rusi

7

我认为你无法使文本在缓冲区中以粗体显示。如果你只需要在将其导出为html时以粗体显示,可以使用以下方法:

th@<b>is is ha@</b>lf bold

请参见引用HTML标签

4
阅读了bvk的回复,他提到了一个邮件列表线程,我找到了这个线程,并想包含开发者的回复链接。如何在org-mode中将单词的一部分加粗 - Joshua Taylor
4
在最近版本的org-mode中,引用HTML字符串的语法已更改。如果要得到th<b>is is ha</b>lf bold,你需要写成 th@@html:<b>@@is is ha@@html:</b>@@lf bold - itsjeyd
@itsjeyd的评论解决了我的问题,在GNU Emacs 25.2.2中有效。 - Zelphir Kaltstahl

6
一种未被提及的解决方法是在所需粗体和非粗体部分中间使用一个Unicode零宽空格(U+200B)。
要获得单词“Classes”的所需粗体效果,请按如下步骤操作:
1. 在缓冲区中输入 'Class*es'(不包括引号)。 2. 将光标移动到“*”和“e”字符之间。 3. 按C-x 8 RET(执行插入字符命令)。 4. 输入 “zero width space”(不包括引号)并按回车键。 5. 将光标移到单词开头并插入一个“*”字符。
现在,“Classes”这个单词应该具有所需的外观。
请注意,这可能会在导出时造成问题。

4
不,你不能这样做。我之前也搜索了同样的解决方案,但没有找到。一个(非常)糟糕的方法是使用类似于 *Class* es(带有空格)的东西。
或许你可以向创建者Carsten Dominik(个人主页)发送一条简短的消息,询问他是否有解决方案。他似乎是个好人。

我刚刚发送了一封邮件到org-mode邮件列表。 - bvk
2
如果你还感兴趣的话,最近版本的org-mode可以自定义应用于单词部分的标记。请参见下面的答案。 - itsjeyd

0

先前的优秀答案的基础上进行了改进

我不得不稍微修改一下才能让它与spacemacs协同工作。确实,从可用这里的spacemacs org-layer文档中,我们可以看到:

由于自动加载,调用org函数将触发emacs附带的org加载,这将引起冲突。 避免冲突的一种方法是在with-eval-after-load块中包装您的org配置代码[...]

因此,我将以下行放置在我的dotspacemacs/user-config()中。

(eval-after-load "org"                                                                                                                                                 
  '(progn                                                                                                                                                              
     (setcar org-emphasis-regexp-components " \t('\"{[:alpha:]")                                                                                                       
     (setcar (nthcdr 1 org-emphasis-regexp-components) "[:alpha:]- \t.,:!?;'\")}\\")                                                                                   
     (org-set-emph-re 'org-emphasis-regexp-components org-emphasis-regexp-components)                                                                                  
  )) 

0
src_latex{\textbf{Class}es and \textit{Method}s}

1
如果你想要导出为HTML,这并不是一个很好的解决方案。 - daedsidog

0
正如接受的答案所提到的,对于当前版本的Orgmode来说似乎不可能做到这一点,但是这里提供了一个解决方法,使得非常接近“仅强调单词的某些部分”。
(*Class*)es

(*Method*)s

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接