RMarkdown進階操作

2022-10-17 18:00:21

技術背景

Markdown大家都比較熟悉了,特別是在寫程式檔案和寫數學公式時,擁有著無與倫比的便利性。同時在前面的一篇部落格中我們介紹了使用RMarkdown去寫Latex Beamer演示檔案的方法,RMarkdown是由謝益輝等大神對Markdown、Latex和R語言等常用高階程式語言的結合,使得我們可以同時用這幾種語言去構造一個Beamer風格的演示檔案。本文主要介紹一些比較偏門的、但是經常可能用到的RMarkdown進階操作。

匯入Latex宏包

在RMarkdown標題處,我們可以自己寫一個普通的Latex檔案mysty.tex如下:

\usepackage{graphicx}
\usepackage{animate}
\usepackage{subfigure}   
\lstset{
  breaklines=true,
  basicstyle=\ttfamily
}

然後在RMarkdown的標題處引入該tex檔案:

---
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模組,都是後面要用到的功能。

修改圖片尺寸

# Test1
## Test2
\begin{figure}
\centerline{\includegraphics[width=1.0\textwidth]{./1.png}}
\end{figure}

這裡我們使用的是Latex的圖片匯入方法,預設居中,可以通過調整上述程式碼中的width引數來控制圖片列印的大小。

RMarkdown加註釋

從來沒想過在Markdown裡面還可以加註釋,但事實上確實可以操作的,可以在需要註釋的行前加上[comment]:即可:

[comment]:# Test1
[comment]:## Test2
[comment]:\begin{figure}
[comment]:\centerline{\includegraphics[width=1.0\textwidth]{./1.png}}
[comment]:\end{figure}

雖然編譯過程中會出現一系列的告警,但是我們可以不管。

長公式顯示

有時候我們的數學公式可能會比較長,這樣在演示檔案中可能會被自動截斷:

# 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
$$

此時編譯出來的演示檔案顯示效果非常不佳:

這個時候可以選擇使用行內公式,這樣可以自動換行,很大概率是可以完整顯示出來的:

# 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標籤即可:

# 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的標籤:

# 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宏包來構建這個動圖。

# Test1
## Test2
\center \animategraphics[width=0.45\linewidth, autoplay=True, loop, controls]{24}{gif-2/}{0}{65}

這裡065這兩個參數列示切割圖片的第一張的數位編號和最後一張的數位編號,加了loop引數之後會自動迴圈播放,同時我們還可以加上controls這個控制元件,用於控制動態圖的進退等,非常的靈活方便。顯示效果如下:

並排放置多張圖片

我們可以用subgraph宏包的功能匯入多張圖片並排,這個預設都是在同一列顯示的,但是子圖就可以允許我們多張圖片在同一行顯示:

# 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://www.cnblogs.com/dechinphy/p/advanced-rmarkdown.html

作者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://www.cnblogs.com/dechinphy/p/latex-gif.html