【问题标题】:Vertically scrollable code with RStudio and xaringan带有 RStudio 和 xaringan 的垂直可滚动代码
【发布时间】:2021-08-17 09:24:29
【问题描述】:

我目前正在为 R 建模研讨会准备 html 幻灯片,为此我使用了用于 R 的很棒的 xaringan 包。它基于remark.js。与 ioslides 和 slidy 相比,它确实更符合我的期望。我非常兴奋!我错过的一项功能是可滚动的“长幻灯片”。在这里,我当然将“幻灯片”范式转向幻灯片和普通网页之间的混合,但我发现这在解释复杂的内容和代码方面具有教学吸引力。这种风格与 slidy 配合得很好,我还发现了一些提示如何在 xaringan 中启用可滚动代码。

这里我使用以下 CSS(在 related post at SO 中找到):

.scrollable {
  height: 80%;
  overflow-y: auto;
} 

然后在 RMarkdown 代码块中类似于:

.scrollable[
  
```{r}
foo <- function() {
  cat("nothing\n")
}

foo()
foo()
foo()
foo()
foo()
foo()
foo()
foo()
foo()
foo()

## some comments ...
# ...
foo()
```

]

长幻灯片

我的意思是网页可以向下滚动,但仍然嵌入在幻灯片放映中。

代码示例

一个带有可滚动代码的示例在幻灯片中在这里很受欢迎:

它部分工作,但我还没有完全满意:

  • 我更喜欢真正的“长幻灯片”而不是可滚动的文本。
  • 与其用.scrollable[] 括起来,我更喜欢一个完整的幻灯片类
  • 它仅适用于 Chrome、Edge(和 RStudio 的 Infinite Moon Reader),但不适用于 Firefox。 编辑: 绝对 heigt 适用于 Firefox(感谢 @Waldi 的评论)

CSS 方法取自 a related post at SO,其中还包含指向其他方法的链接(部分使用额外的 JavaScript),但我无法让它们运行。

问题

任何想法,如何:

  • 定义一个带有可滚动内容的 xaringan 幻灯片类或
  • 将幻灯片定义为真正的“长幻灯片”,即长 html 页面

“具有可滚动内容的幻灯片类”或“长幻灯片”类的定义如下:

---
class: scrollable-slide

类似于:

---
layout: false
class: inverse, middle, center

发现于https://github.com/yihui/xaringan/wiki/Slide-layouts

【问题讨论】:

  • 请注意,如果您设置固定的height 而不是百分比,.scrollable 也适用于 Firefox。
  • 谢谢,一个很小但确实很重要的提示。我记得 Firefox 似乎在一种情况下工作,但我做了太多的试验和错误......
  • xaringan 幻灯片类是什么意思?你的意思是remark class property?
  • 我的意思是可以放在---幻灯片分隔符下方的类定义。感谢您的评论,我相应地编辑了问题。

标签: html css r rstudio xaringan


【解决方案1】:

remark.js 没有考虑到可滚动的幻灯片,这意味着如果没有主要功能添加到 remark.js 或破坏某些 remark.js 功能,就无法实现滚动。

如果您愿意破坏某些功能,我能想到的破解可滚动幻灯片的最简单方法是更改​​.remark-slide-scaler 类的y-overflow。我们所要做的就是添加以下 CSS:

.remark-slide-scaler {
    overflow-y: auto;
}

要包含此 CSS,您可以将其写入文件,例如 scrollable.css,然后将其包含在 xaringan 配置块中,如下所示:

title: "Scrollable slides"
output:
  xaringan::moon_reader:
    css: ["default", "scrollable.css"]

此 CSS 将为所有内容比幻灯片本身长的幻灯片添加滚动条。

破坏的东西

滚动幻灯片

默认情况下,remark.js 允许您从一张幻灯片滚动到下一张或上一张。但是,当我们在幻灯片上有滚动条时,我们希望禁用此行为。

解决这个问题的正确方法是在remark.js 中编写实现一些功能,在适当的时候禁用和启用默认滚动行为。

一种简单的方法是简单地禁用幻灯片滚动。我们可以通过在我们的xaringan 配置的nature 块中添加scroll: falsenavigation 块来做到这一点:

title: "Scrollable slides"
output:
  xaringan::moon_reader:
    css: ["default", "scrollable.css"]
    nature:
      navigation:
# Disable scrolling through slides to
# allow scrolling in slides
        scroll: false

页码

页码位于幻灯片框架的底部,但贴在幻灯片内容的底部。这意味着当您向下滚动可滚动幻灯片时,页码也会向上滚动。

要正确解决此问题,我们必须更改 remark.js 呈现内容的方式。一个常见的解决方案是类似this,它涉及将主要内容放在与页脚不同的容器中。此页脚将包含页码。

一个简单的解决方案是隐藏页码。我们可以通过将以下内容添加到我们的scrollable.css

.remark-slide-number {
    display: none;
}

克隆

remark.js 有一个名为“克隆”的功能,可以让您打开多个幻灯片实例,但都同步到同一页面。因此,当一个实例转到下一张幻灯片时,所有其他幻灯片也会这样做。不幸的是,这对于我们的滚动幻灯片并没有按预期工作。 remark.js 无法注册页面向下滚动的距离,因此它无法将其传达给其克隆。这意味着在一个实例上您可能一直向下滚动,但其他实例仍将停留在内容的顶部。一个简单的解决方案是干脆不使用此功能。

打印(未测试)

我没有对此进行测试,但我可以想象滚动幻灯片会破坏打印。内容将被截断,或者长页面将被打印在其整个长度上,可能会与页面上的其他内容重叠。一个简单的解决方案就是不打印幻灯片。

可能有更多功能(例如打印)可能会或可能不会因滚动幻灯片中的黑客攻击而损坏。

结论

总而言之,如果您能够忍受有限的功能,您可以通过首先创建一个文件 scrollable.css 来破解滚动幻灯片,其中包含:

.remark-slide-scaler {
    overflow-y: auto;
}

.remark-slide-number {
    display: none;
}

其次,在您的 xaringan 配置中包含 scrollable.cssscroll: false。我在下面包含了一个示例幻灯片来说明。

---
title: "Scrollable slides"
output:
  xaringan::moon_reader:
    css: ["default", "scrollable.css"]
    nature:
      navigation:
# Disable scrolling through slides to
# allow scrolling in slides
        scroll: false
---
class: center

# First a normal short slide

Some content here
---
class: scrollable-slide

# A

# long

# slide

# that

# requires

# scrolling

# on

# my

# system
---
# End slide

其他选项

如果您没有太多需要较长的幻灯片,您可以选择制作讲义。如果您使用rmarkdown 进行此操作,它将使讲义的源文件与幻灯片的源文件非常相似,允许导出为不同的格式(如 html),并允许您使用所有remark.js的特点。

另一个选择,如果您真的需要这个并且可以很好地说明为什么这对其他人也有用,那就是在 remark.js GitHub page 提出功能请求以获得可滚动幻灯片。

【讨论】:

  • 非常感谢,这很好用。我也可以重现上述问题,这对于我的目的是可以容忍的。 (1) 鼠标滚动无论如何都被禁用。 (2) 页码可以被视为一项功能,而不是错误,因为人们可以看到页面通常会在哪里结束。 (3) 克隆:很适合演讲者的笔记,但在这个用例中不是必需的。 (4) 打印:不起作用,但制作可打印的讲义确实很容易——反正这是我喜欢的东西。感谢您的提醒 ;-) 好的,还有一些问题和愿望,但我现在对 xarigan/remark.js 更加兴奋。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-21
  • 2020-02-14
相关资源
最近更新 更多