行内代码

概述

行内代码允许您在Markdown中执行代码,例如在叙述中自动使用最新的计算结果。Quarto提供了一种适用于所有三个引擎(Jupyter、Knitr和OJS)的行内代码语法。

行内代码的语法类似于代码块,只是您使用单个反引号()而不是三个反引号(```),并且可以在Markdown中间使用。例如,以下代码将变量radius`存储在一个代码块中,然后在句子中使用行内代码访问它:

```{python}
radius = 5
```

圆的半径是 `{python} radius`

此语法适用于任何Jupyter内核——因此对于Julia,您将行内表达式写作 `{julia} radius`)。

```{r}
radius <- 5
```

圆的半径是 `{r} radius`
```{ojs}
radius = 5
```

圆的半径是 `{ojs} radius`

代码的结果是这个Markdown输出:

圆的半径是 5。
保持行内代码简单

行内表达式应限于您在正常代码单元格中预先计算的简单值(而不是执行非平凡工作的函数调用)。这是因为用于行内表达式的协议与某些Python库(尤其是使用多线程或多处理的库)不兼容。

Quarto还支持Knitr和OJS的原生语法。请在语法兼容性中阅读更多内容。

行内代码不能用于YAML

行内表达式通常不支持在YAML字符串内部使用,例如您不能使用行内代码生成title文档选项或fig-cap代码单元格选项。

如果您需要生成动态标题,请结合行内代码与交叉引用Div语法,而不是使用fig-captbl-cap代码单元格选项。

在笔记本中的使用

行内表达式在渲染和预览.qmd文件时总是会被评估。然而,对于笔记本,您需要使用Quarto执行笔记本以评估行内表达式(即它们不会在JupyterLab、VS Code或PyCharm笔记本编辑器中被评估)。

您可以在您喜欢的笔记本前端中工作,而不使用Quarto执行,然后在准备好发布时在渲染过程中执行笔记本,如下所示:

终端
$ quarto render notebook.ipynb --execute

您还可以在笔记本的YAML选项中打开执行。例如:

---
title: "我的笔记本"
execute:
  enabled: true
---

Markdown输出

默认情况下,行内表达式的输出被视为普通文本(即其中的Markdown不会被渲染)。行内表达式输出中的任何类似Markdown的语法都将被自动转义。例如,以下行内表达式:

 `{python} '**not bold**'` 

将生成以下Markdown:

\*\*not bold\*\*

要显式创建Markdown输出,您需要使用特定于您引擎的函数:

使用IPython.display中的Markdown()函数:

```{python}
from IPython.display import Markdown
```

这是 `{python} Markdown('**bold**')`

使用I()函数:

这是 `{r} I("**bold**")`

使用md函数:

```{ojs}
text = md`This is **bold**`
```

`{ojs} text`

转义

如果您正在编写关于行内表达式的文档(就像我们在本文中一样!),那么您可能需要转义语法以便它不会执行。您可以通过以下两种方式之一来实现:

  1. 在表达式周围使用双大括号。例如:`{{python}} x`

  2. 在表达式周围添加额外的反引号。例如:``{python} x``

上述每个表达式将在输出文档中渲染(未评估)为 `{python} x`

引擎绑定

如果您在没有任何可执行代码块的文档中使用行内表达式,则应显式设置engine文档选项以确保您的表达式被评估(自动引擎绑定适用于块,但不适用行内)。例如:

---
title: "我的文档"
engine: jupyter
---

`{python} "hello"`

语法兼容性

为了更容易跨引擎学习和使用表达式,Quarto提供了一种适用于所有引擎的单一语法。然而,您也可以使用Knitr和Observable的原生语法。

Knitr

原生Knitr语法也使用单个反引号(),但不将r括在大括号中。例如: ``` markdown 圆的半径是r radius`。

Knitr 原生内联语法在处理 [Markdown 输出] 时具有不同的默认行为。具体来说,它将所有内联输出视为 *包含 Markdown 格式*。这意味着上述示例等同于:

```markdown
The radius of the circle is `{r} I(radius)`.

OJS

原生情况下,OJS 使用 ${expr} 语法。例如:

The radius of the circle is ${radius}