Adaptando um template LaTeX para integração com R Markdown

A linguagem R pode ser uma forte aliada em qualquer produção acadêmica, uma vez que provê recursos para execução desde um simples teste de hipóteses até os mais sofisticados modelos estatísticos e de aprendizado de máquina. É muito comum pesquisadores nas mais diversas áreas de atuação fazerem uso do R, mas o que muitos desconhecem é a possibilidade de integrar código e artigo em um único projeto.

Neste tutorial demonstro como adaptar um template LaTeX para integração com R Markdown.

Mãos à obra

Download do template

Como exemplo vou utilizar o template do TCC da Especialização em Data Science & Big Data da UFPR. O download pode ser feito nesta página.

Estes são os arquivos descompactados:

Criando o projeto no RStudio

Com o RStudio aberto, vamos em arquivo > novo projeto:

Depois selecionamos a opção Novo Diretório, em seguida clicamos em Novo Projeto, damos um nome para o diretório (para o exemplo utilizei o nome exemplo_template_latex) e clicamos em Criar Projeto.

Depois colamos os arquivos do template dentro do diretório criado:

Preparação do arquivo R Markdown

Vamos começar instalando o pacote bookdown:

install.packages(“bookdown”)

Em seguida instalamos o TinyTeX:

install.packages("tinytex")

Agora criamos o nosso arquivo R Markdown no menu Arquivo > Novo Arquivo > R Markdown:

Selecionamos a opção PDF e clicamos em OK:

No arquivo R Markdown criado alteramos o output:

output: 
bookdown::pdf_document2: default

E agora para testar, em Knit > Knit para PDF compilamos o documento:

Na primeira vez o RStudio vai pedir para nomear e salvar arquivo. No exemplo utilizei o nome artigo.

Após compilação, se tudo estiver funcionando perfeitamente, teremos o documento no formato pdf:

Agora vamos apagar do arquivo R Markdown tudo que vem após o término do bloco de código R. No meu caso, eliminei tudo a partir da linha 11:

E para evitar confusão, vamos deletar o arquivo dsbd_tcc.pdf, já que ele não possui qualquer serventia.

No output do artigo.Rmd vamos referenciar o template LaTeX, que no exemplo é o dsbd_tcc.tex. O output deve ficar exatamente assim:

output:
bookdown::pdf_document2:
template: dsbd_tcc.tex

Configurando o LaTeX

O objetivo aqui é que todo o trabalho acadêmico seja escrito no arquivo R Markdown e não no LaTeX. Para que isto seja possível, é necessário fazer algumas alterações no template LaTeX, que no exemplo é o dsbd_tcc.tex.

Vamos começar "levando" o título do LaTeX para o R Markdown. Observe que o título está na linha 12 do dsbd_tcc.tex:

Vamos colocar o título do trabalho no artigo.Rmd. Notar que usamos a chave "title" para informar o título do trabalho, mas poderíamos ter usado qualquer outra ("titulo", "nome_trabalho", etc..).

Agora, novamente na linha 12 do dsbd_tcc.tex substituímos o título do trabalho pela chave (entre $$) que o referencia no artigo.Rmd:

\title{$title$}

Uma boa prática é utilizamos a clausula if, ao invés de passar diretamente a variável:

$if(title)
$\title{$title$}
$endif$

Observe que na linha 16 do dsbd_tcc.tex inicia a chamada dos autores. Vamos agora criar uma chamada dinâmica para se adaptar a diferentes números de autores. Primeiro vamos adicionar um dicionário com os dados de 4 autores (é só um exemplo, poderia ser qualquer número de autores) no artigo.Rmd:

authors_dict:
- {name: Aluno do Programa,
index: 1,
role: "Aluno do programa de Especialização em Data Science & Big Data, [aluno@dsbd.leg.ufpr.br](aluno@dsbd.leg.ufpr.br)."}
- {name: Orientador do Programa,
index: 2,
role: "Professor do Departamento de Estatística - DEST/UFPR, [orientador@dsbd.leg.ufpr.br](orientador@dsbd.leg.ufpr.br)."}
- {name: Outro Orientador do Programa,
index: 3,
role: "Professor do Departamento de Informática - DINF/UFPR.",}
- {name: Orientador Externo,
index: 4,
role: "Chefe do Departamento de Data Science."}

Depois, no dsbd_tcc.tex, substituímos o código contido entre as linhas 26 e 28 por:

$if(authors_dict)$
% Define a lista de autores.
\author{
$for(authors_dict)$
$authors_dict.name$$if(authors_dict.index)$\footnotemark[$authors_dict.index$]$endif$\\
$endfor$
}
$endif$
$if(authors_dict)$
% Define as chamadas dos autores.
\def\articlefootnotes{
$for(authors_dict)$
$if(authors_dict.role)$
\let\thefootnote\relax\footnotetext{
$if(authors_dict.role)$\textsuperscript{$authors_dict.index$}$endif$$authors_dict.role$
}
$endif$
$endfor$
}
$endif$

Da linha 40 até a 44 do dsbd_tcc.tex estão as configurações da capa do trabalho. Novamente vamos substituir os valores por variáveis:

% Define variáveis usadas no `dsbd_capa.tex`.
$if(authors_dict)$
$for(authors_dict)$
$if(authors_dict.index)$
\def\mainauthor{$authors_dict.index$}
\if\mainauthor1
\def\capaautor{$authors_dict.name$}
\fi
\def\mainadvisor{$authors_dict.index$}
\if\mainadvisor2
\def\capaorientador{$authors_dict.name$}
\fi
$endif$
$endfor$
$endif$
\def\capaano{$year$}
\makeatletter
\let\capatitulo\@title
\makeatother

Observe que utilizamos a variável $year$, que ainda não existe no artigo.Rmd. Portanto, precisamos adicionar a respectiva chave lá:

year: "2021"

Agora vamos levar os resumos e as palavras chaves do trabalho para o artigo.Rmd. Primeiro adicionamos as respectivas chaves no arquivo:

resumo: >
\textit{Lorem Ipsum} is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.
palavras_chave: "Lorem, Ipsum, Lorem, Ipsum, Lorem"
abstract: >
\textit{Lorem Ipsum} is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.
keywords: "Lorem, Ipsum, Lorem, Ipsum, Lorem"

Agora, no arquivo dsbd_tcc.tex, substituiremos o código contido entre as linhas 91 e 107 por:

\begin{abstract}
$resumo$
\noindent\textbf{Palavras-chave}: $palavras_chave$.
\end{abstract}
\renewcommand{\abstractname}{Abstract}
\begin{abstract}
\it
$abstract$
\noindent\textbf{Keywrods}: $keywords$.
\end{abstract}

Vamos agora levar o trabalho propriamente dito para o arquivo R Markdown. Primeiro, no dsbd_tcc.tex, vamos substituir todo o código contido entre as linhas 107 e 267 pela variável que representa o corpo do trabalho em si:

$body$

E agora para testar, vamos compilar o artigo.Rmd em Knit > Knit para pdf_document2:

Se tudo estiver funcionando perfeitamente, teremos o trabalho com resumo e abstract no formato pdf:

Tudo configurado, agora podemos começar a redigir o trabalho em R Markdown.

Redigindo o trabalho em R Markdown

Para criar as sessões do trabalho, basta utilizar # antes do nome da seção, pular uma linha e redigir o texto da seção conforme o exemplo:

# IntroduçãoEscreva aqui.# Materiais e métodosEscreva aqui.# Resultados e discussãoEscreva aqui.# ConclusãoEscreva aqui.

Veja o trabalho compilado:

Para criar subseções é a mesma ideia das seções, porém aumentando o número de # a cada subnível. Vide exemplo adicionando subseções na seção de Materiais e métodos:

# Materiais e métodosEscreva aqui.## Método 1Escreva aqui.## Método 2Escreva aqui.### Experimento AEscreva aqui.

É possível utilizar comandos LaTeX no texto. Por exemplo, vamos criar uma equação na subseção Método 1 do trabalho.

\begin{equation}
\log L = \sum_{i=1}^{n} \big[Y_i\ln(\pi_i) + (1-Y_i)\ln(1-\pi_i)\big]\text{.}(\#eq:nomedaequacao)
\end{equation}

Podemos referenciar a equação utilizando o nome que atribuimos a ela:

A equação \@ref(eq:nomedaequacao) blablablá.

Podemos adicionar no trabalho um gráfico criado em R. Para rodar o exemplo, é necessário ter os pacotes ggplot2 e dplyr instalados. Caso ainda não tenha, execute os seguinte comandos no console:

install.packages("ggplot2")install.packages("dplyr")

Agora na seção Resultados e discussão vamos adicionar um bloco de código R:

No primeiro bloco de código R, lá no início do documento, inclua o código abaixo para fazer o carregamento dos pacotes.

library(ggplot2)
library(dplyr)

Para evitar mensagens de erro, substitua a linha 34 por:

knitr::opts_chunk$set(echo = FALSE, message=FALSE, warning=FALSE)

Agora inclua no novo bloco de código R o código que cria o gráfico desejado:

data(iris)iris %>%
ggplot(aes(x=Sepal.Length, y=Petal.Length, color=Species)) +
geom_point(alpha=0.6, size=3) +
theme(legend.position="bottom")

E agora adicione o nome para referenciar o gráfico, o nome da legenda e as configurações de dimensões e alinhamento gráfico:

{r nomedografico, fig.cap='Legenda do gráfico', out.width="100%", fig.align='center'}

E podemos referenciar a figura de maneira semelhante a que fizemos com a equação.

Conforme demonstrado na figura \@ref(fig:nomedografico).

Criar tabela em LaTeX não é uma tarefa muito prática. Mas trabalhando no R Markdown a conversa muda!

Vamos agora criar uma tabela na seção Resultados e discussão. Para rodar o exemplo é necessário ter o pacote kableExtra instalado. Caso ainda não possua, execute o comando abaixo no console.

install.packages("kableExtra")

Agora, novamente lá no primeiro bloco de código R, vamos carregar o pacote kableExtra:

library(kableExtra)

Também é necessário adicionar esta linha de código:

options(knitr.table.format = "latex")

Agora no arquivo src/dsbd_preamble.tex adicione a seguinte linha:

\usepackage{booktabs}

E agora, em Materiais e métodos, vamos criar um bloco de código R para gerarmos uma tabela a partir de um data frame:

```{r nomedatabela}
df_tabela = head(iris) # seleciona as 5 primeiras linhas do dataset iris
df_tabela = df_tabela[,1:3] # seleciona as 3 primeiras colunasdf_tabela %>%
kable(booktabs=T, caption="Legenda da tabela")
```

E podemos referenciar a tabela também:

Conforme demonstrado na tabela \@ref(tab:nomedatabela).

Para o exemplo ficar esteticamente melhor, vou substituir todos os "Escreva aqui" pelo texto:

\textit{Lorem Ipsum} is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry’s standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker.

Lidando com referências

O arquivo references.bib possui uma série de referências que podemos utilizar neste exemplo de trabalho:

Agora precisamos referenciar o arquivo references.bib no artigo.Rmd.

references: "references.bib"

É importante definir o estilo e o idioma:

biblio-style: unsrt
lang: pt-BR

E incluir a seguinte linha no output:

pandoc_args: ["--natbib"]

Precisamos agora substituir o nome do arquivo de referências e o estilo por estas variáveis, no arquivo dsbd_tcc.tex:

\bibliographystyle{$biblio-style$}%
\bibliography{$references$}%

E agora podemos começar a referenciar os autores. Por exemplo, para referenciar o livro R for Data Science do Wickham, basta utilizar a label atribuída ao livro em references.bib:

\cite{wickham2016r}

Agora vamos referenciar o Data Science do Zero, do Grus (label grus2019data no references.bib):

\cite{grus2019data}

Considerações finais

Trabalhar com R e LaTeX de forma integrada requer familiaridade com R e LaTeX e tempo para realizar as adaptações necessárias, mas é um investimento que vale a pena, uma vez que trabalhar com códigos, análises, modelos e etc. e produção acadêmica em um único projeto pode tornar a vida do pesquisador muito mais fácil, além de facilitar a reprodutibilidade da pesquisa.

Se por acaso restarem dúvidas é só entrar em contato comigo: https://acsjunior.com.

Agradecimento

Ao meu professor e orientador Walmes Zeviani, que inclusive é a minha principal referência de R. Foi através dele que aprendi boa parte do que compartilho aqui.

Referências e links úteis

--

--

Cientista de Dados — https://acsjunior.com

Love podcasts or audiobooks? Learn on the go with our new app.

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store