max*_*ner 9 markdown github-flavored-markdown
我有一个包含六个列表的自述文件。
一切正常,直到倒数第二个列表。问题是在这些列表项之间出现了一个额外的换行符。截图会更清楚:
我在 sublime text 中使用 Markdown Preview 包,如果我使用 Github Markdown 预处理器进行预览,我会看到相同的格式问题。
然而,最奇怪的是,如果我将文本输入到https://jbt.github.io/markdown-editor 中,我不会看到同样的问题
如果您想自己尝试,请使用以下字符串:
_git_
- **gl**: `git log <optional args>` _shows the revision history_
- **gpoh**: `git push origin head` _pushes the current branch_
- **gpom**: `git push origin master` _pushes the master branch_
- **grv**: `git remote -v` _lists the remotes_
- **gs**: `git status` _shows unstaged & staged changes_
- **gacm**: `git add -A; git commit -m "<message>"` _commits all changes with a message_
- **gacm-lfs**: `sudo git add -A; sudo git commit -m <message>` _it might not be this way for everyone,
but for me `sudo git` uses git-lfs (git large filesystem) while `git` uses regular git. This function
adds and commits all files with a message in a git-lfs repo._
- **gc**: `git checkout <branch>` _changes branches_
- **gclo**: `git clone <repo>` _clones a repo_
- **get_branch**: `git branch -f origin/<branch>; git checkout <branch>` _gets a specific branch from a remote repo_
_fish meta functions_
- **backup_functions**: `cd ~/.config/fish/functions; git add -A; git commit -m "<message>"; git push origin master; cd -` _backups the functions folder into a repo_
- **cdfns**: `cd ~/.config/fish/functions` _changes into the functions dir_
- **cfn**: `cat ~/.config/fish/functions/<name>.fish` _shows the definition of a function_
- **efn**: `nano ~/.config/fish/functions/<name>.fish` _edits a function's definition (using nano)_
- **fn**: `echo -e "function $argv[1]\n $argv[2]\nend" > ~/.config/fish/functions/$argv[1].fish` _create a function_
- **fns**: `ls ~/.config/fish/functions` _list functions_
- **rmfn**: `rm ~/.config/fish/functions/<name>.fish` _remove a function_
- **fndoc**: `echo -e "- <text>" >> ~/.config/fish/functions/README.md` _adds a line to the readme documenting a function_
- **fs**: `funcsave <name>` _alias for funcsave, e.g.:_
function fs
funcsave $argv
end
fs fs
Run Code Online (Sandbox Code Playgroud)
您的第一个列表是“紧密”列表,而第二个列表是“松散”列表,因为它在其中一个列表项中包含代码块。如果您希望列表匹配,请对两者使用相同的类型。在第一个列表的项目之间添加一个空行将使它们匹配。正如规范解释的那样:
如果列表的任何组成列表项由空行分隔,或者如果其任何组成列表项直接包含两个块级元素,并且它们之间有一个空行,则列表是松散的。否则列表很紧。(HTML 输出的不同之处在于松散列表中的段落被
<p>标签包裹,而紧密列表中的段落则不是。)
作为一个简单的例子,这个列表:
* line 1
* line 2
Run Code Online (Sandbox Code Playgroud)
将呈现为此 HTML:
<ul>
<li>line 1</li>
<li>line 2</li>
</ul>
Run Code Online (Sandbox Code Playgroud)
而这个列表:
* line 1
* line 2
a second block
Run Code Online (Sandbox Code Playgroud)
将呈现为:
<ul>
<li>
<p>line 1</p>
</li>
<li>
<p>line 2</p>
<p>a second block</p>
</li>
</ul>
Run Code Online (Sandbox Code Playgroud)
请注意,第二个列表项包含多个段落。因此,列表项中的每个段落都包含在<p>标签中,使列表成为“松散”列表。为了保持一致性,列表中的所有项目都被包装在<p>标签中(包括第一个项目)。虽然该示例使用了一个段落,但这同样适用于任何块级构造,包括示例中的代码块。
您还可以通过在列表项之间添加一个空行来强制列表为“松散”列表。例如,这个列表:
* line 1
* line 2
Run Code Online (Sandbox Code Playgroud)
此 HTML 中的结果:
<ul>
<li>
<p>line 1</p>
</li>
<li>
<p>line 2</p>
</li>
</ul>
Run Code Online (Sandbox Code Playgroud)
因此,如果您在第一个列表中的至少两个项目之间添加一个空行,则两个列表将始终显示,并在它们之间留有一些空白。
将列表项的内容包装在<p>标签中会增加空白的原因是页面 (CSS) 的样式已经定义了填充和/或边距<p>标签的。人们可以编辑 CSS 以在他们自己的站点上删除此填充/边距,但在第三方主机上,这通常不是一种选择。
至于为什么有些工具似乎没有表现出这种行为;可能是因为它们具有默认的 CSS 样式,导致两种类型的列表看起来相同(例如 StackOverflow 就是这样做的)。另一种可能性是他们使用的是老式的 Markdown 解析器,而不是更新的 CommonMark 规范(GitHub 使用的)。原版Markdown 规则也有松散列表和紧密列表的概念,但行为没有那么明确定义,因此不同的实现行为略有不同。许多人遵循参考实现,只使与空行相邻的列表项“松散”,而所有其他项“紧密”。在您的示例中,只有最后一项是“松散”的,但由于它是列表中的最后一项,因此不会那么明显。为了比较各种实现的行为方式,巴别马克。
无论实现如何,如果您想要“紧密”列表,始终获得它的唯一方法是永远不要在列表项中的任何位置包含任何空行。这意味着你永远不能嵌套其他块级构造,除了一些非常具体的例外:
明显的例外是嵌套列表,但即便如此,您也需要避免空行(参见示例):
* parent item
* nested item
* Another nested item
* sibling of parent
* Another sibling of parent
Run Code Online (Sandbox Code Playgroud)嵌套代码块或块引用可以在某些实现中嵌套,但它需要从列表项的第一行开始并且不包含空行。
* list item
* A code block because it is indented appropriately
* > a blockquote
* a list item
Run Code Online (Sandbox Code Playgroud)
正如您在该示例中看到的那样,它仅适用于某些实现。值得注意的是,CommonMark 实现。换句话说,它可以在 GitHub 上运行,但可能不适用于其他工具或其他站点。
无论如何,如果您有多个子段落、代码块和/或块引用,则不能有一个紧凑的列表。