序
什么是 Markdown
Markdown 是用来编写结构化文档的一种纯文本格式,目标是让我们在双手不离开键盘的情况下,可以对文本进行一定程度的格式排版。
Markdown 既是一套标记语法,这些标记字符就是用来赋予文字不同格式,也能将标记字符进行转换,最终呈现出我们想要的排版效果。能编辑 Markdown 的软件,就叫 Markdown 编辑器。
可简要看一下 Markdown 语法参考:https://commonmark.org/help/
什么是 Typora
Typora 是一款支持实时预览的 Markdown 文本编辑器。
Typora 区别于其它 Markdown 文本编辑器的地方就是实时预览,Markdown 语法的标记都在实时预览中消去了(可以通过文档左下方的</>
在源码与效果间进行切换)。结合一些常用快捷键即可快速编排文档,对格式和图像的处理较为友好。
*注:WPS软件也已经支持 Markdown 了,依次选择“新建->新建智能文档->空白智能文档”(也有很多模板),而且会自动添加成云文档。
版本
Typora 在进入到 1.x 版本后开始收费了,本文档所用版本为:Typora_1.3.8_windows ,自己找找吧。
快速上手:几个常用快捷键
文本格式编辑 | 段落格式编辑 | 视图切换(可忽略) | 文件系统操作(可忽略) |
---|---|---|---|
Ctrl + 1~6 :插入标题 | Ctrl + Shift + X :任务列表 | ctrl + shift + L :侧边栏显示/隐藏 | Ctrl + S 保存 |
Ctrl + B :加粗 | Ctrl + Shift + [ :有序列表 可用:x. 空格 | Ctrl + Shift + 1 :侧边栏大纲视图 | Ctrl + F 查找文件 |
Ctrl + I :斜体 | Ctrl + Shift + ] :无序列表 可用:- 空格 | Ctrl + Shift + 2 :侧边栏文件视图 | Ctrl + H 查找内容替换 |
Ctrl + U :下划线 | Ctrl + T :创建表格 可用:右键->插入 | F9 :打字机模式切换 | Ctrl + HOME 移动到文件头 |
Ctrl + Shift + K :插入代码块 可用:右键->插入 | F8 :专注模式切换 | Ctrl + END 移动到文件末尾 |
*注:掌握上表左边一半就能快速编辑了,拓展程度取决于个人兴趣和习惯。另附两个概念:
-
打字机模式——使得你所编辑的那一行永远处于屏幕正中
-
专注模式——使你正在编辑的那一行保留颜色,而其他行的字体呈灰色
Typora 偏好设置
新建文件后,应先进行保存(会方便为保存图像指明路径,详见后面3.4节)。
打开“文件->偏好设置”。
通用
由于使用的是破解版,因此不要自动检查更新。
外观
通过“获取主题”可以下载其它主题,并在“主题”中进行选择。
编辑器
可以设置缩进、自动匹配括号成对、匹配 Markdown。
图像
建议将图片集中保存到文档所在目录,并且使用相对路径,以防移动文档时不能正常显示图片。
Markdown
可以根据文档需求调整上下标、高亮、行号、缩进等设置。
导入导出
导入:
文件、文件夹:文件 --> 打开或打开文件夹。
导出
选择文件 --> 导出,可以选择导出的文件格式。
Typora可以直接导出PDF格式。若要导出Word格式,需要安装插件:pandoc。下载地址:https://github.com/jgm/pandoc/releases
排版格式
标题与段落格式
文档名格式
将文档名设置为独立的格式,以免将文档名纳入一般标题书签目录之中。这里使用了HTML格式。
<div align = "center" style="font-family: 'Microsoft YaHei', '微软雅黑', sans-serif; font-size: 36pt;"> Typora 应用教程 </div>
标题
标题可用“#”表示,总共有6个标题,依次增加#+标题内容,换行即可:
- “# 空格 一级标题” 换行 相当于HTML的h1
- “## 空格 二级标题” 换行 相当于HTML的h2
- “### 空格 三级标题” 换行 相当于HTML的h3
- “#### 空格 四级标题” 换行 相当于HTML的h4
- “##### 空格 五级标题” 换行 相当于HTML的h5
- “###### 空格 六级标题” 换行 相当于HTML的h6
快捷操作:Ctrl+1~6
还可以使用“Ctrl + =”提升标题级别,或者使用“Ctrl + -”降低标题级别。
软件左侧有“大纲 / 文件侧边栏”,Typora 会根据你 Markdown 标记的 H1、H2、H3…… 各级标题为你呈现一个大纲。
段落
从记事本复制过来的文本,换行时默认相当于”Shift+Enter“,即Word中看到的 ⬇️,相当于”回车“(相当于HTML中的<br/>
)。
在Typora中直接编辑文本或从Word中复制过来文本时按”Enter“换行默认为”Windows 风格(CR+LF)“,相当于”回车+换行“。
如果在“偏好设置”中选择“首行缩进”,你可以更好地观察到前面两者的区别。
文本格式
加粗
**文本加粗**
:在文本两侧各加两个星,或者使用快捷键:Ctrl + B 。
倾斜
*文本倾斜*
:在文本两侧各加一个星,或者快捷键:Ctrl + I 。
下划线
<u> 下划线的内容</u>
或者快捷键Ctrl+U
删除线
~~文本删除线~~
:在文本两侧各加一个星,或者快捷键:Alt + Shift + 5 。
高亮
选择“文件–>偏好设置–>markdown设置”,勾选“高亮”,设置后一定要重新启动软件。
==文本高亮==
:在文本两侧各加一个星,没有对应快捷键。其效果:文本高亮
列表格式
列表存在2行以上时,在第2行之后按Tab键,会形成多级列表,与最近上级列表之间有从属关系。
任务列表
快捷键:Ctrl + Shift + X
-
列表1 :
- [ ] 文字
(注意:共有3个空格隔开)- 列表3
-
列表2:·
- 列表4
上一行格式为:- [X] 文字
(注意:有2个空格隔开)
可以用鼠标点击任务,以切换任务列表是否完成的状态。
无序列表
无序列表可以使用“+ 或 - 或 *”中的任意一个,然后接空格和文字:+/-/* 文字
,其效果:
- 列表1
- 列表2
- 列表3
有序列表
有序列表使用数字加点,然后接空格和文字:1. 文本
,其效果:
- 列表1
- 列表2
- 列表3
表格
在 Markdown 中插入表格比较复杂(不再赘述),一直是一件比较头疼的事情。
Typora 提供了图形界面的插入表格的功能,你只需要在行内 “鼠标右键 - 插入 - 表格” ,输入行数和列数,Typora 就会自动生成一张样式不错的空表格。
快捷键:Ctrl + T 。
图片格式
插入图片
Typora 的图片插入功能是广受好评的,Markdown 原生不太注重图片插入的功能。
在 Typora 中,你可以直接通过Ctrl + C
、Ctrl + V
将网络图片、剪贴板图片复制到文档中,也可以直接拖动本地图片到文档中,Typora 会自动帮你插入符合 Markdown 语法的图片语句。
你可以在 ”2.1.4节“ 图像的偏好设置中去设置插入图片时复制到哪个路径,以及什么情况下需要复制。这可以保证即使网络图片源失效了,你还有本地的备份可用,同时也能使你的文档文件夹更合理、完整。
调整图片大小
右击图片可以调整图片大小。
取消图片居中
本功能不常用。本节取消图片居中针对所有图片,单个图片的处理参考“3.3.3.2节”。在“偏好设置–外观”中“打开主题文件夹”,在对应主题(github)的CSS样式末尾添加CSS样式:
p .md-image:only-child{
width: auto;
text-align: left;
}
代码格式
行内代码
`行内代码` :在文本两侧各加一个`(ESC键下方的键)或两个``,对应效果:行内代码
代码块
在行首输入 ``` (ESC键下方的键)后并输入语言名(有补全提示),回车,则生成代码块。如输入”```python “回车之后的效果:
print("Hello")
可在“偏好设置”中设置是否“显示行号”。
开始写代码,Typora 就会自动帮你实现代码(关键字)高亮。Typora 原生支持许多编程语言代码块的语法高亮,基本日常常用的编程语言它都能很好地支持[]:1。当然,你也可以直接换行开始写,而后再选择语言。
其它格式
emoji 表情
可以通过输入 :emoji:
的形式来打出 emoji 对应的单词,软件会自动给出图形的提示,还是比较好用的。比如:horse:
🐴。通过复制也可以,这里有一些表情包合集。
emoji表情:
😀 😃 😄 😁 😆 😅 😂 🤣 😊 😇 🙂 🙃 😉 😌 😍 🥰 😘 😗 😙 😚 😋 😛 😝 😜 🤪 🤨 🧐 🤓 😎 🤩 🥳 😏 😒 😞 😔 😟 😕 🙁 ☹️ 😣 😖 😫 😩 🥺 😢 😭 😤 😠 😡 🤬 🤯 😳 🥵 🥶 😱 😨 😰 😥 😓 🤗 🤔 🤭 🤫 🤥 😶 😐 😑 😬 🙄 😯 😦 😧 😮 😲 🥱 😴 🤤 😪 😵 🤐 🥴 🤢 🤮 🤧 😷 🤒 🤕 🤑 🤠 😈 👿 👹 👺 🤡 💩 👻 💀 ☠️ 👽 👾 🤖 🎃 😺 😸 😹 😻 😼 😽 🙀 😿 😾
emoji手势和人物:
👋 🤚 🖐 ✋ 🖖 👌 🤏 ✌️ 🤞 🤟 🤘 🤙 👈 👉 👆 🖕 👇 ☝️ 👍 👎 ✊ 👊 🤛 🤜 👏 🙌 👐 🤲 🤝 🙏 ✍️ 💅 🤳 💪 🦾 🦵 🦿 🦶 👂 🦻 👃 🧠 🦷 🦴 👀 👁 👅 👄 💋 🩸 👦 👧 👨 👩 👴 👵 👶 👱 👮 👲 👳 👷 👸 💂 🎅 👰 👼 💆 💇 🙍 🙎 🙅 🙆 💁 🙋 🙇 🙌 🙏 👤 👥 🚶 🏃 👯 💃 👫 👬 👭 💏 💑 👪
emoji动植物:
🙈 🙉 🙊 🐵 🐒 🐶 🐕 🐩 🐺 🐱 😺 😸 😹 😻 😼 😽 🙀 😿 😾 🐈🐯 🐅 🐆 🐴 🐎 🐮 🐂 🐃 🐄 🐷 🐖 🐗 🐽🐏 🐑 🐐 🐪 🐫 🐘 🐭 🐁 🐀 🐹 🐰 🐇 🐻 🐨 🐼 🐾 🐔 🐓 🦆 🦢 🦜 🦉 🐣 🐤 🐥 🐦 🐧 🐸 🐊 🐢 🐍 🐲 🐉 🐳 🐋 🐬 🐟 🐠 🐡 🐙 🐚 🐌 🐛 🐜 🐝 🐞 🦋
💐 🌸 💮 🌹 🌺 🌻 🌼 🌷 🌱 🌲 🌳 🌴 🌵 🌾 🌿 🍀 🍁 🍂 🍃 🌍 🌎 🌏 🌐 🌑 🌒 🌓 🌔 🌕 🌖 🌗 🌘 🌙 🌚 🌛 🌜 ☀ 🌝 🌞 ⭐ 🌟 🌠 ☁ ⛅ ☔ ⚡ ❄ 🔥 💧 🌊
插入目录
要在文档内部(通常在文档首部)插入本文档的目录,可以在要插入目录的位置输入[TOC]
即可,软件会自动获取生成目录。
水平分割线
输入***
或---
,按回车键换行。其效果:
超链接
格式:[百度](https://www.baidu.com/)
可选中文本,按快捷键Ctrl+K,填入URL地址即可。其效果:百度
给文本添加超链接:可以先复制链接地址,再选择文本,然后右击选择“超链接”即可。
公式
使用公式应在“偏好设置”中打开对应的选项,然后重启 Typora 。
如:$ 2 ^ k $
或 $2^k$
或 2^k^
Typora 原生支持 LaTeX 语法,你可以在 这篇文章 或者 这篇文章 中查看。
特殊处理
字符转义
Markdown语法中有些符号有特定的含义,比如* - + [ $
等,如果要显示这些特定的符号,需要在前面加上“\”,表示“\”后面的字符正常显示,称之为转义。
如果你的部分符号不能正常显示,可以加上“\”试试。如果你的文档中,有一些代码没有使用代码块格式,最好点击左下方的</>
源代码模式,查看并确认代码正常,没有在复制粘贴时被软件添加一些“\”,以免影响代码执行。
标题编号
自动添加标题编号
将后面的代码保存到记事本文件,命名为“base.user.css”,放入以下“打开高级设置”对应的路径:
h1, h2, h3, h4, strong {
font-weight: 600;
}
/* 添加自动序号样式 */
#write {
counter-reset: h1;
}
h1 {
counter-reset: h2;
}
h2 {
counter-reset: h3;
}
h3 {
counter-reset: h4;
}
h4 {
counter-reset: h5;
}
h5 {
counter-reset: h6;
}
/** put counter result into headings */
#write h1:before {
counter-increment: h1;
content: counter(h1) " "
}
#write h2:before {
counter-increment: h2;
content: counter(h1) "." counter(h2) " ";
}
#write h3:before,
h3.md-focus.md-heading:before { /** override the default style for focused headings */
counter-increment: h3;
content: counter(h1) "." counter(h2) "."counter(h3) " ";
}
#write h4:before,
h4.md-focus.md-heading:before {
counter-increment: h4;
content: counter(h1) "."counter(h2) "."counter(h3) "."counter(h4) " ";
}
#write h5:before,
h5.md-focus.md-heading:before {
counter-increment: h5;
content: counter(h1) "."counter(h2) "."counter(h3) "."counter(h4) "."counter(h5) " "
}
#write h6:before,
h6.md-focus.md-heading:before {
counter-increment: h6;
content: counter(h1) "."counter(h2) "."counter(h3) "."counter(h4) "."counter(h5) "."counter(h6) " "
}
/** override the default style for focused headings */
#write>h3.md-focus:before,
#write>h4.md-focus:before,
#write>h5.md-focus:before,
#write>h6.md-focus:before,
h3.md-focus:before,
h4.md-focus:before,
h5.md-focus:before,
h6.md-focus:before {
color: inherit;
border: inherit;
border-radius: inherit;
position: inherit;
left: initial;
float: none;
top: initial;
font-size: inherit;
padding-left: inherit;
padding-right: inherit;
vertical-align: inherit;
font-weight: inherit;
line-height: inherit;
}
/* 调整页边距 */
@page {
margin: 8mm 0mm;
}
/* 自定义强制换号符,使得在导出PDF 或打印时强制换行 */
@media print {
/* 这是自定义标签, 在需要换行的地方插入:<pb> */
pb {
display: block;
page-break-after: always;
}
h1 {
page-break-before: always;
}
h1:first-of-type {
page-break-before: avoid;
}
}
/* 完成的 Task 添加删除线 */
.task-list-done {
text-decoration: line-through;
color: #777;
}
.task-list-not-done {}
/* 添加键盘样式 */
kbd {
box-shadow: inset 0 -2px 0 #c6cbd1;
background-color: white;
}
/* TOC 中隐藏 H1 和 H6 */
/* .md-toc-h1, .md-toc-h6 { */
/* display: none; */
/* } */
/* 添加 TOC 自动序号样式 */
.md-toc-content {
counter-reset: toc-h1;
}
.md-toc-h1 {
counter-reset: toc-h2;
}
.md-toc-h2 {
counter-reset: toc-h3;
}
.md-toc-h3 {
counter-reset: toc-h4;
}
.md-toc-h4 {
counter-reset: toc-h5;
}
.md-toc-h5 {
counter-reset: toc-h6;
}
.md-toc-content .md-toc-h1 a:before {
counter-increment: toc-h1;
content: counter(toc-h1) " ";
}
.md-toc-content .md-toc-h2 a:before {
counter-increment: toc-h2;
content: counter(toc-h1) "." counter(toc-h2) " ";
}
.md-toc-content .md-toc-h3 a:before {
counter-increment: toc-h3;
content: counter(toc-h1) "." counter(toc-h2) "." counter(toc-h3) " ";
}
.md-toc-content .md-toc-h4 a:before {
counter-increment: toc-h4;
content: counter(toc-h1) "." counter(toc-h2) "." counter(toc-h3) "." counter(toc-h4) " ";
}
.md-toc-content .md-toc-h5 a:before {
counter-increment: toc-h5;
content: counter(toc-h1) "." counter(toc-h2) "." counter(toc-h3) "." counter(toc-h4) "." counter(toc-h5) " ";
}
.md-toc-content .md-toc-h6 a:before {
counter-increment: toc-h6;
content: counter(toc-h1) "." counter(toc-h2) "." counter(toc-h3) "." counter(toc-h4) "." counter(toc-h5) "."counter(toc-h6) " ";
}
/* 侧边栏自动编号 */
.outline-content {
counter-reset: outline-h1;
}
.outline-h1 {
counter-reset: outline-h2;
}
.outline-h2 {
counter-reset: outline-h3;
}
.outline-h3 {
counter-reset: outline-h4;
}
.outline-h4 {
counter-reset: outline-h5;
}
.outline-h5 {
counter-reset: outline-h6;
}
.outline-content .outline-h1 .outline-label:before {
counter-increment: outline-h1;
content: counter(outline-h1) " ";
}
.outline-content .outline-h2 .outline-label:before {
counter-increment: outline-h2;
content: counter(outline-h1) "."counter(outline-h2) " ";
}
.outline-content .outline-h3 .outline-label:before {
counter-increment: outline-h3;
content: counter(outline-h1) "."counter(outline-h2) "."counter(outline-h3) " ";
}
.outline-content .outline-h4 .outline-label:before {
counter-increment: outline-h4;
content: counter(outline-h1) "."counter(outline-h2) "."counter(outline-h3) "."counter(outline-h4) " ";
}
.outline-content .outline-h5 .outline-label:before {
counter-increment: outline-h5;
content: counter(outline-h1) "."counter(outline-h2) "."counter(outline-h3) "."counter(outline-h4) "."counter(outline-h5) " ";
}
.outline-content .outline-h6 .outline-label:before {
counter-increment: outline-h6;
content: counter(outline-h1) "."counter(outline-h2) "."counter(outline-h3) "."counter(outline-h4) "."counter(outline-h5) "."counter(outline-h6) " ";
}
其效果:
添加PDF书签编号
尽管上一节在 Typora 大纲中显示了章节标题编号,但导出的 PDF 书签中并没有自动添加编号,如:
此处引用一个 Python 解决方案,将代码保存成”.py“文件。其中用到了“PyPDF2”模块,在DOS命令行或其它软件控制台终端里运行命令pip install PyPDF2
安装此模块,然后按代码前三行说明运行即可。
# 使用方法:
# 方法1:将本文档入文件同目录,在“第10行”填上文件名,运行即可
# 方法2:本文档可以放在任何位置,要转换的文档使用绝对路径,用第12行替换前两行
# 原作者博客地址:https://blog.csdn.net/as604049322
import os
from PyPDF2 import PdfReader, PdfWriter
# 为文件名或路径填写方便,故把以下三行从main起始处提前到此处
relative_path = '替换文档名.pdf'
file = os.path.join(os.path.dirname(__file__), relative_path)
#file = r"D:\。。。\FileName.pdf" #文档绝对路径亦可用,替换上面代码+relative_path = 'Python单词汇总.pdf'
def get_pdf_Bookmark(filename):
if isinstance(filename, str):
pdf_reader = PdfReader(filename)
else:
pdf_reader = filename
pagecount = len(pdf_reader.pages)
# 用保存每个标题id所对应的页码
idnum2pagenum = {}
for i in range(pagecount):
page = pdf_reader.pages[i]
idnum2pagenum[page.indirect_ref.idnum] = i
# 保存每个标题对应的标签数据,包括层级,标题和页码索引(页码-1)
bookmark = []
def get_pdf_Bookmark_inter(outlines, tab=0):
for outline in outlines:
if isinstance(outline, list):
get_pdf_Bookmark_inter(outline, tab + 1)
else:
bookmark.append(
(tab, outline['/Title'], idnum2pagenum[outline.page.idnum]))
get_pdf_Bookmark_inter(pdf_reader.outline)
return bookmark
def pdf_write_bookmark(bookmark, pdf_file, compress=True):
pdf_reader = PdfReader(pdf_file)
num_pages = len(pdf_reader.pages)
pdf_writer = PdfWriter()
for page in pdf_reader.pages:
if compress:
page.compress_content_streams()
pdf_writer.add_page(page)
# pdf_reader.
last_cache = [None] * (max(bookmark, key=lambda x: x[0])[0] + 1)
for tab, title, pagenum in bookmark:
if pagenum >= num_pages:
continue
parent = last_cache[tab - 1] if tab > 0 else None
indirect_id = pdf_writer.add_outline_item(title, pagenum, parent=parent)
last_cache[tab] = indirect_id
pdf_writer.page_mode = "/UseOutlines"
with open(pdf_file, "wb") as out:
pdf_writer.write(out)
print("已成功将书签添加到:", pdf_file)
if __name__ == '__main__':
bookmark = get_pdf_Bookmark(file)
num_cache = [0] * 7
last_tab = 0
new_bookmark = []
for tab, title, pagenum in bookmark:
if tab > last_tab:
num_cache[tab] = 1
else:
num_cache[tab] += 1
new_title = title
if not title[0].isdigit():
new_title = ".".join(map(str, num_cache[:tab + 1])) + " " + title
# print(tab, new_title, pagenum)
new_bookmark.append((tab, new_title, pagenum))
last_tab = tab
pdf_write_bookmark(new_bookmark, file)
文档运行结果如:
转换后的效果:
Typora 中的前端技术
有以下两点需要说明:
-
Typora是一个轻量级简明Markdown笔记软件,没有必要搞得太复杂。
-
Typora基于HTML和JavaScript,因此,如果了解前端开发技术可以对此软件玩得更加炫酷。比如下面三点就是体现。
伪装成文本编辑器的浏览器
Typora 的很多元素符合网页前端常用的HTML 和 JavaScript语法风格。尤其是当你按下 Shift + F12 快捷键时,页面会弹出一个基于 Chrome 的开发者工具栏,也就是我们在浏览器中常说的「审查元素」。
我们在用 Markdown 语言撰写文稿的时候,其实本质上是在借助某种编程语言的转化(解析器)来编写一个 HTML 网页。Markdown 从它诞生之初就与 Web 技术有着及其紧密的联系。
文本居中
文本居中通过HTML、div标签或CSS实现,align对齐参数可以是“left|right|center|justify”。
<div align = "center">文本居中的方法</div>
<div align = "center" style="font-size: 48pt;">文本</div>
<div align = "center" style="font-family: 'Microsoft YaHei', '微软雅黑', sans-serif; font-size: 48pt;"> 文本 </div>
我个人会用最后一行作为整个文档的大标题,不被纳入目录中。
其对应效果:
另外,增加H标签和align属性也是可以的,如<h1 align = "center">文本居中</h1>
,但是注意,它会纳入同级标题的数量之中。
再者,图片也可以在其引用链接上增加 align 属性来控制其显示位置。
Typora 主题
Typora 有很多主题样式,可以在”文件->偏好设置->外观“中点击右下角的”获取主题“得到。
将下载的主题解压,放到“Typora\themes”文件夹里即可。主题可以在“偏好设置”或菜单栏里更换。
参考:https://blog.csdn.net/yexiangcsdn/article/details/116525571
引用
文本引用
> 引用文本
注意:有1个空格隔开)。标志效果如左侧所示,另引用文本颜色区别于正文。
链接引用
链接引用类似于我们常在论文末尾看到的「参考文献」的写法。不同于超链接:[文献3](www.baidu.com )
。
链接引用包括两个部分:
-
链接引用格式:
[百度][1]
,即 百度 -
通过 []: 的语法来为你的文档加上链接引用(常在文末添加),如:
脚注
脚注也很常见,即某段文字末的右上角标有数字标记,页面底部进行注释的写法。在Typora中,文档可以看作只有一页,脚注的效果近乎尾注,导出PDF也会出现在最后。
脚注包括两个部分:
效果如下:
后记:好看的主题
操作:
-
下载新主题:https://theme.typora.io/
-
打开Typora,选择“偏好设置 > 外观 > 打开主题文件夹”,将下载解压的.css和相应的文件夹复制到该文件夹中
-
重启Typora,然后选择主题 > Forest,即可在“主题”菜单中切换。
其中,Github、Vue、Forest 适合导出PDF (Newsprint 等主题对HTML有时排版不好)。
Drake
4.8MB,有12个模板,不错!https://theme.typora.io/theme/Drake/
这几个还可以:drake,drake-vue,drake-light,drake-material
Solarized
182KB,有点古纸风
Vue
264KB,风格比较清新
Forest
70.2MB,太大,深浅色的交替,风格还可以
OVER!
参考文献(脚注示例)
附:CSS 和 Python 代码的原创作者看到的话请联系,以便附上链接。