Search code examples
formattinglatexr-markdownknitrkableextra

kableExtra float options (float-left or float-right) for format "latex" not working in Rmarkdown


Float options are not working for "latex" format pdf renders.

MWE:

---
title: ""
author: "Jono3030"
output:
  html_document: default
  pdf_document:
    keep_tex: no
---

```{r echo=F, message=F, warning=F}
library(dplyr)
library(knitr)
library(kableExtra)
```

```{r, echo=FALSE}
out_type <- knitr::opts_knit$get("rmarkdown.pandoc.to")
```

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed vulputate urna in eleifend commodo. Praesent et tristique ligula, eget pretium eros. Ut congue leo nibh, a volutpat erat efficitur sed. Aliquam rhoncus mollis diam nec bibendum. Suspendisse eget massa a dui elementum tempus. Maecenas a lacus a odio bibendum eleifend sed ac mauris. Nunc molestie dui dignissim, egestas elit quis, suscipit erat. Donec id suscipit lectus, nec mollis nisl. Quisque ultrices quis eros in hendrerit. Etiam enim metus, vestibulum nec congue vitae, tempus eu ex. Ut vehicula elementum orci, vitae viverra mi tristique ac.

```{r demotable, results='asis', echo=F, message=F, warning=F}
latex_table <- tibble(col1=c(runif(9, 1, 99)), col2=c(runif(9, 1, 99))) %>%
                 kable(format="latex",
                       booktabs = T,
                       linesep = '',
                       caption = "MRE") %>%
                       kable_styling(full_width = F, position = "float_right")

html_table <- tibble(col1=c(runif(9, 1, 99)), col2=c(runif(9, 1, 99))) %>%
                 kable(format="html",
                       caption = "MRE") %>%
                       kable_styling(full_width = F, position = "float_right")

switch(out_type,
    html = html_table,
    latex = latex_table
)
```

Sed in efficitur mauris. Donec vulputate non leo eget commodo. Vivamus luctus arcu at lorem pulvinar condimentum. Nullam felis risus, mattis vel accumsan vehicula, ullamcorper in risus. Nullam ullamcorper dignissim massa, ac tristique nibh fringilla in. Proin tortor est, ornare sit amet magna non, eleifend feugiat sapien. Fusce quis augue quis lectus dignissim consequat vel et dui. Aliquam dui eros, cursus a mauris id, volutpat blandit tellus. Nunc porta tincidunt rhoncus. Donec fermentum sem et justo ultricies, ut ullamcorper quam vehicula. Aenean commodo velit rhoncus nibh tristique, at sollicitudin nibh ultricies. Curabitur odio enim, fringilla id neque a, pharetra lobortis urna. Curabitur suscipit quam vitae libero vestibulum, vel ornare arcu pharetra. Sed sagittis mauris faucibus arcu tincidunt elementum. In sodales tincidunt iaculis.

Cras a eleifend sapien, a eleifend nulla. Donec ultrices molestie nibh sed facilisis. Aliquam eu hendrerit justo. Nullam ac dictum dui. Nullam ac lectus ut nisl consequat ornare. Sed accumsan rutrum varius. Nam nec felis id elit viverra consequat et non lorem.

Pellentesque eget blandit lorem. Curabitur at ultricies leo, sed porttitor erat. Vivamus fringilla erat a arcu scelerisque vestibulum. Maecenas non mollis lectus. Aenean a ipsum sem. Aenean nec hendrerit lacus, at ornare neque. Phasellus id nisi non risus faucibus condimentum.

Nulla a nulla a nulla dapibus scelerisque. Pellentesque molestie leo id porta tincidunt. Ut venenatis interdum egestas. Ut id maximus libero, ut iaculis lacus. Praesent sit amet bibendum lacus. Donec venenatis at mauris sit amet mollis. Donec eleifend nibh mauris, in euismod nisi hendrerit a. Cras porttitor rhoncus diam eget rutrum. Phasellus condimentum maximus felis sit amet fermentum. Aenean lacinia ornare dolor, sit amet finibus magna tempor sed.

The MWE results in this:

MWE result for "latex" format

I'm wondering if someone can reproduce this issue since I haven't found anything on it on stackoverflow or anywhere else.

There are no issues when using the "html" format:

MWE result for "html" format

Am I missing something here? Is the float option only available for the "html" format?

Edit: sessionInfo() as requested by @J_F

R version 3.6.3 (2020-02-29)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Debian GNU/Linux 9 (stretch)

Matrix products: default
BLAS:   /usr/lib/libblas/libblas.so.3.7.0
LAPACK: /usr/lib/lapack/liblapack.so.3.7.0

locale:
 [1] LC_CTYPE=en_CA.UTF-8       LC_NUMERIC=C               LC_TIME=en_CA.UTF-8        LC_COLLATE=en_CA.UTF-8
 [5] LC_MONETARY=en_CA.UTF-8    LC_MESSAGES=en_CA.UTF-8    LC_PAPER=en_CA.UTF-8       LC_NAME=C
 [9] LC_ADDRESS=C               LC_TELEPHONE=C             LC_MEASUREMENT=en_CA.UTF-8 LC_IDENTIFICATION=C

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base

other attached packages:
[1] kableExtra_1.1.0 knitr_1.24       dplyr_0.8.3      nvimcom_0.9-82

loaded via a namespace (and not attached):
 [1] Rcpp_1.0.2        rstudioapi_0.10   xml2_1.2.2        magrittr_1.5      hms_0.5.0         munsell_0.5.0
 [7] tidyselect_0.2.5  rvest_0.3.4       viridisLite_0.3.0 colorspace_1.4-1  R6_2.4.0          rlang_0.4.0
[13] stringr_1.4.0     httr_1.4.1        tools_3.6.3       webshot_0.5.1     xfun_0.8          htmltools_0.3.6
[19] assertthat_0.2.1  digest_0.6.20     tibble_2.1.3      crayon_1.3.4      purrr_0.3.2       readr_1.3.1
[25] vctrs_0.2.0       zeallot_0.1.0     glue_1.3.1.9000   evaluate_0.14     rmarkdown_1.14    stringi_1.4.3
[31] compiler_3.6.3    pillar_1.4.2      scales_1.0.0      backports_1.1.4   pkgconfig_2.0.2

Solution

  • Right here: How to I keep a kable caption with a floating table? user @bttomio suggests a solution based on this thread: https://github.com/haozhu233/kableExtra/issues/221#issuecomment-400473530

    Once added proper libraries (I've also modified first R chunk!), in your case the implementation of this solution could look like that:

    ---
    title: "Test"
    author: "gnypit"
    output: pdf_document
    ---
    
    ```{r setup, include=FALSE}
    knitr::opts_chunk$set(echo = TRUE)
    options(tinytex.verbose = TRUE)
    library(knitr)
    library(kableExtra)
    library(tibble)
    library(xtable)
    ```
    
    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed vulputate urna in 
    eleifend commodo. Praesent et tristique ligula, eget pretium eros. Ut congue leo nibh, 
    a volutpat erat efficitur sed. Aliquam rhoncus mollis diam nec bibendum. Suspendisse 
    eget massa a dui elementum tempus. Maecenas a lacus a odio bibendum eleifend sed ac 
    mauris. Nunc molestie dui dignissim, egestas elit quis, suscipit erat. Donec id 
    suscipit lectus, nec mollis nisl. Quisque ultrices quis eros in hendrerit. Etiam enim 
    metus, vestibulum nec congue vitae, tempus eu ex. Ut vehicula elementum orci, vitae 
    viverra mi tristique ac.
    
    ```{r, echo=FALSE}
    xtable2kable <- function(x)
    {
      out <- capture.output(print(x, table.placement = NULL))[-(1:2)]
      out <- paste(out, collapse = "\n")
      structure(out, format = "latex", booktabs = T, linesep = '', class = "knitr_kable")
    }
    
    data <- tibble(col1=c(runif(9, 1, 99)), col2=c(runif(9, 1, 99)))
    
    xtable(data, caption = "MRE") %>%
      xtable2kable() %>%
      kable_styling(position = "float_right")
    ```
    
    Sed in efficitur mauris. Donec vulputate non leo eget commodo. Vivamus luctus arcu at 
    lorem pulvinar condimentum. Nullam felis risus, mattis vel accumsan vehicula, 
    ullamcorper in risus. Nullam ullamcorper dignissim massa, ac tristique nibh fringilla 
    in. Proin tortor est, ornare sit amet magna non, eleifend feugiat sapien. Fusce quis 
    augue quis lectus dignissim consequat vel et dui. Aliquam dui eros, cursus a mauris 
    id, volutpat blandit tellus. Nunc porta tincidunt rhoncus. Donec fermentum sem et 
    justo ultricies, ut ullamcorper quam vehicula. Aenean commodo velit rhoncus nibh 
    tristique, at sollicitudin nibh ultricies. Curabitur odio enim, fringilla id neque a, 
    pharetra lobortis urna. Curabitur suscipit quam vitae libero vestibulum, vel ornare 
    arcu pharetra. Sed sagittis mauris faucibus arcu tincidunt elementum. In sodales 
    tincidunt iaculis.
    
    Cras a eleifend sapien, a eleifend nulla. Donec ultrices molestie nibh sed facilisis. 
    Aliquam eu hendrerit justo. Nullam ac dictum dui. Nullam ac lectus ut nisl consequat 
    ornare. Sed accumsan rutrum varius. Nam nec felis id elit viverra consequat et non 
    lorem.
    
    Pellentesque eget blandit lorem. Curabitur at ultricies leo, sed porttitor erat. 
    Vivamus fringilla erat a arcu scelerisque vestibulum. Maecenas non mollis lectus. 
    Aenean a ipsum sem. Aenean nec hendrerit lacus, at ornare neque. Phasellus id nisi non 
    risus faucibus condimentum.
    
    Nulla a nulla a nulla dapibus scelerisque. Pellentesque molestie leo id porta 
    tincidunt. Ut venenatis interdum egestas. Ut id maximus libero, ut iaculis lacus. 
    Praesent sit amet bibendum lacus. Donec venenatis at mauris sit amet mollis. Donec 
    eleifend nibh mauris, in euismod nisi hendrerit a. Cras porttitor rhoncus diam eget 
    rutrum. Phasellus condimentum maximus felis sit amet fermentum. Aenean lacinia ornare 
    dolor, sit amet finibus magna tempor sed.