Markdown 入门 & 使用 R + Markdown 发送邮件

Markdown 入门 & 使用 R + Markdown 发送邮件

大家一定都听过 HTML,HyperText Markup Language,超文本标记语言。Markup 就是标记的意思,今天我想介绍的是 Markdown,它也是一个 markup 语言。。。是不是特别绕,Markdown 是 markup 语言。

视频讲解

如果用百度搜索 Markdown,会出现一堆教程。可能大家一听到语言就会觉得有些畏惧,但是完全不用担心,Markdown 语言可以在 1 分钟内学会。关于 Markdown 有一句非常经典的话:

笔下是语法,心中格式化。

因为 Markdown 实在是太简单了,以至于其实不需要任何编译,可读性非常强。下面我把 Markdown 中常用的一些语法总结一下。

标题

在 HTML 里面有六级标题,h1-h6,在 Markdown 中标签也有六级:

1
2
3
4
5
6
# 一级标题
## 二级标题
### 三级标题
#### 四级标题
##### 五级标题
###### 六级标题

效果如下:

一级标题

二级标题

三级标题

四级标题

五级标题
六级标题

但是需要注意的是,经常 Markdown 文本会被转换成 HTML 文档预览,而 HTML 文档的样式是可以通过样式表(CSS)文件定义的,所以使用不同的 CSS 表可以得到不同的预览结果。这也是 Markdown 语言的哲学之一——“一种格式,多种输出”。

另外也可以使用下面两种方式标记一级标题和二级标题:

1
2
3
4
5
一级标题
======

二级标题
------

到底是几个不重要,超过三个就好。效果如下:

一级标题

二级标题

段落

Markdown 的分段非常的容易,也有两种方式:

  1. 在上一段的结尾空两个空格然后换行;
  2. 在两端之间隔开一行。

我比较喜欢方式二,这样文档的源代码也不会非常拥挤。

字体

1
2
3
4
5
6
*斜体文本*
_斜体文本_
**粗体文本**
__粗体文本__
***粗斜体文本***
___粗斜体文本___

预览效果如下:

斜体文本
斜体文本
粗体文本
粗体文本
粗斜体文本
粗斜体文本

分割线

分割线的方式就特别多了,例如:

1
2
3
4
5
6
7
8
9
***

* * *

*****

- - -

----------

效果如下:






删除线

如果段落上的文字要添加删除线,只需要在文字的两端加上两个波浪线 ~~ 即可,实例如下:

1
2
正确文本
~~错误文本~~

效果如下:

正确文本
错误文本

下划线

下划线可以通过 HTML 的 <u> 标签来实现:

1
<u>带下划线文本</u>

效果如下:

带下划线文本

脚注

脚注是对文本的补充说明。

Markdown 脚注的格式如下:

1
2
3
TidyFriday [^tf]。

[^tf]: Tidy Data on Friday ~~

效果:

TidyFriday [^tf]。

[^tf]: Tidy Data on Friday ~~

把这个文档拉到最下面就能看到脚注了。

列表

Markdown 支持有序列表和无序列表。

无序列表使用星号 *+ 或是 - 作为列表标记:

1
2
3
4
5
6
7
8
9
10
11
12
* 第一项
* 第二项
* 第三项

+ 第一项
+ 第二项
+ 第三项


- 第一项
- 第二项
- 第三项

效果:

  • 第一项
  • 第二项
  • 第三项
  • 第一项
  • 第二项
  • 第三项
  • 第一项
  • 第二项
  • 第三项

有序列表使用数字并加上 . 号来表示,如:

1
2
3
1. 第一项
2. 第二项
3. 第三项

效果:

  1. 第一项
  2. 第二项
  3. 第三项

列表嵌套

列表嵌套只需在子列表中的选项添加四个空格即可:

1
2
3
4
5
6
1. 第一项:
- 第一项嵌套的第一个元素
- 第一项嵌套的第二个元素
2. 第二项:
- 第二项嵌套的第一个元素
- 第二项嵌套的第二个元素

效果:

  1. 第一项:
    • 第一项嵌套的第一个元素
    • 第一项嵌套的第二个元素
  2. 第二项:
    • 第二项嵌套的第一个元素
    • 第二项嵌套的第二个元素

区块

Markdown 区块引用是在段落开头使用 > 符号 ,然后后面紧跟一个空格符号:

1
> 笔下是语法,心中格式化。

笔下是语法,心中格式化。

另外区块是可以嵌套的,一个 > 符号是最外层,两个 > 符号是第一层嵌套,以此类推:

1
2
3
> 笔下是语法
> > 心中格式化
> > > 这是打代码的最高境界。

笔下是语法

心中格式化

这是打代码的最高境界。

区块中使用列表

区块中使用列表实例如下:

1
2
3
4
5
6
> 区块中使用列表
> 1. 第一项
> 2. 第二项
> + 第一项
> + 第二项
> + 第三项

效果:

区块中使用列表

  1. 第一项
  2. 第二项
  • 第一项
  • 第二项
  • 第三项

列表中使用区块

如果要在列表项目内放进区块,那么就需要在 > 前添加四个空格的缩进。

区块中使用列表实例如下:

1
2
3
4
* 第一项
> 笔下是语法
> 心中格式化
* 第二项
  • 第一项

    笔下是语法
    心中格式化

  • 第二项

代码块

行内代码

如果是段落上的一个函数或片段的代码可以用反引号把它包起来,例如:

1
`print()` 函数

效果:print() 函数

区块代码

可以使用缩进的方式,但是推荐使用前后各三个反引号引起来的方式:

1
2
3
```r
library(ggplot2)
```

效果:

1
library(ggplot2)

超链接

链接使用方法如下:

1
2
3
4
5
[我的网站](https://czxa.top)

或者

<https://czxa.top>

我的网站

或者

https://czxa.top

高级链接

1
2
3
4
5
6
7
链接也可以用变量来代替,文档末尾附带变量地址:
这个链接用 1 作为网址变量 [Google][1]
这个链接用 czxa 作为网址变量 [czxa][czxa]
然后在文档的结尾为变量赋值(网址)

[1]: http://www.google.com/
[czxa]: https://czxa.top/

效果如下:

链接也可以用变量来代替,文档末尾附带变量地址:
这个链接用 1 作为网址变量 Google
这个链接用 czxa 作为网址变量 czxa
然后在文档的结尾为变量赋值(网址)

图片

Markdown 图片语法格式如下:

1
2
3
![alt 属性文本](图片地址)

![alt 属性文本](图片地址 "可选标题")
  • 开头一个感叹号 !
  • 接着一个方括号,里面放上图片的替代文字
  • 接着一个普通括号,里面放上图片的网址,最后还可以用引号包住并加上选择性的 ‘title’ 属性的文字。

例如:

1
2
3
![本地图片](img.png)
![网络图片](https://czxb.github.io/br/image_88518458151582_72.JPG)
![网络图片](https://czxb.github.io/br/image_88518458151582_72.JPG "欢迎加入 TidyFriday !")

本地图片
网络图片
网络图片

当然,你也可以像网址那样对图片网址使用变量:

1
2
3
4
这个链接用 1 作为网址变量 [czxa][1].
然后在文档的结尾位变量赋值(网址)

[1]: https://czxa.top/images/me.svg

这个链接用 1 作为网址变量 czxa.
然后在文档的结尾位变量赋值(网址)

Markdown 还没有办法指定图片的高度与宽度,如果你需要的话,你可以使用普通的 标签:

1
<img src="https://czxa.top/images/me.svg" width="50%">

也可以设置图片居中:

1
<center><img src="https://czxa.top/images/me.svg" width="50%"></center>

或者使用 div 标签:

1
2
3
<div align="center">
<img src="https://czxa.top/images/me.svg" width="50%">
</div>

表格

Markdown 制作表格使用 | 来分隔不同的单元格,使用 - 来分隔表头和其他行。

语法格式如下:

1
2
3
4
|  表头   | 表头   |
| :----: | :----: |
| 单元格 | 单元格 |
| 单元格 | 单元格 |

效果:

表头 表头
单元格 单元格
单元格 单元格

很多编程语言里面都提供了很多快捷生成 MD 表格的工具,例如 R 中:

1
knitr::kable(iris[1:5, 1:5], align = 'c')

我们可以设置表格的对齐方式:

  • -: 设置内容和标题栏居右对齐。
  • :- 设置内容和标题栏居左对齐。
  • :-: 设置内容和标题栏居中对齐。
1
2
3
4
| 左对齐 | 右对齐 | 居中对齐 |
| :-----| ----: | :----: |
| 单元格 | 单元格 | 单元格 |
| 单元格 | 单元格 | 单元格 |

效果如下:

左对齐 右对齐 居中对齐
单元格 单元格 单元格
单元格 单元格 单元格

高级技巧

支持的 HTML 元素

不在 Markdown 涵盖范围之内的标签,都可以直接在文档里面用 HTML 撰写。

目前支持的 HTML 元素有:<kbd> <b> <i> <em> <sup> <sub> <br>等 ,如:

1
使用 <kbd>Ctrl</kbd>+<kbd>Alt</kbd>+<kbd>Del</kbd> 重启电脑

效果:

使用 Ctrl+Alt+Del 重启电脑

转义

Markdown 使用了很多特殊符号来表示特定的意义,如果需要显示特定的符号则需要使用转义字符,Markdown 使用反斜杠转义特殊字符:

1
2
**文本加粗** 
\*\* 正常显示星号 \*\*

文本加粗
** 正常显示星号 **

Markdown 支持以下这些符号前面加上反斜杠来帮助插入普通的符号:

1
2
3
4
5
6
7
8
9
10
11
12
\   反斜线
` 反引号
* 星号
_ 下划线
{} 花括号
[] 方括号
() 小括号
# 井字号
+ 加号
- 减号
. 英文句点
! 感叹号

公式

当你需要在编辑器中插入数学公式时,可以使用两个美元符 $$ 包裹 TeX 或 LaTeX 格式的数学公式来实现。提交后,问答和文章页会根据需要加载 Mathjax 对数学公式进行渲染。如:

1
2
3
$$
a^2 + b^2 = c^2
$$

效果:

$$
a^2 + b^2 = c^2
$$

关于 LaTeX 公式,我的博客上有一篇比较详细的速查表可以参考:常见数学符号的 Latex 表示方法

拓展用法

很多 Markdown 编辑器都提供了一些扩展用法,例如绘制流程图等,这个得结合具体的编辑器的教程学习,不过我的实际使用经验告诉我那些并不好用,不用花时间浪费力气了。。。

隐藏内容

通过 HTML 标签即可实现:

1
2
3
4
5
6
<details>
<summary><strong>点击左边👈的三角形就可以看到隐藏内容</strong></summary>

- 隐藏内容

</details>
点击左边👈的三角形就可以看到隐藏内容
  • 隐藏内容

上下标

1
2
下标:H<sub>2</sub>O<sub>2</sub>
上标:30<sup>th</sup>

下标:H2O2
上标:30th

彩色字体

1
2
3
<span style="color:red;">WARNING</span>
<span style="color:green;">WARNING</span>
<span style="color:pink;">WARNING</span>

WARNING
WARNING
WARNING

待办事项列表

1
2
- [ ] UnDo iterm
- [x] Done iterm
  • UnDo iterm
  • Done iterm

HTML 中的特殊符号

下表来自在 markdown 中使用 HTML 中的特殊符号:

符号 说明 对应编码(使用时去掉空格) 英文读法
& AND 符号 & amp; ampersand
< 小于 & lt; little
·> 大于 & gt; great
不断行的空白格 & nbsp; number space
半方大的空白 & ensp;
全方大的空白 & emsp;
¿ 倒问号 & iquest; inverted question
? 问号 & quest; question
« 左书名号 & laquo; left angle quote
» 右书名号 & raquo; right angle quote
引号 & quot; quote
左单引号 & lsquo; left single quote
右单引号 & rsquo: right single quote
左双引号 & ldquo: left double quote
右双引号 & rdquo: right double quote
段落符号 & para; paragraph
§ 章节符 & sect; section
× 乘号 & times; times
÷ 除号 & divide; divide
± 加减号 & plusmn; plus minus
ƒ function & fnof;
根号 & radic; radic
无穷大 & infin; infinite
° & deg; degree
不等号 & ne; ne
恒等于 & equiv; equivalent
小于等于 & le; less than or equal to
大于等于 & ge; great than or equal to
垂直符号 & perp; perpendicular
左箭头 & larr; left arrow
右箭头 & rarr; right arrow
上箭头 & uarr; up arrow
下箭头 & darr; down arrow
水平箭头 & harr; horizontal arrow
竖直箭头 & varr; vertical arrow
双线左箭头 & lArr; left arrow
双线右箭头 & rArr; right arrow
双线上箭头 & uArr; up arrow
双线上箭头 & dArr; down arrow
双线水平双箭头 & hArr; horizontal arrow
双线竖直箭头 & vArr; vertical arrow
黑桃 & spades; spades
红桃 & hearts; hearts
梅花 & clubs; club
方块 & diams; diamonds
© 版权 & copy; copy right
® 注册商标 & reg; registration
商标 & trade; trade
¥ 人民币 & yen;
欧元 & euro; euro
¢ 美分 & cent; cent
£ 英磅 & pound; pound
& oplus;
½ 二分之一 & frac12; fraction
¼ 四分之一 & frac14; fraction
千分符号 & permil; per mille
所以 & there4; there fore
π 圆周率 & pi;
¹ 商标 1 & sup1; super 1
α alpha & alpha; alpha
β beta & beta; beta
γ gamma & gamma; gamma
δ delta & delta; delta
θ theta & theta; theta
λ lambda & lambda; lambda
σ sigma & sigma; sigma
τ tau & tau; tau

改变字号

这是正常字号;
这是加大字号;
这是缩小字号。

上面的效果实现代码是:

1
2
3
这是正常字号;
<big>这是加大字号;</big>
<small>这是缩小字号。</small>

换行符

这里会
断行!

上面的效果实现代码是:

1
这里会<br>断行!

引用

《富春山居图》由黄公望始画于至正七年(1347),于至正十年完成

上面的效果实现代码是:

1
<cite>《富春山居图》由黄公望始画于至正七年(1347),于至正十年完成</cite>
  • 短引用:
    毛泽东说过:帝国主义都是纸老虎 …

上面的效果实现代码是:

1
<q>毛泽东说过:帝国主义都是纸老虎 ...</q>
  • 块引用:
    这是块引用。

上面的效果实现代码是:

1
2
3
<blockquote>
这是块引用。
</blockquote>

设置字号、字体、颜色

红色 3 号字!
蓝色 2 号字!
绿色 3 号宋体字!

上面的效果实现代码是:

1
2
3
<font size="3" color="red">红色3号字!</font>
<font size="2" color="blue">蓝色2号字!</font>
<font face="STSong" color="green" size="3">绿色3号宋体字!</font>

表格及背景色

123
123

上面的效果实现代码是:

1
2
3
4
<table>
<tr><td bgcolor="red">1</td><td bgcolor="yellow">2</td><td bgcolor="blue">3</td></tr>
<tr><td>1</td><td>2</td><td>3</td></tr>
</table>

下拉列表框

上面的效果实现代码是:

1
2
3
4
5
6
<select>
<option>选项1</option>
<option>选项2</option>
<option>选项3</option>
<option>选项4</option>
</select>

按钮

按钮的样式可以通过修改 css 改变。

上面的效果实现代码是:

1
<button type="button">Click Me!</button>

删除与新增

1
2
- 减号后是原来的字符。
+ 加号后是改后的字符。

代码:

1
2
3
4
```diff
- 减号后是原来的字符。
+ 加号后是改后的字符。
```

文内锚点

使用 bookmark 标记

设置方法:

  • 建立一个跳转的链接,标记方式为 说明文字

  • 说明文字(你点击一下看效果?)

  • 标记要跳转到什么位置即可,标记方式为 跳转到这

  • 目标点代码:<span id = "jump">跳转到这</span>

借助 HTML 标记

HTML 中的 <a> 标签最重要的属性是 href ,它指示的链接目标,既可以是外部站点,也可以是页内锚点。页内锚点可以实现类似书签跳转的功能,最典型的就是点击 TOC 中的目录书签跳转到指定章节阅读。

构建页内锚点的语法,类似参考式链接:

  1. 先定义锚点 id:bookmark_text<a href="#auchor_id">bookmark_text</a>
  2. 再定义一个 id 为 auchor_id 的对象(这里以<p>为例):

    auchor_text

    <p id="auchor_id">auchor_text</p>
    例如,在文末定义了 id 为 end 的 EOF(End Of File):

    The end!

    ,然后通过Goto the End!指定书签“Goto the End!”跳转到文末“The End!”处。

编辑器的选择

百度一下就能搜索到一大堆 Markdown 编辑器,我只推荐两款:

  1. Atom 编辑器 + Markdown Preview Enhanced 插件;
  2. Visual Studio Code 编辑器 + Markdown Preview Enhanced 插件;

在那里可以用到 Markdown?

  1. 简书:http://www.jianshu.com/
  2. 微信公众号推文排版:https://lab.lyric.im/wxformat/
  3. 微信公众号推文排版:https://mdnice.com/
  4. RMarkdown,可以被认为是 Markdown 的方言;
  5. 多种编程语言都有关于使用 Markdown 进行文档编排的方法;
  6. 自行搭建博客撰写博客文章;

使用 Markdown 写邮件

Markdown 的用处实在是太大了,这里介绍一个有意思的,使用 R + Markdown 发送邮件。这里需要 blastula 包,安装方法如下:

1
2
3
install.packages("blastula")
# 或者
devtools::install_github("rich-iannone/blastula")

对于 MacOS 用户,还需要打开终端安装 openssl,WindowsOS 的需求我记不太清楚了,可以遇到了再在社区内提问。

1
brew install openssl

下面开始使用这个 R 包编写邮件:

1
2
3
4
5
library(magrittr)
library(blastula)
# current time:
(current_date_time <- add_readable_time())
#> [1] "Tuesday, December 24, 2019 at 11:17 AM (CST)"

然后是使用 Markdown 编写邮件的内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# Contents
email_object <- compose_email(
body = md(c(
"
## Hiya! Thank you for subscribing to my personal website.

I promise not to disturb you, write weekly and only relevant information about my blog's update.

<div align='center'><img src='https://images.unsplash.com/photo-1567538096601-b3177180fa5d?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=800&q=60' width = '500px'/></div>

I hope you enjoy these posts. Feel free to message me with any questions, concerns or ideas; or just let me know you like what I'm up to!

If you have changed your mind, you can just reply me a email to let me konw, then I will remove your email from my list.

Peace out,

Zhenxing Cheng"
)),
footer = md(c("Brought to you by Zhenxing Cheng on", current_date_time))
)

# preview
email_object

这个邮件的内容是这样的:

接下来是创建许可证:

1
2
3
4
5
6
7
8
# create a credential
blastula::create_smtp_creds_file(
file = "~/.e_creds",
user = "[email protected]",
host = "smtp.sina.com",
port = 465,
use_ssl = TRUE
)

各类邮箱POP3和SMTP服务器地址和端口可以参考这篇博客:各类邮箱POP3和SMTP服务器地址和端口

然后是给我自己发邮件:

1
2
3
4
5
6
7
8
# send email
email_object %>%
smtp_send(
from = "[email protected]",
to = "[email protected]",
subject = "Thank you for subscribing!",
credentials = creds_file(file = "~/.e_creds")
)

然后我自己就收到啦:

是不是超有商务范儿,而且可以批量发送邮件!还可以通过程序设计实现给不同的人发送不同内容的邮件。

知识星球附件链接:https://t.zsxq.com/RFI2RJm

#

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×