跳到主要内容

markdown 的一些常见问题

提示

本段为在使用markdown时可能会出现的一些问题,有一些由deepseek回答。


居中、右对齐​

在 Markdown 中,原生语法并不直接支持文本对齐(居中、右对齐),但可以通过嵌入 HTML 来实现。具体方法取决于你的 Markdown 渲染环境(比如 GitHub、VS Code、Typora 等)。

1. 使用 HTML 标签(最通用)​

这是最可靠的方法,在大多数支持 HTML 的 Markdown 渲染器(包括 GitHub)中都能生效。

居中对齐:

<div align="center">这段文字居中</div>

或者用 <p> 标签:

<p align="center">这段文字居中</p>

右对齐:

<div align="right">这段文字右对齐</div>

左对齐(默认,但也可显式指定):

<div align="left">这段文字左对齐</div>

2. 在表格中实现对齐​

如果你只是想对齐表格里的内容,Markdown 表格语法本身就支持:

| 左对齐 | 居中对齐 | 右对齐 |
| :--- | :---: | ---: |
| 内容 | 内容 | 内容 |
  • :--- 左对齐
  • :---: 居中对齐
  • ---: 右对齐

3. 对图片、徽章等元素对齐​

你之前提到的徽章,也可以用同样的方式包裹起来居中:

<div align="center">
<img src="https://img.shields.io/badge/example-brightgreen" alt="badge">
</div>

⚠️ 注意事项​

  • GitHub:完全支持 <div align="..."> 和 <p align="...">。
  • VS Code 预览:支持 HTML 标签。
  • Typora:支持 HTML,但部分主题可能样式有差异。
  • 某些纯 Markdown 解析器(如部分静态博客生成器):可能会过滤掉 HTML 标签,此时对齐会失效。如果遇到这种情况,需要查看该平台是否提供了自定义 CSS 或短代码的方式。

补充:如果 HTML 被禁用​

极少数环境下 HTML 会被完全过滤,这时 Markdown 本身没有替代方案。可以考虑:

  • 使用平台提供的自定义 CSS(如 Hugo、Jekyll 的样式覆盖)。
  • 用表格模拟对齐效果(把内容放在单元格里)。
  • 使用图片替代文字(不推荐,不利于可访问性)。

总结:优先用 <div align="center"> 或 <p align="right">,这是兼容性最好的做法。


段首缩进​

在 Markdown 中,原生语法会忽略段首的空格和制表符,所以直接敲两个空格或一个 Tab 是无效的。要实现段首缩进两个字符,需要借助 HTML 或特殊字符。

1. 使用 HTML 的 text-indent(最推荐)​

通过 <p> 标签加上内联样式,可以精确控制缩进:

<p style="text-indent: 2em;">这是需要缩进两个字符的段落。</p>
  • 2em 表示缩进两个字符宽度(em 是相对当前字体大小的单位,一个 em 约等于一个汉字宽度)。
  • 这种方法在 GitHub、VS Code 预览、Typora 等支持 HTML 的环境中都能生效。

如果你想让整篇文章的所有段落都自动缩进,可以在文章开头用一个 <style> 块统一设置(注意:GitHub 会过滤 <style> 标签,但个人博客、Typora 等环境通常支持):

<style>
p {
text-indent: 2em;
}
</style>

2. 使用全角空格(兼容性最好,但不够优雅)​

直接插入两个全角空格(Unicode 字符 U+3000),因为全角空格不会被 Markdown 忽略:

  这是需要缩进两个字符的段落。
  • 复制上面这行开头的两个全角空格即可。
  • 优点:不依赖 HTML,几乎所有 Markdown 渲染器都支持。
  • 缺点:需要手动复制,且在某些代码编辑器里看起来和普通空格相似,不易区分。

3. 使用 &emsp; 实体(HTML 实体)​

&emsp;&emsp;这是需要缩进两个字符的段落。
  • &emsp; 是一个全角宽度的空格(em space),两个就是两个字符宽度。
  • 同样依赖 HTML 实体支持,GitHub 支持。

4. 使用 &nbsp;(不推荐)​

&nbsp;&nbsp;&nbsp;&nbsp;这是缩进。
  • &nbsp; 是不换行空格,但它是半角宽度,通常需要 4 个才约等于两个汉字宽度,而且不同字体下宽度不一致,不够精确。

⚠️ 注意事项​

  • GitHub:支持 <p style="text-indent: 2em;">、&emsp;、全角空格;会过滤 <style> 标签。
  • Typora:支持以上所有方式,且 <style> 也生效。
  • VS Code 预览:支持 HTML 标签和实体。
  • 纯 Markdown 解析器(部分静态博客):可能过滤 HTML,此时全角空格是最稳妥的兜底方案。

总结​

方法精确度兼容性推荐场景
<p style="text-indent: 2em;">高较好单段缩进,GitHub/Typora
全角空格   高最好兼容性优先,任何环境
&emsp;&emsp;高较好不想复制特殊字符时
&nbsp; × 4低好不推荐

日常使用推荐 <p style="text-indent: 2em;">,如果发现渲染器过滤了 HTML,再退回全角空格。


指数和下标​

你提到的“指数下标”,在文档和博客里通常指数学公式中的上标(指数)和下标。在 Docusaurus 中,标准 Markdown 并不直接支持上下标,但可以通过 HTML 标签或数学公式插件来实现。

🔤 方法一:使用 HTML 标签(最简单)​

Markdown 兼容 HTML,所以你可以直接用 <sup>(上标)和 <sub>(下标)标签。这是最轻量的方式,不需要额外配置。

水的化学式是 H<sub>2</sub>O,质能方程是 E = mc<sup>2</sup>。

也可以组合使用,比如 x<sup>2</sup><sub>i</sub>。

渲染效果:水的化学式是 H₂O,质能方程是 E = mc²。

这种方式的好处是即写即用,适用于简单场景。缺点是无法处理复杂的数学排版,比如分数、积分、矩阵等。

📐 方法二:使用数学公式插件(推荐用于复杂公式)​

如果你需要写真正的数学公式,Docusaurus 官方推荐使用 remark-math 和 rehype-katex 插件,它们基于 KaTeX,渲染速度快且样式美观。

1. 安装依赖​

npm install remark-math rehype-katex
npm install katex

2. 在 docusaurus.config.js 中配置​

docusaurus.config.js
import remarkMath from 'remark-math';
import rehypeKatex from 'rehype-katex';

export default {
presets: [
[
'@docusaurus/preset-classic',
{
docs: {
remarkPlugins: [remarkMath],
rehypePlugins: [rehypeKatex],
},
blog: {
remarkPlugins: [remarkMath],
rehypePlugins: [rehypeKatex],
},
},
],
],
// 引入 KaTeX 的 CSS 样式
stylesheets: [
{
href: 'https://cdn.jsdelivr.net/npm/katex@0.16.9/dist/katex.min.css',
type: 'text/css',
integrity: 'sha384-n8MVd4RsNIU0tAv4ct0nTaAbDJwPJzDEaqSD1odI+WdtXRGWt2kTvGFasHpSy3SV',
crossorigin: 'anonymous',
},
],
};

3. 在 Markdown 中书写公式​

配置完成后,就可以使用 LaTeX 语法了:

行内公式:$E = mc^2$

块级公式:
$$
\int_{-\infty}^{\infty} e^{-x^2} dx = \sqrt{\pi}
$$

下标示例:$a_{i,j}$,上标示例:$x^{2n}$

渲染效果:行内公式会嵌入文字中,块级公式会居中独占一行,上下标会自动以数学排版的标准样式呈现。

💎 总结​

需求推荐方法说明
简单上下标(化学式、平方等)HTML 标签 <sup> / <sub>无需配置,即写即用
复杂数学公式(积分、分数、矩阵等)remark-math + rehype-katex需要安装配置,但功能强大、排版专业

如果你只是偶尔需要写一两个上下标,用 HTML 标签就足够了。如果文档涉及较多数学内容,建议直接配置 KaTeX 插件,后续写作会方便很多。


徽章​

提问:

项目的README.md中的这个按钮是如何实现的?是否有网站或开源项目保存这些按钮?如下uv的README.md。

Latest PyPI versionSupported Python versionsDiscord
<a href="https://pypi.python.org/pypi/uv"><img src="https://img.shields.io/pypi/v/uv.svg" alt="Latest PyPI version" /></a>
<a href="https://pypi.python.org/pypi/uv"><img src="https://img.shields.io/pypi/pyversions/uv.svg" alt="Supported Python versions" /></a>
<a href="https://discord.gg/astral-sh"><img src="https://img.shields.io/badge/Discord-%235865F2.svg?logo=discord&logoColor=white" alt="Discord" /></a>

你看到的这些按钮通常被称为“徽章”(Badges),它们主要是通过 shields.io 这个服务生成的。这个服务会根据你提供的参数,动态生成一个SVG格式的图片,然后显示在你的README.md里。

⚙️ 核心实现解析​

以你提供的uv项目的徽章为例,可以拆解成两种主要类型:

  1. 动态信息徽章(展示版本、下载量等)

    • 示例:<a href="https://pypi.python.org/pypi/uv"><img src="https://img.shields.io/pypi/v/uv.svg" alt="Latest PyPI version" /></a>
    • 原理:这种徽章的图片URL指向了shields.io的一个特定API端点(如 /pypi/v/uv)。当你的README被加载时,shields.io会实时去PyPI查询uv这个包的最新版本号,然后生成并返回一个显示该数字的徽章图片。
  2. 静态内容徽章(展示固定文字、Logo等)

    • 示例:<a href="https://discord.gg/astral-sh"><img src="https://img.shields.io/badge/Discord-%235865F2.svg?logo=discord&logoColor=white" alt="Discord" /></a>
    • 原理:这类徽章的信息是直接编码在URL里的。
      • badge/Discord-%235865F2.svg 这部分指定了左侧文字是Discord,右侧文字是颜色代码#5865F2。
      • ?logo=discord&logoColor=white 是查询参数,用来添加一个来自 Simple Icons 库的Discord Logo,并把Logo颜色设为白色。

📚 资源与工具推荐​

确实有很多项目专门用来生成和管理这些徽章。

  • 徽章“大本营”:

    • shields.io: 这是最重要的网站,你可以在它的官网上浏览所有可用的徽章样式,并通过交互式表单生成自己需要的URL。
    • Naereen/badges: 这是一个非常全面的GitHub仓库,收集了各种常见且可直接复制使用的徽章代码,是个不错的“菜谱”。
  • 辅助工具与项目:

    • BadgeGenerator: 一个Python工具,可以通过配置文件批量生成徽章,适合需要维护大量徽章的项目。
    • shieldbadger: 一个Go包,可以将生成的徽章图片保存在本地,避免每次加载都依赖网络。
    • pypi-chart-badge: 一个专门用来生成PyPI包下载趋势图徽章的GitHub Action。

如果未来你想为项目添加更多个性化的徽章(比如展示技术栈),可以试试直接在 shields.io 的网站上用静态徽章功能配合 ?logo= 参数来生成,过程很直观。


告示​

提问:

有哪些类似以下的.md样式

:::tip

Use the power of React to create interactive blog posts.

你看到的 :::tip 是 Docusaurus 里一种非常实用的 Markdown 扩展语法,叫做 “告示” (Admonitions),或者叫“提示框”、“警告块”。它专门用来把某段内容高亮出来,吸引读者的注意力。

除了 tip,Docusaurus 还内置了其他几种类型的告示,你可以根据内容的性质和重要程度来选用:

类型语法适用场景
备注:::note用于提供一些补充说明或上下文信息,语气相对中性。
信息:::info用于提供一些重要的事实或一般性信息。
提示:::tip用于分享有用的技巧、最佳实践或快捷方法,就像你例子里的那样。
警告:::warning用于提醒用户注意潜在的问题、风险或容易被忽略的细节。
危险:::danger用于警示非常严重的后果,比如数据丢失或系统崩溃风险,语气最为强烈。

✍️ 如何编写和定制告示​

告示的语法很简单,用三个冒号 ::: 开头,后面跟上类型,内容写在中间,最后再用三个冒号 ::: 结尾就行。

:::tip

Use the power of React to create interactive blog posts.

:::

你也可以给告示加上自定义标题,让提示更清晰:

:::tip[你知道吗?]

Use the power of React to create interactive blog posts.

:::

如果内容比较复杂,告示还支持嵌套,并且里面也可以直接写 JSX 或 React 组件。