【问题标题】:How to escape single quotes in reStructuredText when converting to HTML using Sphinx使用 Sphinx 转换为 HTML 时如何在 reStructuredText 中转义单引号
【发布时间】:2013-07-31 08:47:39
【问题描述】:

对于我正在编写的文档项目,我需要包含一个带有日期格式字符串的表格。现在几乎一切正常,但最后我遇到了一个小问题,我想打印一个文字 ' 引号和两个文字引号(分别在其他引号之间)。 Sphinx 将这些更改为上/下引号,这通常看起来非常整洁,但在这种特殊情况下会使文本不可读。我能想到的最好的方法是:

======   ===========   ======  =====================
``'``    Escape for            | " ``'`` hour ``'`` h" -> "hour 9"
         for text 
         Delimiter
``''``   Single                | "ss ``''`` SSS" -> "45 ``'`` 876"
         quote 
         Literal  
======   ===========   ======  =====================

这会产生所有正确的引号,但它会在前后插入额外的空格,我希望将其删除,因为该示例在语法上不正确。因此,也可以将我的问题改写为:如何在使用反引号时删除文字引号前后的多余空格。

我已经尝试过标准的逃跑方式。反斜杠无效,因为 ' 不是 reStructuredText 特殊字符。如果我删除空格,反引号 `` 将不再起作用。

带有额外空格的示例输出:

【问题讨论】:

    标签: python python-sphinx restructuredtext docutils


    【解决方案1】:

    正如 cmets 中的其他人所提到的,Sphinx 将普通的" 变为卷曲的 等等的过程称为 SmartQuotes。

    我不确定您是否一开始就特别想要文字,或者它们是否只是避免 SmartQuotes 的一种妥协,但是(至少)有两种方法可以在不需要使用的情况下停止 SmartQuotes文字:

    1.为整个项目禁用 SmartQuotes:

    如果您不想要 SmartQuotes,请添加:

    smartquotes = False
    

    致您的conf.py file

    或者添加一个与conf.py同级的docutils.conf文件,内容如下:

    [parsers]
    smart_quotes: no
    

    (来自this GitHub issue 的解决方案;请参阅Sphinx documentation 了解这两个设置如何交互 - TL;DR:即使在conf.py 中打开它们,在docutils.conf 中关闭也会覆盖)

    2。转义你不想“聪明”的个别引用:

    您可以使用双反斜杠\\ 来转义您想要直的引号,例如\\'\\"。所以在你的例子中,这个:

    "\\'hour\\'h" -> "hour 9"
    "ss\\'\\'SSS" -> "45\\'876"
    

    会给出以下输出:

    “'hour'h” -> “hour 9”
    “ss''SSS” -> “45'876”
    

    外部双引号保留为“智能”,但我认为这是您想要的行为。

    (转义详情见official docutils documentation

    【讨论】:

      【解决方案2】:

      我刚刚在文档中找到了答案:

      http://docutils.sourceforge.net/docs/ref/rst/restructuredtext.html#inline-markup

      事实证明,您可以通过在空格字符之前使用反斜杠“\”来转义空格字符。所以“\”将被渲染为“”。这对于您需要使用空格进行格式化但不希望显示该空格的情况很有用,就像我上面的问题一样。

      所以解决办法是:

      ======   ===========   ======  =====================
      ``'``    Escape for            | "\ ``'``\ hour\ ``'``\ h" -> "hour 9"
               for text 
               Delimiter
      ``''``   Single                | "ss\ ``''``\ SSS" -> "45\ ``'``\ 876"
               quote 
               Literal  
      ======   ===========   ======  =====================
      

      难读,但有效。

      函数调用的内联格式的另一个例子:

      **dateformat (**\ *<string,number,void>* **sourceDate,** *string* **sourceDateFormat,** *string* **returnDateFormat)**
      

      事实证明,这是使格式正确的唯一方法(变量类型为斜体,其余为粗体,左括号和变量类型之间没有空格)。

      【讨论】:

        【解决方案3】:

        好吧,不确定您认为哪些部分间距不正确,但最左边的引号在屏幕截图中没有多余的空格,这就是单引号在等宽字体中呈现的方式。至于右列,为什么不用双反引号将整个单元格括起来呢?这也扼杀了“聪明”的报价,我认为这就是你想要的。

        ``ss '' SSS" -> "45 ' 876"``
        # could instead be this, if these were the spurious spaces
        ``ss''SSS -> "45'876"``
        

        否则您无法摆脱双反引号跨度周围的间距 - 就解析器而言,它们构成一个“单词”,并且由作者来处理 之间的空格 单词。在您需要控制空格的地方,它不是“散文”,而是文字部分,整个空格重要的文本应该双反引号。

        现在,如果您想在反引号部分中添加“智能”引号,我认为您需要走字符实体引用路线,但我不知道那会是什么样子- 应该在文档中。

        【讨论】:

        • 啊,是的,我已经尝试过了,但关键是我不希望所有文本都被解释为文字,我只想摆脱“智能”引号。将所有字母和数字都设置为文字是不可接受的,因为它会弄乱表格的样式,因为某些文本会是等宽的,而其他文本不会。
        • 有一个设置可以禁用smart quotes globally,但这不会修复内联文字周围的空白。但我仍然认为你在这里想要的是一个内联文字:如果文本的间距和引号样式很重要,它 一个内联文字,它不应该 看起来与描述性标签文本相同(例如“单引号文字”)。智能引号是散文的印刷精美;如果有问题的文本不能以这种方式转换而不会失去意义,那么该字符串就是文字。
        猜你喜欢
        • 2013-06-03
        • 1970-01-01
        • 2012-05-30
        • 1970-01-01
        • 2015-06-27
        • 2011-05-11
        • 1970-01-01
        • 1970-01-01
        • 2017-01-08
        相关资源
        最近更新 更多