1 初めに

Rpubs のコンテンツで外部リンクを張ると, ページが表示されない問題がある. これは, Rpubs が外部リンクをフレーム内で表示するようになっているため, フレームを許可しないサイトの表示ができないためである1. よって <a> タグのうち, 外部サイトへのリンクを張るものにだけ新しいタブまたはウィンドウで開くように target='_blank' 属性を付けるというのが解決策の一つとなる.

なお, この方法は rmarkdown で使用する pandoc のバージョンが 2.11 以降であることを想定している.2 pandoc のバージョン確認方法は R Markdown クックブック 1.1 節を確認してほしい.

2 フィルターで自動処理

しかし, 手動で全てのリンクに書くのは面倒なので, フィルタを使い自動で処理する.

以下のような簡単な Lua フィルタを作成した. これを add-target-attr.lua として保存する.

function Link(elem)
  if(elem.target:sub(1, 1) ~= '#') then
    elem.attributes.target = '_blank'
    elem.attributes.rel = 'external'
  end
  return elem
end

なお, ついでに rel ='external' を指定している. おそらく必須ではないが, メタ情報があったほうが行儀がいいかと思って追記した (SEO 関係の話は詳しくないのでわからない).

YAML メタデータの例は以下のようになる. 出力オプション pandoc_args でフィルタの指定をできることと, citeproc: no が重要である. ページ内部の相互参照を別タブで開くのはかえって使いづらいため, 動作確認を兼ねて相互参照の使用できる bookdown パッケージのフォーマットを使用している3.

output:
  bookdown::html_document2:
    pandoc_args:
      - --citeproc
      - --lua-filter=add-target-attr.lua
bibliography: package.bib
link-citations: yes
citeproc: no

文献リスト内にも外部サイトへのハイパーリンクが含まれることがある (DOIの参照とか) が, 文献リストの出力処理は通常フィルタより後に行われるため, このままでは文献情報内のハイパーリンクに属性を付与できない. よって, この処理の順番を操作する必要がある. citeproc: no はデフォルトの文献リスト出力処理を無効にする効果がある. その上で, pandoc_args に手動で指定することで処理の順番を変えている. なお, --citeproc 自体も pandoc フィルターである. しかし, この方法だと本文中の引用子のリンクも新しいタブで開いてしまうため, add-target-attr.lua ではリンクターゲット文字列の1文字目が # かどうかで判定している (もしかしたらもう少しスマートな方法があるかも).

もしも pandoc 本体が 2.11 より古い場合, --citeproc ではなく --filter pandoc-citeproc とすると動作するかもしれない.

3 動作確認

3.1 文書内の相互参照

セクションの参照: ここはセクション3.

脚注リンク4

文献引用: この文書は rmarkdown パッケージ (Allaire et al. 2021) で作成している.

\[ \begin{align} 1 + 1 & = 2 \tag{3.1} \end{align} \]

(3.1) を見よ.

3.1を見よ.

plot(1:10)
図の例

Figure 3.1: 図の例

3.1を見よ.

knitr::kable(head(mtcars), booktabs = T, caption = "表の例")
Table 3.1: 表の例
mpg cyl disp hp drat wt qsec vs am gear carb
Mazda RX4 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4
Mazda RX4 Wag 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4
Datsun 710 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1
Hornet 4 Drive 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1
Hornet Sportabout 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2
Valiant 18.1 6 225 105 2.76 3.460 20.22 1 0 3 1

3.2 様々な Markdown 記法の動作

http://rmarkdown.rstudio.com

http://rmarkdown.rstudio.com

<http://rmarkdown.rstudio.com>

http://rmarkdown.rstudio.com

<http://rmarkdown.rstudio.com>{hreflang='en-us'}

http://rmarkdown.rstudio.com

[RStudio](http://rmarkdown.rstudio.com)

RStudio

[RStudio](http://rmarkdown.rstudio.com){test='value'}

RStudio

[RStudio](http://rmarkdown.rstudio.com){id="id1" rel='external'}

RStudio

参考文献

Allaire, JJ, Yihui Xie, Jonathan McPherson, Javier Luraschi, Kevin Ushey, Aron Atkins, Hadley Wickham, Joe Cheng, Winston Chang, and Richard Iannone. 2021. Rmarkdown: Dynamic Documents for r. https://CRAN.R-project.org/package=rmarkdown.

  1. https://support.rstudio.com/hc/en-us/articles/201105636-Using-external-links-in-RPubs↩︎

  2. この辺は atusy 氏に助言をもらった. https://r-wakalang.slack.com/archives/C0ADVD13N/p1618752165074500↩︎

  3. なお, ver. 0.22 時点の bookdown でサポートされている相互参照 (数式, セクションタイトル, 図表) は pandoc の変換後に処理されるのでこれらのハイパーリンクで新しいタブが開かれる心配はない.↩︎

  4. 脚注↩︎