请考虑以下Markdown代码:

This is some regular text.

    >>> def factorial(n):
    ...     return 1 if n < 2 else n * factorial(n - 1)
    ... 

* This is a list item.

    >>> def factorial(n):
    ...     return 1 if n < 2 else n * factorial(n - 1)
    ... 


请注意,第二个代码块的前面是列表项。

为什么在这种情况下不能正确格式化析因代码?为了演示该问题,我将插入上面显示的Markdown代码:


这是一些常规文本。

>>> def factorial(n):
...     return 1 if n < 2 else n * factorial(n - 1)
... 




这是一个列表项




def factorial(n):
...如果n返回1 <2 else n *阶乘(n-1)
...







这适用于编号以及未编号的列表。

评论

我认为您需要重新考虑此问题并更改接受的答案。

@Mark:你是对的。 Balpha的答案更具参考价值,并且提供了更优雅的解决方法。因此,将其更改:)

Otiel的回答反映了当前的文档,因此,不管当前的投票如何,它都应该是公认的答案。

@DonaldDuck:对该问题的公认答案说明了该错误为何不可修复的原因,这是一个宝贵且非常独特的答案,无法以任何有意义的方式发布到另一个问题。因此,它们不是重复项。

@DonaldDuck这个问题早于被建议为骗子的那个问题,因此,即使他们是彼此的骗子,也应为此骗另一个

@James年龄无关紧要。此外,在此特定情况下,另一个问题被标记为[faq],并且关闭FAQ确实没有任何意义。

#1 楼

不幸的是,这在Markdown规范中是模棱两可的。降价来源:

42. list item

    more text


可以表示两件事。其中之一是您所期望的:more text跟随空白行并缩进四个空格,使其成为顶级(即,不在列表中)代码块。

第二个可能的含义是:


列表项可能包含多个段落。列表项中的每个后续段落都必须缩进4个空格或一个制表符:

1.  This is a list item with two paragraphs. Lorem ipsum dolor
    sit amet, consectetuer adipiscing elit. Aliquam hendrerit
    mi posuere lectus.

    Vestibulum enim wisi, viverra nec, fringilla in, laoreet
    vitae, risus. Donec sit amet nisl. Aliquam semper ipsum
    sit amet velit.



–换句话说,more text是常规的第二段在列表项中。

两种含义中的哪一种是预期的,这是无法区分的。两者都是正确的。 Markdown转换器(实际上是所有这些转换器)选择的是第二个含义。

解决此问题的唯一方法是在Markdown中添加其他语法,使您能够区分两者。但是,我无法考虑要进行任何直观和不干扰的事情,因此使用此处的一种变通办法是一样好的。顺便说一下,我的首选解决方法是将HTML注释改为:

* list item

<!-- -->

    code


变成这样:


<列表项



code



–但是,使用哪一个都不重要。底线是:尽管很难过,但这是无法修复的。

评论


很好的解释!

–亨德里克·沃格特(Hendrik Vogt)
2011年7月24日在9:19

I've been throwing in   inbetween when this became an issue. I'll be doing this from now on.

– Jeff Mercado
Jul 24 '11 at 10:26

我猜Markdown转换器选择第二种含义是两者中最好的,因为那时仍然可以使用上述替代方法来迫使它不这样做。如果转换器不将其添加到列表项本身,将无法强迫它这样做? (即使第一行末尾的两个空格也无济于事,因为接下来的几行将不会被格式化为代码。)

– Arjan
2011年7月24日在14:08

<!-->修复非常有用,谢谢。 :)

–机密
13年1月18日在22:20

当我放置两个有序列表的项并为其编码时,即使您将数字1放在第一和将2.放在第二,也得到两个项1,这都不起作用。

– jcubic
2013年12月4日7:18

@jcubic在这种情况下(这是通常的情况),您希望代码显示在列表中,而不是在列表之后。通过将代码缩进八个空格(列表的四个空格和使其成为代码的四个空格)绝对是可能的。这个问题只是关于极少数情况,您希望代码出现在列表的正下方,但位于列表的外部。

– balpha
2013年12月4日7:22

也许是主观的,但是:将代码段放在列表后面似乎是次优的写作习惯(好吧,这是使用过多裸露的项目符号列表的不良做法的“子集”);它几乎总是会破坏文本的叙述。每当我遇到这个问题时,我最终都会意识到最好的事情就是添加“例如”或其他任何东西。因此,事实上,我从不关心这个问题:它只让我想起写得不好的问题。

–阿洛瓦·马哈德(Alois Mahdal)
15年3月30日在16:25

IOW,我一直认为这是一条隐藏的消息,即项目符号点列表和代码段不彼此相邻(尽管它们可能彼此内部)。

–阿洛瓦·马哈德(Alois Mahdal)
2015年3月30日在16:28



@AloisMahdal我可以编写满足两个条件的代码; (1)一和(2)二。 echo“ moo” ...我敢肯定,可以避免这种情况,但您能解释一下这是多么糟糕的写作吗? (我会很容易地承认这个特殊的例子不是很好的写作。)

–tripleee
16年8月4日在12:47

@tripleee抱歉,但我不理解该示例(甚至可以在评论中显示?)

–阿洛瓦·马哈德(Alois Mahdal)
16年8月5日在1:03

是的,这有点尴尬。但是,理解该示例可能不是解释为什么您认为这种构造有问题的前提。

–tripleee
16年8月5日在5:24

有趣的是,Sublime Text 3呈现了代码块。这是我发现的唯一执行此操作的编辑器。

–马特·塞弗顿
18年3月15日在13:11

#2 楼

我注意到,当代码作为列表项的一部分出现时,通常必须在任何代码之前添加8个空格,而不是4个空格。

<- 4 spaces




列表项(此后空一行):

<- 8 spaces




评论


啊哈因此,Markdown会将代码视为列表项的一部分。语义上略有不同。另外,我认为然后应该升级ctrl-k的功能,使其在0、4和8个空格(而不是仅0和4)之间循环。也许还有12个空格,用于嵌套列表。也许那可能是一个单独的功能请求?

– Stephan202
09年7月7日在19:08

即使您不希望代码成为项目符号的一部分,这似乎也是正确的。我试图发布一个带有2个项目符号问题和代码的问题。

– IAbstract
2010-2-14在5:00

它不只是8个空格,而是4个空格加上每个缩进级别4个空格。 (至少现在是这样。)

– Badp
10年7月25日在18:56



@ Stephan202-您是否曾为此提出过单独的功能要求?

– JoshDM
13年8月29日在15:47

@JoshDM:不,我没有。随时这样做!

– Stephan202
13年8月30日在9:00

这种解决方法是完美的。

– Tomas
2014年3月18日在20:00

效果很好。

–冰
2014年7月21日在9:33

@IAbstract似乎我击败了你,即使四年后。 :)meta.stackoverflow.com/questions/278228/…遇到了同样的问题,但是使用了balpha的出色解决方法,一切正常。但是,我留下了“错误的”代码,以便人们可以看到不同之处。

–syntaxerror
2014年12月2日于1:30



@syntaxerror:迟到总比没有好。

– IAbstract
2014年12月2日在13:27

@IAbstract阿们! :)但是总有一件我永远不会理解的事情:为什么有些人总是渴望在meta中拒绝重复的答案?瞧,有无数的metas。一旦有人在SO meta中发布了相同的问题,我就不一定会看到它,因为我在* .SE.com metas中更加活跃。

–syntaxerror
2014年12月2日13:34

@syntaxerror:我不用担心它们在元站点上(顺便说一句,我没有对它进行投票:))。

– IAbstract
2014年12月2日13:37



我也不认为你做到了!

–syntaxerror
2014年12月2日,13:53

#3 楼

在markdown编辑帮助中实际上是要添加8个空格而不是简单地4个的解决方法:


(...)
(...)
(...)

列表项中的预格式化文本:

Skip a line and indent eight spaces.
That's four spaces for the list
and four to trigger the code block.




评论


添加8个空格会将其变成列表中的代码块。通常希望改为结束列表。

– Mark Ransom
2012年10月3日15:09

#4 楼

这是一个糟糕的解决方法,但是您可以插入一个反引号的空格来欺骗它。在这些反引号中放置一个空格,它应该起作用:



这是一个列表项。

``

>>> def factorial(n):
...     return 1 if n < 2 else n * factorial(n - 1)
...



请参见?


这是一个列表项。



>
>>> def factorial(n):
...     return 1 if n < 2 else n * factorial(n - 1)
...


评论


啊哈,不错的技巧:)

– Stephan202
09年7月7日在19:09

仅当代码块与列表项无关时,这才是适当的。

–布拉德·吉尔伯特(Brad Gilbert)
09年7月21日在16:21

+1当我看到这个时,我准备问一个有关格式化R代码的问题。 8个空间黑客做到了。

– DaveParillo
09年11月6日在5:21

@Brad Gilbert-这是一种常见的情况,如果您想获得一个点列表,并紧随其后的是与答案(而不是最终列表)相关的代码示例。 (即可能大部分时间。)

– GalacticCowboy
2010-6-29在15:09

我使用水平尺,它具有相同的效果,但实际上融合得更好。

– GalacticCowboy
2010-6-29在15:10

balpha的答案更好,因为它不会留下多余的空格或其他不需要的字符。

– Mark Ransom
2012年10月3日15:11



#5 楼

我很高兴有解决此问题的方法,但这确实是一个应修复的错误。我只是浪费了太多时间试图弄清楚为什么我不能在...之后添加代码块。


子弹1。
子弹2。

粘贴以下代码:

this.IsCode = true;


所以这是我尝试的8个空格。


子弹1.
子弹2.

粘贴以下代码:

this.IsCode = true;
this.IsAlsoCode = true;


好每行代码都需要加8个空格(而不是通常的4个空格)。


评论


@ user155609然后,请说明如何使用现有语法从项目符号项后面的代码块中清除多段落项目符号项的歧义?

–tripleee
16年8月4日在12:51

#6 楼

我刚刚找到了解决方法。

如果您在列出的项目后面加上</ul>。该问题将得到解决。



评论


您也可以将放在此处,其结果相同。或使用评论,如我在回答中所说。您的版本的缺点是:a)可能会引起细微的错误,并且b)完全不受编辑您的问题的人的注意。

– balpha
2013年6月21日12:55



@balpha:是的,这是正确的。感谢您的评论。

– Midhun议员
13年6月21日在13:09

使其显而易见

– gman
17年11月27日在5:25

#7 楼

这只是碰到。我正在寻找答案。所有变通办法都是hacky。因此,如果您想获得最语义上良性的解决方法,则应该采用以下方法:

- A list item.

<!-- language: lang-c++ -->

    int k = 1;
    char *something = "example";


,即在代码块之前使用显式语法高亮替代(使用该帖子中使用的适当语言,或使用default)。无论如何,这都是可以接受的,因此它不是一些奇怪的hacky HTML标记,空注释或任何其他内容。由于此功能是正常使用,因此也不会冒任何危险或将来看起来很奇怪。

上面的代码产生了以下内容:



列表项。

 int k = 1;
char *something = "example";
 


#8 楼


您可以在代码周围使用<pre><code>块,而不用缩进4个空格或制表符。某些字符可能必须转义,例如<

print "<code>"


markdown中的上述行是<pre><code>print "&lt;code>"</code></pre>

#9 楼

我在有序列表和代码开始使用相同的4个空间规则后放置了<br\>