RMarkdown进阶操作

2022-10-28 10:16:03 浏览数 (1)

技术背景

Markdown大家都比较熟悉了,特别是在写程序文档和写数学公式时,拥有着无与伦比的便利性。同时在前面的一篇博客中我们介绍了使用RMarkdown去写Latex Beamer演示文档的方法,RMarkdown是由谢益辉等大神对Markdown、Latex和R语言等常用高级编程语言的结合,使得我们可以同时用这几种语言去构造一个Beamer风格的演示文档。本文主要介绍一些比较偏门的、但是经常可能用到的RMarkdown进阶操作。

导入Latex宏包

在RMarkdown标题处,我们可以自己写一个普通的Latex文档mysty.tex如下:

代码语言:javascript复制
usepackage{graphicx}
usepackage{animate}
usepackage{subfigure}   
lstset{
  breaklines=true,
  basicstyle=ttfamily
}

然后在RMarkdown的标题处引入该tex文件:

代码语言:javascript复制
---
title: "Your Title"
author: "Dechin"
date: "`2022.10.15`"
output: 
  beamer_presentation: 
    pandoc_args: --listings
    includes:
      in_header: mysty.tex
    toc: true
    number_sections: yes
    slide_level: 2
    theme: Dresden
    colortheme: seagull
---

注意这里我们导入了latex的动图animate模块和子图subfigure模块,都是后面要用到的功能。

修改图片尺寸

代码语言:javascript复制
# Test1
## Test2
begin{figure}
centerline{includegraphics[width=1.0textwidth]{./1.png}}
end{figure}

这里我们使用的是Latex的图片导入方法,默认居中,可以通过调整上述代码中的width参数来控制图片打印的大小。

RMarkdown加注释

从来没想过在Markdown里面还可以加注释,但事实上确实可以操作的,可以在需要注释的行前加上[comment]:即可:

代码语言:javascript复制
[comment]:# Test1
[comment]:## Test2
[comment]:begin{figure}
[comment]:centerline{includegraphics[width=1.0textwidth]{./1.png}}
[comment]:end{figure}

虽然编译过程中会出现一系列的告警,但是我们可以不管。

长公式显示

有时候我们的数学公式可能会比较长,这样在演示文档中可能会被自动截断:

代码语言:javascript复制
# Test1
## Test2
$$
[q_1, q_2]=q_1q_2-q_2q_1=(s_1s_2-x_1x_2-y_1y_2-z_1z_2) i(s_1x_2 s_2x_1 y_1z_2-y_2z_1) j(s_1y_2 s_2y_1 x_2z_1-x_1z_2) k(s_1z_2 s_2z_1 x_1y_2-x_2y_1)-(s_2s_1-x_2x_1-y_2y_1-z_2z_1)-i(s_2x_1 s_1x_2 y_2z_1-y_1z_2)-j(s_2y_1 s_1y_2 x_1z_2-x_2z_1)-k(s_2z_1 s_1z_2 x_2y_1-x_1y_2)=2i(y_1z_2-y_2z_1) 2j(x_2z_1-x_1z_2) 2k(x_1y_2-x_2y_1)neq0
$$

此时编译出来的演示文档显示效果非常不佳:

这个时候可以选择使用行内公式,这样可以自动换行,很大概率是可以完整显示出来的:

代码语言:javascript复制
# Test1
## Test2
$[q_1, q_2]=q_1q_2-q_2q_1=(s_1s_2-x_1x_2-y_1y_2-z_1z_2) i(s_1x_2 s_2x_1 y_1z_2-y_2z_1) j(s_1y_2 s_2y_1 x_2z_1-x_1z_2) k(s_1z_2 s_2z_1 x_1y_2-x_2y_1)-(s_2s_1-x_2x_1-y_2y_1-z_2z_1)-i(s_2x_1 s_1x_2 y_2z_1-y_1z_2)-j(s_2y_1 s_1y_2 x_1z_2-x_2z_1)-k(s_2z_1 s_1z_2 x_2y_1-x_1y_2)=2i(y_1z_2-y_2z_1) 2j(x_2z_1-x_1z_2) 2k(x_1y_2-x_2y_1)neq0$

行内公式的显示效果如下所示:

这样一来,我们就可以在演示文档上面看到完整的公式。

公式居中和缩放

续上一个章节内容,在公式使用行内显示之后,我们发现公式此时是居左显示的,而我们如果想要居中,在前面加一个center标签即可:

代码语言:javascript复制
# Test1
## Test2
center $[q_1, q_2]=q_1q_2-q_2q_1=(s_1s_2-x_1x_2-y_1y_2-z_1z_2) i(s_1x_2 s_2x_1 y_1z_2-y_2z_1) j(s_1y_2 s_2y_1 x_2z_1-x_1z_2) k(s_1z_2 s_2z_1 x_1y_2-x_2y_1)-(s_2s_1-x_2x_1-y_2y_1-z_2z_1)-i(s_2x_1 s_1x_2 y_2z_1-y_1z_2)-j(s_2y_1 s_1y_2 x_1z_2-x_2z_1)-k(s_2z_1 s_1z_2 x_2y_1-x_1y_2)=2i(y_1z_2-y_2z_1) 2j(x_2z_1-x_1z_2) 2k(x_1y_2-x_2y_1)neq0$

居中显示效果如下:

在行内公式显示下,依然存在公式过长的问题,此时我们可以借鉴参考链接1中的方法,在公式前面再加一个tiny的标签:

代码语言:javascript复制
# Test1
## Test2
tiny center $[q_1, q_2]=q_1q_2-q_2q_1=(s_1s_2-x_1x_2-y_1y_2-z_1z_2) i(s_1x_2 s_2x_1 y_1z_2-y_2z_1) j(s_1y_2 s_2y_1 x_2z_1-x_1z_2) k(s_1z_2 s_2z_1 x_1y_2-x_2y_1)-(s_2s_1-x_2x_1-y_2y_1-z_2z_1)-i(s_2x_1 s_1x_2 y_2z_1-y_1z_2)-j(s_2y_1 s_1y_2 x_1z_2-x_2z_1)-k(s_2z_1 s_1z_2 x_2y_1-x_1y_2)=2i(y_1z_2-y_2z_1) 2j(x_2z_1-x_1z_2) 2k(x_1y_2-x_2y_1)neq0$

缩小后的公式显示效果如下:

还有众多的大小范围可调(图片来自于参考链接1):

Beamer PDF中添加动图

在前面一篇博客中,我们介绍了在Latex生成PDF时我们也可以展示一些动态过程。这需要我们先用Python把一个动态图切割成很多个图片,放在一个指定文件夹下,然后调用Latex的animate宏包来构建这个动图。

代码语言:javascript复制
# Test1
## Test2
center animategraphics[width=0.45linewidth, autoplay=True, loop, controls]{24}{gif-2/}{0}{65}

这里065这两个参数表示切割图片的第一张的数字编号和最后一张的数字编号,加了loop参数之后会自动循环播放,同时我们还可以加上controls这个控件,用于控制动态图的进退等,非常的灵活方便。显示效果如下:

并排放置多张图片

我们可以用subgraph宏包的功能导入多张图片并排,这个默认都是在同一列显示的,但是子图就可以允许我们多张图片在同一行显示:

代码语言:javascript复制
# Test1
## Test2
begin{figure}
  centering
  subfigure[]{includegraphics[width=1.2in]{./13.png}}
  subfigure[]{includegraphics[width=2.8in]{./14.png}}
end{figure}

显示效果如下:

总结概要

本文通过几个实际案例,介绍了RMarkdown在写Latex Beamer演示文档中有可能用到的一些进阶的操作。RMarkdown不仅仅继承了Markdown语言的简洁便利,还允许我们仍然使用Latex中的一些高级操作,甚至我们可以在生成的Beamer演示文档PDF中去展示一些动态的效果图,这是通过PPT等工具去生成PDF所不具备的功能(有可能有,只是我不了解,这里使用Latex Beamer来写演示文档仅仅是个人偏好)。

版权声明

本文首发链接为:https://cloud.tencent.com/developer/article/2142798

作者ID:DechinPhy

更多原著文章请参考:https://www.cnblogs.com/dechinphy/

打赏专用链接:https://www.cnblogs.com/dechinphy/gallery/image/379634.html

腾讯云专栏同步:https://cloud.tencent.com/developer/column/91958

CSDN同步链接:https://blog.csdn.net/baidu_37157624?spm=1008.2028.3001.5343

51CTO同步链接:https://blog.51cto.com/u_15561675

参考链接

  1. https://www.huwenqiang.cn/articles/2020/10/22/1603372559446.html
  2. https://cloud.tencent.com/developer/article/2134844

0 人点赞