HTML形式のRMarkdownスクリプトの場合、キャプション内の数字に番号を付ける方法を知っている人はいますか?
PDFドキュメントの場合、キャプションは次のようになります。
図X:キャプションテキスト
ただし、HTMLバージョンの同等のキャプションは単に次のようになります。
キャプションテキスト
これにより、数値による相互参照は完全に役に立たなくなります。
最小限の例を次に示します。
---
title: "My Title"
author: "Me"
output:
pdf_document: default
html_document: default
---
```{r cars, fig.cap = "An amazing plot"}
plot(cars)
```
```{r cars2, fig.cap = "Another amazing plot"}
plot(cars)
```
各出力形式でtoc
、fig_caption
、number_sections
を設定してみましたが、結果が変わらないようです。
提供されている他の回答は比較的古くなっており、これはbookdownパッケージを使用して非常に簡単になりました。このパッケージは、Word、HTML、およびPDF全体の図の組み込みの番号付けを含む多くの改善を提供します。
bookdownを使用できるようにするには、最初にパッケージinstall.packages("bookdown")
をインストールしてから、 出力)のいずれかを使用する必要があります。フォーマット 。 HTMLの場合、これは_html_document2
_です。あなたの例を取る:
_---
title: "My Title"
author: "Me"
date: "1/1/2016"
output: bookdown::html_document2
---
```{r cars, fig.cap = "An amazing plot"}
plot(cars)
```
```{r cars2, fig.cap = "Another amazing plot"}
plot(cars)
```
_
これらの図には、_Figure 1
_および_Figure 2
_の番号が付けられます。コードチャンクに名前が付けられ、キャプションが付いている場合、構文\@ref(fig:foo)
を使用して出力を相互参照できます。ここで、foo
はチャンクの名前、つまり\@ref(fig-cars)
です。この動作について詳しく知ることができます ここ
さらに読む
- R Markdown:決定的なガイド :第11章では、ブックダウンの概要を説明しています。
- bookdownを使用した書籍の作成 は、bookdownに関する包括的なガイドを提供し、より高度な詳細については推奨されます。
したがって、誰かがより良い解決策を持っていない限り、これは私が思いついた解決策です、このアプローチにはいくつかの欠陥があります(たとえば、図/表の番号がセクション番号に依存している場合など)が、基本的なhtmlドキュメント、それは動作します。
ドキュメントの上部のどこかで、これを実行します。
```{r echo=FALSE}
#Determine the output format of the document
outputFormat = opts_knit$get("rmarkdown.pandoc.to")
#Figure and Table Caption Numbering, for HTML do it manually
capTabNo = 1; capFigNo = 1;
#Function to add the Table Number
capTab = function(x){
if(outputFormat == 'html'){
x = paste0("Table ",capTabNo,". ",x)
capTabNo <<- capTabNo + 1
}; x
}
#Function to add the Figure Number
capFig = function(x){
if(outputFormat == 'html'){
x = paste0("Figure ",capFigNo,". ",x)
capFigNo <<- capFigNo + 1
}; x
}
```
次に、ドキュメントの作成中に、図をプロットしたい場合は、次のようにします。
```{r figA,fig.cap=capFig("My Figure Caption")
base = ggplot(data=data.frame(x=0,y=0),aes(x,y)) + geom_point()
base
```
表のキャプションが必要な場合は、上記のcapFig
をcapTab
に置き換えます。
pandoc-crossref を利用できます。これは、図、表、セクション、方程式の相互参照を可能にし、すべての出力形式で機能するフィルターです。最も簡単な方法は、各プロットの後に図ラベルをcat
({#fig:figure_label}
の形式で)することですが、これにはecho=FALSE
とresults='asis'
が必要です。次に、引用と同じように図を参照できます。[@fig:figure_label]
はデフォルトでfig. figure_number
を生成します。
これがMWEです。
---
output:
html_document:
toc: true
number_sections: true
fig_caption: true
pandoc_args: ["-F","pandoc-crossref"]
---
```{r}
knitr::opts_chunk$set(echo=FALSE,results='asis')
```
```{r plot1,fig.cap="This is plot one"}
x <- 1:10
y <- rnorm(10)
plot(x,y)
cat("{#fig:plot1}")
```
As we can see in [@fig:plot1]... whereas [@fig:plot2] shows...
```{r plot2, fig.cap="This is plot two"}
plot(y,x)
cat("{#fig:plot2}")
```
生成する(グラフィックを削除する)
PLOT1
図1:これはプロット1です
図でわかるように。 1…一方、図。 2つのショー…
PLOT2
図2:これはプロット2です
その他のオプションとカスタマイズについては、 pandoc-crossref readme を参照してください。
Haskellがインストールされていると仮定して、pandoc-crossrefをインストールするには:
cabal update
cabal install pandoc-crossref
上記のニコラスによって投稿されたものと同様のソリューションを使用して、相互参照を解決します。一部のプロジェクトではブックダウンを使用していますが、単純な相互参照が必要な他のプロジェクトでは使用するのが面倒です。
私はrmarkdownで論文を書いているときに以下を使用し、ジャーナルに提出するために標準形式でそれを望んでいます。最後に図の凡例が必要で、次に表が必要です。次に表と図があります。私が書いているとき、私は図がテキストで参照される順序について大まかな考えしか持っていません。 fig:foobarのようなテキストコードでそれらを参照し、テキスト内の外観に基づいて番号を割り当てたいだけです。図の凡例リストを見ると、凡例を配置する順序がわかり、必要に応じて凡例を移動します。
これが私の構造です。
さまざまな参考文献やヘルパーR関数など、論文に必要なものが入ったRパッケージがあります。そのパッケージには、メインのRmd環境で定義されているいくつかの変数を使用する次の関数があります:.rmdenvirおよび.rmdctr。
ref <- function(useName) {
require(stringr)
if(!exists(".refctr")) .refctr <- c(`_` = 0)
if(any(names(.refctr)==useName)) return(.refctr[useName])
type=str_split(useName,":")[[1]][1]
nObj <- sum(str_detect(names(.refctr),type))
useNum <- nObj + 1
newrefctr <- c(.refctr, useNum)
names(newrefctr)[length(.refctr) + 1] <- useName
assign(".refctr", newrefctr, envir=.rmdenvir)
return(useNum)
}
参照したいものにcntname:fooのような名前を付けることを前提としています(例:fig:foo)。それぞれに新しいカウンターが作成され、必要に応じてその場で(書き込み中に)新しいカウンターを作成できます。
メインのRmdファイルには、いくつかのセットアップ行があります。
```{r setup_main}
require(myPackageforPapers)
# here is where the variables needed by ref() are defined.
.rmdenvir = environment()
.refctr <- c(`_` = 0)
````
本文では以下を使用しています
You can see what I am trying to show in Figure `r ref("fig:foo")`
and you can see it also in Tables `r ref("tab:foo")`
and A`r ref("tabappA:foobig")`.
「図1に表示しようとしているものが表示され、表1とA1にも表示されます。」を取得するには数字は1ではないかもしれませんが;使用する数は動的に決定されます。図や表など、数えているものを初めて参照するときに、特別な関数を使用する必要はありません。 ref()は、ラベルがすでに存在するかどうかを確認することでそれを判断します。そうでない場合は、次の番号を割り当てて返します。したがって、ある場所で「label」を使用し、別の場所で「ref」を使用する必要はありません。
執筆の過程で、付録Aが大きくなりすぎていると判断し、一部のテーブルを付録Bに分割することを決定する場合があります。必要なのは上記を次のように変更することだけです。
You can see what I am trying to show in Figure `r ref("fig:foo")`
and you can see it also in Tables `r ref("tab:foo")`
and B`r ref("tabappB:foobig")`.
新しいカウンター名「tabappB」を指定するだけで、その番号は動的に決定されます。
Rmdファイルの最後に、次のような図のリストがあります。
# Figure Legends
Figure `r ref("fig:foo")`. This is the legend for this figure.
Figure `r ref("fig:foo2")`. This is the legend for another figure.
それから私のテーブルはそのように見えます
```{r print-tablefoo, echo=FALSE}
tablefoo=mtcars
thecap = "Tables appear with a legend while figures do not."
fullcap = paste("Table ", ref("tab:foo"), ". ", thecap, sep="")
kable(tablefoo, caption=fullcap)
```
そしてそのような数字:
```{r fig-foo, echo=FALSE, fig.cap=paste("Figure",ref("fig:foo"))}
plot(1,1)
```
付録Aは、子として含まれているRmdファイルです。次のようなテーブルがあります
```{r print-tableAfoo, echo=FALSE}
tablefoo=mtcars
thecap = "This is a legend."
fullcap = paste("Table A", ref("tabappA:foobig"), ". ", thecap, sep="")
kable(tablefoo, caption=fullcap)
```
表A1を取得するには、「A」を追加する必要がありますが、Rがカウンターのラベル付けに関してあまり考えていない方が簡単です。正しい番号を返したいだけです。
相互参照は、html、pdf/latexまたはWordで機能します。ラテックスソリューションを使い続けたいと思いますが、共著者はWordを使用しているため、pandocとWordで機能するソリューションが必要です。また、htmlまたはその他の出力が必要な場合があり、rmarkdownで機能するすべての出力で機能するソリューションが必要です。