Bookdown : Automatic figure numbering and cross-referencing doesn't work - r-markdown

I am trying to write my master's thesis in RMarkdown.
I first tried to fix an issue with the position of my figures in the pdf document, and used this method : https://stackoverflow.com/a/33801326.
So my YAML header looked like this :
title: "example"
author: "me"
output:
rmarkdown::pdf_document:
fig_caption: yes
includes:
in_header: preamble-latex.tex
Then, I wanted my figures numbered and easily cross-referenced. I tried changing the output to bookdown::pdf_document2: since the method I was taught (that is ![caption\label{mylabel}] and \autoref{mylabel} ) did not work at all and ended up with this :
---
title: "example"
author: "me"
output:
bookdown::pdf_document2:
fig_caption: yes
includes:
in_header: preamble-latex.tex
---
```{r label, echo=FALSE, fig.cap="caption", out.width='75%', out.height='75%'}
knitr::include_graphics("../../images/my_image.png")
\```
and tried to cross-reference like this : #ref(fig:label)
The image does appear in the right place, at the right size and with my caption. But it is not numbered (there is no "Figure 1" mention before my caption) and the reference appears almost exactly as is in the knitted document, only without the backslash (so #ref(fig:label)). No matter where I look or what I do, I cannot seem to change that...
Could it be that bookdown's automatic numbering does not work because of the changes I made in the YAML header to keep my images in the right place? What can I do to fix this issue?

Problem has been solved by
giving up on using bookdown and coming back to the recommended output (that is ::rmarkdown:pdf_document: )
updating all R and tinytex packages
adding a line in the LaTex file :
/usepackage{float}
to fix an newly appeared error (unknown float option h)
The figures were then held in the right spot and numbered (although they weren't numbered before...)
using \autoref{fig:label} instead of \#ref(fig:label) for the cross-reference, in conjunction with include_graphics()

Related

Dynamic footnote referencing in rmarkdown / bookdown

I am combining several .Rmd-files into one large document using bookdown. The individual files all contain footnotes, starting with ^[1]. This obviously leads to duplicate footnotes in the final document, with bookdown unable to assert which reference belongs to which footnote.
As a consequence, I am wondering whether there is a way to dynamically generate footnotes when the document is rendered, but I could not find anything related to that in the bookdown docs.
I have this working solution using a custom function:
---
title: "Untitled"
output:
html_document:
---
```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
footnote.nr <- 0
footnote.counter <- function(){
footnote.nr <- footnote.nr + 1
.GlobalEnv$footnote.nr <- footnote.nr
return(footnote.nr)
}
```
Lorem ipsum.[^`r footnote.counter()`]
[^`r footnote.nr`]: Test
Lorem ipsum.[^`r footnote.counter()`]
[^`r footnote.nr`]: Test2
However, this would result in me having to retrofit the entire document which would be just as much manual labor as starting footnote numbering completely anew (though it is probably less error prone). Are there any other solutions? I would also be okay with footnotes being rendered for each individual chapter, meaning that the first footnote in each chapter starts with a 1.
In my humble opinion, #jtbayly's answer is only partially correct as using Rstudio's visual editing mode can indeed prompt it to make automatic changes to your text by adding a unique identifier before the citation (ex: [^love1]).
However, that did not initially work for me, and I had to add, for each child document the following option in the yaml header :
editor_options:
markdown:
references:
prefix: "[insert the unique identifier you want for this child document]"
This should then work, and would allow you to compile multiple .Rmd files into a single large document without RMarkdown/Pandoc messing with the citations. However, don't forget to go back to "Source" mode and "Visual" mode once after editing the yaml header for the editor to make the change.
Another option is to use Rstudio to edit your files, and turn on visual editing. If you do, it will make some automatic changes to your text, including giving your footnotes unique names.

Bookdown: Password protect a *single* page/chapter in HTML

I am producing a Tutorial Workbook for my class using bookdown. I have a large class (500+), and so have a couple of other people helping me with the course.
So I would like to produce the answers for these tutorial questions.
I can produce a whole new document... but then it would be tricky to (automatically) cross-reference the exercise numbers.
So I wondered: Is there a way to password-protect a single page, or a single chapter, in bookdown? (Thinking HTML here; in PDF I can just not include that page/chapter.)
Is this possible? If so how? If not... any other ideas...?
P.
This solution does not use a password, but since you say that for PDF you can simply distribute a version that does not include the material in question, perhaps the following simple approach might help
Inspired by this question on how to conditionally input material as well as the option to use parameters in Rmarkdown, consider two Rmarkdown files:
main.Rmd, which contains what you want to show everyone.
protected.Rmd, which should only be shown to some people.
These files look as follows:
main.Rmd:
---
output: html_document
params:
include:
label: "Include extra material?"
value: ""
input: select
choices: [True, False]
---
```{r, include=FALSE}
print(params)
show_all <- as.logical(params$include)
```
```{r conditional_print, child="protected.Rmd", eval = show_all}
```
protected.Rmd:
Hello World!
Assuming you are in RStudio, if you choose "Knit with parameters" on main.Rmd, you will be asked to select either TRUE or FALSE from an interactive dropdown. If and only if you choose TRUE, the output will include "Hello World". More generally, code blocks with eval = show_all will only be displayed when selecting to include extra material. Therefore, you can of course have multiple sections (each contained in a separate .Rmd file) that are only conditionally included.
In this way, you could knit the same document twice: once with questions only, and once with questions and answers both. Since this is the same for both pdf and html, it also gives you a consistent workflow for both of these output types.

RMarkdown to PPT: not loading reference_doc()

I am trying to use a PPT template to format a RStudio > RMarkdown > PPT file. Here's my testing file (saved as testing.Rmd):
---
title: "Aarduous Aardvarks"
author: "Aanonymous Aardvark"
date: "5/4/2019"
output: powerpoint_presentation
reference_doc: template.pptx
---
## My title
```{r myplot}
plot(mtcars)
```
When I first knit this, a PPT file was generated. I opened that file, made the Slide Master background red and the font blue (deliberately hideous for testing), saved it as "template.pptx" in the same folder as above.
However, when I re-knit the document, the background is still white and the font is still black. What do I need to get my template file recognized?
System:
Windows 7 Professional
Rstudio 1.2.1335
Rmarkdown 1.12
Pandoc: 2.6
PPT 2010 v14.0.6129.5000
Indentation in YAML is important. Use the structure as described in the official docs:
---
title: "Aarduous Aardvarks"
output:
powerpoint_presentation:
reference_doc: template.pptx
---
I have had this same problem, but it does not repair when the YAML above is inserted. The additional changes helped me solve the problem:
Save the reference_doc as a .potx file format, and refer to that extension in the YAML header
Go into View -> Slide Master to make sure the slides in the master are the format you expect (one time I thought I made the changes, but they showed up on the Home menu and not the Slide Master)
Under the Home menu, click the Dropdown under Layout and make sure AT THE LEAST that you see these four elements:
Title
Section Header
Title and Content
Two Content
When all three of these are taken care of, my slides knit fine from the Rmd.
I was facing a similar error when knitting to a powerpoint template- the indentation as documented (indenting 'reference_doc:...') was giving me an error: "Scanner error: mapping values are not allowed in this context", which suggested that the indentation was wrong in the YAML. I was able to resolve (through trial and error) with the following formatting:
---
title: "TITLE"
author: "Mike Harris"
date: "4/9/2021"
resource_files:
- template.pptx
output:
powerpoint_presentation:
reference_doc: template.pptx
---
Hopefully this saves someone a little extra time.

Chapter(s) before table of contents in Bookdown PDF output

I'd like for a chapter to appear before the table of contents (but after the title page) in the pdf_book output of Bookdown.
One way to do this is to add the chapter to a .tex file and and link it using before_body:. However, this means the chapter will not appear in gitbook (which I also need). I'd prefer not to keep both a .tex and .Rmd version of the same chapter.
An ideal solution would be if the chapter could be kept in a .Rmd file, and its contents extracted into the before_body for pdf_book. That way it's still available for gitbook. Though I'm not sure how I might do that, or indeed if it's possible?
Is there a solution? Or is it exceeding the limits of Bookdown's flexibility?
Any help would be greatly appreciated, thanks!
One can trigger ToC creation manually in the document, which gives more control over its placement. Of course, automatic table of contents creation should be disabled:
---
title: "MWE"
output:
bookdown::pdf_book:
toc: False
---
```{r child = 'file-you-want-to-include.Rmd'}
```
```{=latex}
% Trigger ToC creation in LaTeX
\tableofcontents
```
# Rest of your document starts here
The downside is that this only works with PDF output, not HTML.

Use additional Latex packages for math expressions in RMarkdown `output = "html_document"`

I`m aware how to use additional Latex-packages for pdf-format output from .Rmd files using
---
header-includes:
- \usepackage{mathtools}
---
in the YAML header.
However, this does (of course) not work if one specifies output: html_document.
---
output: html_document
header-includes:
- \usepackage{mathtools}
---
Using additional Latex-Packages could be of interest for output: html_document, too - especially in math expressions (MWE below)
---
title: "MWE"
output: html_document
header-includes:
- \usepackage{mathtools}
---
## Use "Defined by" Symbol
$$sin(x) \coloneqq \frac{opposite}{hypothenuse}$$
MathJax offer a number of extensions, and there are third-party extensions as well. If your desired package is not available in this way, then things get difficult.
Simple commands, such as \coloneqq, can be recreated using \newcommand. The simplest way is to add these via the include-before option. Using your MWE with a solution from Mathematics Meta SE, one gets:
---
title: "MWE"
output:
html_document: default
include-before:
- '$\newcommand{\coloneqq}{\mathrel{=}}$'
---
## Use "Defined by" Symbol
$$sin(x) \coloneqq \frac{opposite}{hypothenuse}$$
Output:
Background
RMarkdown is build around pandoc, which performs most of the format conversions. Pandoc creates PDF via LaTeX (by default), and will simply include any raw LaTeX commands which are given in the source. When seeing \usepackage{mathtools}, the package is not parsed, but the command is simply added verbatim to the intermediate LaTeX. However, when exporting to HTML, it wouldn't make sense to pass through LaTeX commands, so any such command will simply be omitted from the output, so any \usepackage in your document won't effect the HTML output.
Alternative solution
If you are using very complex LaTeX-packages, then you could consider setting up a complex pipeline to still use it: E.g, one could use a pandoc filter to extract all equations, compile each equation as a separate document, and then convert the resulting PDF to SVG. Finally, that SVG can then be included in the HTML output. This is non-trivial and probably not worth the effort. A similar approach is recommended to include TikZ pictures.