8  Markdown

8.1 转义

转义的函数是转换为普通字符,使之不具备特殊意义

8.1.1 需要转义的符号或符号组合

在Markdown中,以下字符需要进行转义:

  1. 反斜杠(\):用于转义特殊字符。
  2. 星号(*):用于标记斜体或粗体文本。
  3. 下划线(_):同样用于标记斜体或粗体文本。
  4. 方括号([]):用于链接和图片的标记。
  5. 尖括号(<>):用于HTML标签。
  6. 双引号(“):用于标记引用的文本。
  7. 反引号(`):用于标记内联代码。
  8. 感叹号(!):用于标记图片。

如果你想在文本中显示这些字符而不进行Markdown解析,请在它们前面添加一个反斜杠进行转义。例如,使用\*来显示星号而不是斜体文本。

原则

  • 这些符号在单独出现时或者被``引用时等情况下不一定具备特殊意义,此时不需要转义。
  • 符号组合可用最简转义:转义符号组合中的某一个或某几个符号,使其不能构成有义符号组合即可。如果多个符号组合在同一个字符串模块中,则可能需要多交转义,直至不能组成有效的有义组合为止。也可以用最全转义,即将符号组合中的每个字符均转义。

8.1.2 常见需要转义的情况举例

  • ``中间没有字符时,无特殊意义。
  • 中间有空格时,有特殊意义,需要作为普通字符时,需要转义:` `。转义方法:在` `任意一个`加一个\
  • 被`或者```括起时,用{{}}转义{},用{{{}}}转义{{}},否则可用\{\}转义
{{< include xxx.qmd>}}

8.1.3 特殊字符转义函数(python)

Code
import re

def escape_markdown(text):
    special_chars = r'\\*~_\[\](){}<>!:'
    escaped_text = re.sub(fr'([{re.escape(special_chars)}])', r'\\\1', text)
    return escaped_text

# 调用转义函数
text = r"*Hello* [World](https://example.com)"
escaped_text = escape_markdown(text)
print(escaped_text)
\*Hello\* \[World\]\(https\://example.com\)
Code
escape_markdown <- function(text) {
  special_chars <- '\\\\*~_\\[\\](){}<>!:'
  escaped_text <- gsub(paste0('([', special_chars, '])'), '\\\\\\1', text, perl = TRUE)
  return(escaped_text)
}

# 调用转义函数
text <- "*Hello* [World](https://example.com)"
escaped_text <- escape_markdown(text)
print(escaped_text)
[1] "\\*Hello\\* \\[World\\]\\(https\\://example.com\\)"

8.2 显示代码块全文,包括包围符号```


````{.r}
code chunk
````
包围代码

用{{r}}转义{r}

```{r}
fit = lm(mpg ~ am, data = mtcars)
summary(fit)
```

8.3 条件渲染

  • 正确方法:
<!-- 未提交纸质病历 -->

```{r}
#| results: asis
day_of_week <- weekdays(Sys.Date(), abbreviate = TRUE)

if (day_of_week %in% c("Fri", "Mon", "Tue")) {
  cat("## 未提交纸质病历\n")
}
```

```{r}
if (day_of_week %in% c("Fri", "Mon", "Tue")) {
  submission_data <- readxl::read_xlsx('data/临床质控.xls') |>
    filter(审核日期 == "未审核")  |>
    select("病案号", "患者姓名", "出院日期", "主管医生" ) |>
    arrange(主管医生, desc(出院日期))
  submission_data
}
```

<!-- 按月份汇总未提交纸质病历 -->
```{r}
#| results: asis
if (day_of_week %in% c("Fri", "Mon", "Tue")) {
  cat("### 按月份汇总未提交纸质病历\n")
}
```

```{r}
if (day_of_week %in% c("Fri", "Mon", "Tue")) {

  monthly_data <- submission_data |>
    mutate(年份=year(出院日期),
           月份=month(出院日期)) |>
    group_by(年份, 月份) |>
    summarise(汇总 = n())

  monthly_data
}
```


<!-- 按主管医生汇总未提交纸质病历 -->

```{r}
#| results: asis
if (day_of_week %in% c("Fri", "Mon", "Tue")) {
  cat("### 按主管医生汇总未提交纸质病历\n")
}
```

```{r}
if (day_of_week %in% c("Fri", "Mon", "Tue")) {

  submission_data |>
    group_by(主管医生) |>
    summarise(汇总 = n()) |>
    arrange(desc(汇总))
}
```
  • 错误方法:
```{r}
#| results: asis


day_of_week <- weekdays(Sys.Date(), abbreviate = TRUE)


if (day_of_week %in% c("Fri", "Mon", "Tue")) {
  cat("## 未提交纸质病历\n")

  submission_data <- readxl::read_xlsx('data/临床质控.xls') |>
    filter(审核日期 == "未审核")  |>
    select("病案号", "患者姓名", "出院日期", "主管医生" ) |>
    arrange(主管医生, desc(出院日期))

  submission_data

  cat("### 按月份汇总未提交纸质病历\n")

  monthly_data <- submission_data |>
    mutate(年份=year(出院日期),
           月份=month(出院日期)) |>
    group_by(年份, 月份) |>
    summarise(汇总 = n())

  monthly_data


  cat("### 按主管医生汇总未提交纸质病历\n")

  submission_data |>
    group_by(主管医生) |>
    summarise(汇总 = n()) |>
    arrange(desc(汇总))

}
```