3

请参阅 CommonMark 规范中示例 6 之前的描述:http ://spec.commonmark.org/0.27/#example-5

我试图了解以下代码如何导致以两个空格开头的代码块。

>→→foo

示例 6 表明这将转化为以下内容。

<blockquote>
<pre><code>  foo
</code></pre>
</blockquote>

但第 2.2 节明确指出:

但是,在空格有助于定义块结构的上下文中,制表符的行为就像它们被替换为具有 4 个制表位的空格一样。

因此,根据我的理解,上述 Markdown 的行为如下(我用点表示空格)。

>........foo

由于在 之后允许有一个可选空格>,并且使用 4 个空格来缩进代码块,因此我们得到了,

>...foo

这是一个以三个空格开头的代码块。那么 CommonMark 如何声称它应该导致一个以两个空格开头的代码块?我错过了什么?

4

1 回答 1

2

关键在Tabs部分的第一段(强调添加):

行中的制表符不会扩展到空格。但是,在空格有助于定义块结构的上下文中,制表符的行为就像它们被替换为具有4 个制表位字符的空格一样。

请注意,这是“4 个字符”而不是 4 个空格。

如果您将文本编辑器配置为使用长度为 4 的制表位并空格替换制表符(任何好的文本编辑器都应该提供此设置),文本编辑器将使用四个字符宽的列。当您按 Tab 键时,它会将光标转发到下一列,每列只有四个字符宽。如果该列已经包含任何字符,则只添加与总共四个字符一样多的空格,在这种情况下将少于四个空格。

例如,如果您>在编辑器中键入尖括号 ( ) 字符,然后按 Tab,您将得到以下信息(当配置为用空格替换制表符时):

>···

因此尖括号加上制表符向前移动到列的末尾(四个字符),总共三个空格。由于我们现在位于下一列的开头,再次按 Tab 键会将我们移至下一列(另外 4 个空格),总共7 个空格

>·······

我们可以通过最近对3bc01c5dc中提交的规范的更改(显然尚未发布)来确认这是正确的解释。正如提交评论所暗示的,澄清有助于数学更有意义(强调):

通常>,以块引用开头的 可以可选地后跟一个空格,这不被视为内容的一部分。 在以下情况下>,后跟一个制表符,它被视为扩展为三个空格 由于其中一个空格被认为是分隔符的一部分,因此foo被认为在块引用上下文内缩进了六个空格,因此我们得到了一个以两个空格开头的缩进代码块。

请注意添加的句子(粗体),它确认第一个选项卡仅添加了“三个空格”。

因此,正如我们现在所建立的,我们从一个尖括号加上七个空格开始。所以首先我们断开块引用分隔符,它由尖括号和第一个空格组成(在以下示例中,|用于指示解析器在何处断开字符串并且不应计为字符):

>·|······

块引用中包含的文本现在缩进了六个空格。其中四个是代码块分隔符:

>·|····|··

这在代码块的开头留下了两个空格。

当然,正如开头(规范中的部分)所述,制表符实际上并没有被空格替换,它只是表现得好像它们是一样的。这有时会让人感到困惑。将文本编辑器配置为始终用空格替换制表符可能会有所帮助,这样您就可以避免这种混淆。

于 2017-04-10T14:45:29.940 回答