Ben
Ben

Reputation: 267

Add Table of contents in different position in Rmd pdf

I want to add the table of content in different place instead of the first page in .Rmd pdf. I found the function render_toc() from @Garrick Aden-Buie this is the link https://gist.github.com/gadenbuie/c83e078bf8c81b035e32c3fc0cf04ee8. It is working perfect if I don't use cat() in chunk codes.

I have to use cat() in my .Rmd, is there any way I can add the table of contents any place in .Rmd

You can see the table of contents only test 1, test 2, and test 3, setosa, versicolor, virginica did not include in table of content

---
title: "test"
output:
  pdf_document:
    number_sections: yes
    toc: yes
    toc_depth: 4
---


```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
source("render_toc.R")
library(knitr)

```
\newpage

# Table of Contents {#crazy-slug-here}


```{r echo = FALSE}
render_toc("test.Rmd")
```
# Test 1

# Test 2

# Test 3

```{r echo = FALSE, results ='asis'}
library(ggplot2)
for(Species in levels(iris$Species)){
  cat('\n#', Species, '\n')
  p <- ggplot(iris[iris$Species == Species,], aes(x = Sepal.Length, y = Sepal.Width)) +
    geom_point()
  print(p)
  cat('\n')
}
```

Pic

Upvotes: 0

Views: 826

Answers (1)

canovasjm
canovasjm

Reputation: 513

Using the code you provided I'm able to knit the pdf document and get the three plots, one for each Species in iris.

This code, however, produces two TOCs: one of them in the first page which is not desired according to your question. In order to get only the TOC produced by the function render_toc() set toc: no in the YAML header.

---
title: "test"
output:
  pdf_document:
    number_sections: yes
    toc: no
    toc_depth: 4
---

This way only one TOC will be generated and placed where render_toc() is.


Edit: After seeing your edit with the desired output, I think the following LaTeX code can help:

\newpage
\thispagestyle{plain}
\mbox{}

\setcounter{tocdepth}{2}
\renewcommand{\contentsname}{Table of Contents}
\tableofcontents

\newpage
\thispagestyle{plain}
\mbox{}

Note: here we are not using render_toc(). The code creates the TOC in the second page of the document. If you need another blank page, just introduce another block of:

\newpage
\thispagestyle{plain}
\mbox{}

These pages may or may not be numbered, which you control via the argument passed to \thispagestyle{}. See here for more details.

Full code:

---
title: "Document title"
output:
  pdf_document:
    number_sections: yes
---

```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
```
\newpage
\thispagestyle{plain}
\mbox{}

\setcounter{tocdepth}{2}
\renewcommand{\contentsname}{Table of Contents}
\tableofcontents

\newpage
\thispagestyle{plain}
\mbox{}

# Test 1
## Subsection 1

# Test 2
## Subsection 2

# Test 3

```{r, results='asis', echo=FALSE}
library(ggplot2)
for(Species in levels(iris$Species)){
  cat('\n#', Species, '\n')
  p <- ggplot(iris[iris$Species == Species,], 
              aes(x = Sepal.Length, y = Sepal.Width)) +
    geom_point()
  print(p)
  cat("\n")
}
```

This way we end up with a TOC looking like this:

enter image description here

Upvotes: 1

Related Questions