添加class.source="stan"后Xaringan无法正常渲染Stan代码块的解决方法
解决xaringan中cat引擎结合Stan语法高亮的渲染问题
问题原因
cat引擎的核心功能是将代码写入文件,其语法高亮的参数传递逻辑与普通代码块不同,直接添加class.source="stan"无法正确触发highlight.js的Stan语法高亮规则,导致渲染异常。
解决方案1:分离代码保存与展示逻辑
通过两个独立代码块实现:一个仅负责将代码写入文件(不显示),另一个用标准Stan代码块展示内容并实现语法高亮。
--- output: xaringan::moon_reader --- --- # 隐藏的代码保存块(不显示在幻灯片中) ```{cat, engine.opts = list(file = 'code/stan/ex1.stan'), echo = FALSE} data { int<lower=0> N; //number of data vector[N] x; //covariates vector[N] y; //variates } parameters { real alpha; //intercept real beta; //slope real<lower=0> sigma; //scatter } model { //priors alpha ~ normal(0, 10); beta ~ normal(0, 10); sigma ~ normal(0, 1); y ~normal(alpha + beta * x, sigma); //likelihood }
带语法高亮的代码展示块
data { int<lower=0> N; //number of data vector[N] x; //covariates vector[N] y; //variates } parameters { real alpha; //intercept real beta; //slope real<lower=0> sigma; //scatter } model { //priors alpha ~ normal(0, 10); beta ~ normal(0, 10); sigma ~ normal(0, 1); y ~normal(alpha + beta * x, sigma); //likelihood }
### 解决方案2:用knitr函数保存代码,动态展示 将代码存储为变量,通过`knitr::write_file`写入文件,再在Stan代码块中引用变量,避免重复编写代码。 ```yaml --- output: xaringan::moon_reader --- --- ```{r, echo = FALSE} # 定义Stan代码内容 stan_code <- "data { int<lower=0> N; //number of data vector[N] x; //covariates vector[N] y; //variates } parameters { real alpha; //intercept real beta; //slope real<lower=0> sigma; //scatter } model { //priors alpha ~ normal(0, 10); beta ~ normal(0, 10); sigma ~ normal(0, 1); y ~normal(alpha + beta * x, sigma); //likelihood }" # 保存到指定文件 knitr::write_file(stan_code, "code/stan/ex1.stan")
动态展示带语法高亮的Stan代码
`r stan_code`
### 说明 两种方案都能同时实现代码保存到文件和Stan语法高亮的需求,方案2避免了代码重复,适合较长的Stan模型代码。 内容的提问来源于stack exchange,提问作者Sinval
相关产品推荐
相关产品推荐

