行内代码
概述
行内代码允许您在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字符串内部使用,例如您不能使用行内代码生成title
文档选项或fig-cap
代码单元格选项。
如果您需要生成动态标题,请结合行内代码与交叉引用Div语法,而不是使用fig-cap
或tbl-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`
转义
如果您正在编写关于行内表达式的文档(就像我们在本文中一样!),那么您可能需要转义语法以便它不会执行。您可以通过以下两种方式之一来实现:
在表达式周围使用双大括号。例如:
`{{python}} x`
在表达式周围添加额外的反引号。例如:
``{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}