diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..2cc58044bd8d17b762265bf6c9464bb4ebff85c5 --- /dev/null +++ b/.gitignore @@ -0,0 +1,25 @@ +*~ +.#* +#* +\#*\# +.\#* +*.aux +*.log +*.out +*.orig +*.toc +*.lol +*.Rout +.Rprofile +.Rhistory +.Rproj.user +Rplots.pdf +cap*.html +cap*.pdf +cap*.tex +cap*.md +meupacote/* +data-raw/*.txt +*_cache/ +*_files/ +meupacote_*.tar.gz diff --git a/_output.yaml b/_output.yaml index de98ca5ef787ce8a0fc85a5092253a27d05ce9c2..ef5b2e0f6ef1303103bb199f76a6468c06dc84f0 100644 --- a/_output.yaml +++ b/_output.yaml @@ -16,3 +16,4 @@ html_document: fig_height: 6 toc: true toc_dep: 3 + fig_caption: yes diff --git a/aux/baskara.Rmd b/aux/baskara.Rmd new file mode 100644 index 0000000000000000000000000000000000000000..e10ebf370db851317c1f1e7f24de72033d043631 --- /dev/null +++ b/aux/baskara.Rmd @@ -0,0 +1,44 @@ +--- +title: "Raízes de Equação de Segundo Grau" +author: "Ferando Mayer & Walmes Zeviani" +date: "`Sys.time()`" +output: + rmarkdown::html_vignette: + fig_width: 6 + fig_height: 6 + toc: true + toc_dep: 3 +vignette: > + %\VignetteIndexEntry{Teorema de Pitágoras} + %\VignetteEngine{knitr::rmarkdown} + %\VignetteEncoding{UTF-8} +--- + +```{r, include=FALSE, purl=FALSE, include=FALSE} +## Carrega o pacote em desenvolvimento. +library(devtools) +load_all("../meupacote/") +``` + +Seja $f(x) = 3*x^2 - 1*x - 2$ uma parábola. Pela fórmula de Báskara +podemos determinar as raízes dessa equação. A função `baskara()` retorna +as raízes de uma função. + +```{r, eval=FALSE} +## Carrega o pacote instalado. +library(meupacote) +``` +```{r} +## Conteúdo disponível do pacote. +ls("package:meupacote") + +## Calcula as raízes da função. +r <- baskara(a = 3, b = -1, c = -2) +r + +## Faz o gráfico. +curve(3*x^2-1*x-2, from = -1, to = 1) +abline(v = r, lty = 2) + +## Mostrar como usar o método plot() e coef(). +``` diff --git a/aux/cran_vignette_distribution.R b/aux/cran_vignette_distribution.R new file mode 100644 index 0000000000000000000000000000000000000000..911929c6f7a3f05031ea0fcf91f2c8c08bb543f9 --- /dev/null +++ b/aux/cran_vignette_distribution.R @@ -0,0 +1,56 @@ +##====================================================================== +## Distribuição de vinhetas nos pacotes R oficiais. +## +##====================================================================== + +##---------------------------------------------------------------------- +## Ler a home que lista todos os pacotes. + +library(XML) + +url <- "https://cran.r-project.org/web/packages/available_packages_by_name.html" +rl <- readLines(con = url) +h <- htmlTreeParse(file = rl, asText = TRUE, useInternalNodes = TRUE, + encoding = "utf-8") + +## Frequência das tags/campos na página. +summary(h) + +tb <- readHTMLTable(h, stringsAsFactors = FALSE) +tb <- tb[[1]] +str(tb) + +pkg <- tb[,1] +pkg <- pkg[pkg!=""] +length(pkg) + +##---------------------------------------------------------------------- +## Função que lê o index.html de um pacote e retorna o número de +## vignettes. + +countVignettes <- function(pkg){ + url <- sprintf( + fmt = "https://cran.r-project.org/web/packages/%s/index.html", + pkg) + rl <- readLines(con = url) + h <- htmlTreeParse(file = rl, asText = TRUE, + useInternalNodes = TRUE, + encoding = "utf-8") + htb <- xpathApply(doc = h, + fun = xmlGetAttr, "href", + path = "//td//a[@href]") + npkg <- sum(grepl(pattern = "^vignettes/", x = unlist(htb))) + cat(npkg, "\n") + return(npkg) +} + +##---------------------------------------------------------------------- +## Aplicando para todos os pacotes. + +spkg <- sample(pkg, ceiling(0.05*length(pkg))) +length(spkg) + +## x <- sapply(spkg, countVignettes) +x <- sapply(pkg, countVignettes) + +##---------------------------------------------------------------------- diff --git a/cap01.Rmd b/cap01.Rmd deleted file mode 100644 index de538627e15abceca9fb9dcc6175d1ee9ed53b81..0000000000000000000000000000000000000000 --- a/cap01.Rmd +++ /dev/null @@ -1,17 +0,0 @@ ---- -title: "Pesquisa Reproduzível" -author: "Fernando Mayer & Walmes Zeviani" ---- - -```{r setup, include=FALSE} -library(knitr) - -opts_chunk$set( - dev.args=list(family = "Palatino")) - -options(width = 68) -``` - -**** -# Introdução # - diff --git a/cap05.Rmd b/cap05.Rmd deleted file mode 100644 index 8ce2d6264f4dabcc14a297771a1e7cbbe6221ae6..0000000000000000000000000000000000000000 --- a/cap05.Rmd +++ /dev/null @@ -1,18 +0,0 @@ ---- -title: "Métodos e Funções Genéricas" -author: "Fernando Mayer & Walmes Zeviani" ---- - -```{r setup, include=FALSE} -library(knitr) - -opts_chunk$set( - dev.args=list(family = "Palatino")) - -options(width = 68) - -## Carrega as definições de sessão. -source("config.R") -rty <- "md" -``` - diff --git a/cap06.Rmd b/cap06.Rmd deleted file mode 100644 index 3d21009f82ca66f692272269deb4a1e5065fbbc7..0000000000000000000000000000000000000000 --- a/cap06.Rmd +++ /dev/null @@ -1,18 +0,0 @@ ---- -title: "Vinhetas" -author: "Fernando Mayer & Walmes Zeviani" ---- - -```{r setup, include=FALSE} -library(knitr) - -opts_chunk$set( - dev.args=list(family = "Palatino")) - -options(width = 68) - -## Carrega as definições de sessão. -source("config.R") -rty <- "md" -``` - diff --git a/cap07.Rmd b/cap07.Rmd deleted file mode 100644 index 33b07363f8be4fa4ba19353f9b845d1f0017f293..0000000000000000000000000000000000000000 --- a/cap07.Rmd +++ /dev/null @@ -1,18 +0,0 @@ ---- -title: "Testes" -author: "Fernando Mayer & Walmes Zeviani" ---- - -```{r setup, include=FALSE} -library(knitr) - -opts_chunk$set( - dev.args=list(family = "Palatino")) - -options(width = 68) - -## Carrega as definições de sessão. -source("config.R") -rty <- "md" -``` - diff --git a/cap04.Rmd b/capAdiDados.Rmd similarity index 51% rename from cap04.Rmd rename to capAdiDados.Rmd index 9b2c9059eac6f2c589d2357e1145be6306c4b79b..6dc5235a55362833104845850df035aaba865fa2 100644 --- a/cap04.Rmd +++ b/capAdiDados.Rmd @@ -4,14 +4,7 @@ author: "Fernando Mayer & Walmes Zeviani" --- ```{r setup, include=FALSE} -library(knitr) - -opts_chunk$set( - dev.args=list(family = "Palatino")) - -options(width = 68) - -## Carrega as definições de sessão. +source("knitr_setup.R") source("config.R") rty <- "md" ``` diff --git a/capCienRep.Rmd b/capCienRep.Rmd new file mode 100644 index 0000000000000000000000000000000000000000..8b684c968678309e6ccf5b7eda5b5cd199cbcdb1 --- /dev/null +++ b/capCienRep.Rmd @@ -0,0 +1,13 @@ +--- +title: "Ciência Reproduzível" +author: "Fernando Mayer & Walmes Zeviani" +--- + +```{r setup, include=FALSE} +source("setup_knitr.R") +source("config.R") +``` + +**** +# Introdução # + diff --git a/cap03.Rmd b/capCriaPac.Rmd similarity index 99% rename from cap03.Rmd rename to capCriaPac.Rmd index 2fdbfa22979e77a2189c160cc874705b99e55dae..c99a0dc926a24aece76f7ab7faf175a0904e8ceb 100644 --- a/cap03.Rmd +++ b/capCriaPac.Rmd @@ -4,14 +4,7 @@ author: "Fernando Mayer & Walmes Zeviani" --- ```{r setup, include=FALSE} -library(knitr) - -opts_chunk$set( - dev.args=list(family = "Palatino")) - -options(width = 68) - -## Carrega as definições de sessão. +source("setup_knitr.R") source("config.R") rty <- "md" ``` diff --git a/capFunMet.Rmd b/capFunMet.Rmd new file mode 100644 index 0000000000000000000000000000000000000000..5ce4bb6de38ebd2c719b15e9cf9db5ca39237315 --- /dev/null +++ b/capFunMet.Rmd @@ -0,0 +1,10 @@ +--- +title: "Métodos e Funções Genéricas" +author: "Fernando Mayer & Walmes Zeviani" +--- + +```{r setup, include=FALSE} +source("setup_knitr.R") +source("config.R") +``` + diff --git a/capTestes.Rmd b/capTestes.Rmd new file mode 100644 index 0000000000000000000000000000000000000000..1ce1ca75824034f0599dc69a82123f63016ae96b --- /dev/null +++ b/capTestes.Rmd @@ -0,0 +1,11 @@ +--- +title: "Testes" +author: "Fernando Mayer & Walmes Zeviani" +--- + +```{r setup, include=FALSE} +source("setup_knitr.R") +source("config.R") +``` + + * <http://kbroman.org/pkg_primer/pages/tests.html> diff --git a/capVinheta.Rmd b/capVinheta.Rmd new file mode 100644 index 0000000000000000000000000000000000000000..f4bb2c5b7bd3280c5867744b77a8a6e4977b09b0 --- /dev/null +++ b/capVinheta.Rmd @@ -0,0 +1,328 @@ +--- +title: "Vinhetas" +author: "Fernando Mayer & Walmes Zeviani" +--- + +```{r setup, include=FALSE} +## Carrega as definições de sessão. +source("setup_knitr.R") +source("config.R") + +## Tipo de output necessário para saber como gerar os captions. +ishtml <- any(grepl(pattern = "^html_document", + x = readLines("_output.yaml"))) + +## Carrega as definições de sessão. +source("config.R") +rty <- "md" +``` + +A documentação de um pacote é indispensável para sua criação e +distribuição. Tecnicamente falando, não tem como fazer um pacote R sem +documentação para os objetos exportados. Por mais breve que seja, a +documentação precisa existir para o pacote ser construído e, portanto, a +documentação é uma exigência. + +Os usuários consultam a documentação quando sabem exatamente o que +procurar. Exceto pela sessão *Exemplos*, a documentação não se destina a +mostrar a conexão entre funções ou seu uso coordenado para solução de +certos problemas. Isso porque as páginas de ajuda descrevem objetos +individualmente, ou em grupos pequenos, fornecendo uma orientação +específica e não uma visão geral e integrada. + +No primeiro contato com um pacote, por outro lado, o que o usuário +deseja é de uma visão geral dele, uma espécie de trailer ou enredo. A +documentação é teodiosa de ler para alguém que quer uma visão geral, +pois ela é como uma descrição de cada personagem e não da forma como +eles se envolvem. + +A palavra *vignette* admite traduções como vinheta, esboço e epsódio. No +contexto de um pacote R, uma vinheta é uma documentação auxiliar do +mesmo que descreve o uso coordenado das funções que contém (ou +*datasets*) na solução de um problema ou sobre um tema. É usada para dar +uma visão geral dos recusos do pacote. + + +As vinhetas não são exigidas nos pacotes, embora seja a melhor forma de +apresentá-lo. Certamente pela mesma razão, não existe restrição de +tamanho nem forma e fica como responsabilidade dos autores usar do bom +senso ao escrever uma vinheta e até mesmo quantas vinhetas ter. Se um +pacote é multitemático ou se a solução para diferentes problemas são +longas, é melhor ter vinhetas dedicadas a cada um. + +O que é marcante, no entanto, é que as vinhetas fazem mistura de prosa e +código. Antes da versão 3.0.0 do R, as vinhetas eram documentos Sweave e +nas versões mais recentes, vinhetas não Sweave foram permitidas. + +Sendo ou não documentos Sweave, nas as vinhetas são permitidos gráficos +e outputs de resultados R, além de tabelas e equações. As vinhetas em +HTML, consideradas a partir da versão 3.0.0, podem até mesmo ter vídeos, +animações em gif, gráficos em JavaScript e OpenGL. + +Diante de todos esses recursos que uma vinheta contém e pelo excelente +meio de divulgação do pacote que é, nesse capítulo serão descritos os +passos para adicionar vinhetas ao pacote. Vamos considerar vinhetas em +HTML e PDF escritas em RMarkDown e compiladas com o knitr. + +A documentação é impessoal e pontual, a vinheta não. O artigo é formal e +demorado, a vinheta. Usos: descrição geral; material suplementar; +estudo de caso; detalhamento de algoritimos; + +# Consultar vinhetas # + +## Pacotes instalados ## + +Certamente alguns dos pacotes que você tem instalado no seu SO possuem +vinheta. Se você está reproduzindo o código desse tutorial, então você +tem o `devtools` e o `roxygen2`. Para acessar as vinhetas disponíveis +você pode usar as opções ilustradas abaixo. + +```{r, eval=FALSE} +## Exibe todas as vinhetas disponíveis no console. +vignette() + +## Exibe as vinhetas de um único pacote no console. +vignette(package = "roxygen2") + +## Abre uma vinheta pelo nome (essa é do pacote roxygen2). +vignette(topic = "rd") +vignette(topic = "rd", package = "roxygen2") + +## Exibe todas as vinhetas disponíveis no navegador. +browseVignettes() + +## Exibe apenas as vinhetas de um pacote. +browseVignettes(package = "roxygen2") +``` + +```{r, include=FALSE} +cap <- +"Distribuição do número de vinhetas por pacote nos pacotes oficiais do R +disponíveis no CRAN." + +if (ishtml) { + cap <- fig$cap("vin", cap) +} + +tb <- structure( + c(0.774686165394073, 0.171735473016695, 0.0535783615892326), + class = "table", + .Dim = 3L, + .Dimnames = structure(list(y = c("0", "1", ">1")), + .Names = "y")) + +tbl <- structure( + list(px = c(5986L, 1327L, 235L, 85L, 34L, 29L, 11L, 4L, 3L, 4L, 2L, + 1L, 0L, 1L, 0L, 0L, 0L, 1L, 0L, 1L, 1L, 0L, 1L, 0L, 0L, + 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, + 0L, 0L, 0L, 0L, 0L, 0L, 1L), + x = 0:45), + .Names = c("px", "x"), + row.names = c(NA, -46L), + class = "data.frame") + +totPack <- sum(tbl$px) +totVin <- sum(tbl$px * tbl$x) +m <- totVin / totPack + +``` + +## Pacotes oficiais no CRAN ## + +Para os pacotes que são oficiais (que estão no CRAN), você pode +consultar as vinhetas, bem a documentação, online. Os pacotes estão no +endereço `https://cran.r-project.org/web/packages/<pacote>/index.html`, +em que `<pacote>` é um nome. Nessas páginas existe uma seção com URLs +para as vinhetas, quando disponíveis, logo abaixo da documentação em +PDF. + +Nós fizemos um *web scraping* no site do CRAN e verificamos que 22.5% +dos pacotes oficiais do R tem pelo menos uma vinheta, sendo que 17.2% +tem apenas uma e 5.4% tem mais que uma, conforme a Figura +`r fig$ref("vin")`. + +Existe um total de `r totVin` distribuídas em `r totPack` pacotes, o que +dá uma média de `r round(m, 2)` vinhetas por pacote. Esse *web scrap* +levou 150 minutos e foi feito no dia 04 de Janeiro de 2016. + +```{r, echo=FALSE, results="hide", fig.cap=cap} +plot(px ~ x, data = tbl, type = "h", lwd = 4, + xlab = "Número de vinhetas no pacote", + ylab = "Número de pacotes") +par(fig = c(0.15, 0.95, 0.15, 1), new = TRUE) +pie(tb, + col = c("red", "orange", "yellow"), + labels = sprintf(fmt = "%s (%0.1f%s)", + c(0, 1, ">1"), 100*tb, "%")) +text(x = 0, y = 0.9, labels = "Frequência relativa", cex = 1.2) +``` + +Além dos pacotes oficiais existem pacotes em desenvolvimento no GitHub, +por exemplo, cuja vinheta pode também estar disponível. Esse é o caso do +pacote +`r renderUrl("breedR","https://github.com/famuvie/breedR/tree/master/inst/doc",rty)`. + +Fica aqui aquela pergunta tipo Tostines: um pacote tem mais vinhetas +por que é mais usado ou é mais usado por que tem mais vinhetas? + +# Criando a vinheta # + +Como ja esclarecemos, a vinheta sem dúvida ajuda você a conhecer as +funcionalidades de um pacote e é a melhor forma de divulgá-lo. Um pacote +pode ter várias vinhetas, cada uma exibindo um tema diferente de +funcionalidades. + +Produzir a vinheta de um pacote é tão fácil quanto as demais partes +dele. O pacote *devtools* também possui os recursos para trabalharmos +com as vinhetas, desde a criação até a inclusão dela como componente do +pacote, etapas que veremos a seguir. + +Antes disso, no entanto, vale comentar que as vinhetas são mais +facilmente escritas se você considerar +`r renderUrl("RMarkDown","http://rmarkdown.rstudio.com/",rty)`, +embora isso não seja +uma exigência. As vinhetas podem ser escritas em LaTex entrelaçado com +R, queremos dizer, tanto da forma antiga com o +`r renderUrl("Sweave","https://www.statistik.lmu.de/~leisch/Sweave/",rty)` +ou da forma mais recente com o +`r renderUrl("knitr","http://yihui.name/knitr/",rty)`. +A vantagem de escrever em MarkDown é a velocidade, praticidade e poder +obter vinhetas em HTML e PDF facilmente. + +STOP + +O Hadley mantem uma ampla documentação sobre +`r renderUrl("produção de vinhetas","http://r-pkgs.had.co.nz/vignettes.html",rty)`, +com o qual nos baseamos para expor o que vem a seguir. + +O comando `use_vignette()` é quem cria a estrutura necessária para +acomodar uma vinheta com os devidos cuidados. Ao executá-lo, é criado o +diretório `vignettes/` com um arquivo `.Rmd` e, além disso, ele adiciona +ao campo `Suggests` no `DESCRIPTION` os pacotes `knitr` e `rmarkdown`, +necessários para gerar a vinheta. Não fosse a gentileza do pacote +`devtools`, poderíamos esquecer dessa última etapa. + +```{r, eval=FALSE, include=FALSE} +## DESCRIPTION antes do use_vignette(). +cat(readLines("./meupacote/DESCRIPTION"), sep = "\n") +``` +```{r, eval=FALSE} +library(devtools) + +## Cria a primeira vinheta do pacote. +use_vignette("minhaVinheta1") +``` +```{r, echo=FALSE} +if (file.exists("./meupacote/vignettes/minhaVinheta1.Rmd")){ + file.remove("./meupacote/vignettes/minhaVinheta1.Rmd") +} +library(devtools) +use_vignette("minhaVinheta1", pkg = "./meupacote/") +``` +```{r, echo=FALSE, comment=NA} +## Mostra diretório e arquivos criados. +cat(system("tree --charset=ascii ./meupacote/ | head -n -2", + intern = TRUE), sep = "\n") +``` +```{r, echo=FALSE, comment=NA} +## DESCRIPTION depois do use_vignette(). +cat(readLines("./meupacote/DESCRIPTION"), sep = "\n") +``` + +O arquivo `Rmd` é criado já com conteúdo para poder orientá-lo. No topo +do arquivo tem uma parte de meta dados escrita em YAML (*yet another +markup language*) que detalha as informações do documento e definem o +processo de sua criação. + +```{r, echo=FALSE} +## Mostra o YAML da vinheta original. +cat(readLines("./meupacote/vignettes/minhaVinheta1.Rmd")[1:10], + sep = "\n") + +## Nada entrou no .Rbuildignore. +## cat(readLines("./meupacote/.Rbuildignore"), sep = "\n") +``` + +TODO As entradas com % no YAML são ignoradas pelo LaTex e processadas +pelo R para gerar links na home da documentação (suponho). A vantagem +do HTML é que uma index pode dar acesso às várias vinhetas de um +pacote. Torna fácil para o usuário iniciante. + +``` +## Meta dados de uma vinheta. +% \VignetteIndexEntry{} ## Título no index.html +% \VignetteDepends{} ## Pacotes do qual depende +% \VignetteKeyword{palavra1} ## Palavras-chave. +% \VignetteKeyword{palavra2} +``` + +Edite à vontade esse arquivo fazendo a melhor propaganda possível do seu +pacote. Tome cuidado com os pacotes que a sua vinheta vai usar. É comum +as vinhetas chamarem pacotes para fazer gráficos, como o `lattice`, +`ggplot2` e `plotrix`. É indicado que eles estejam nos campos do seu +`DESCRIPTION`, se não no `Imports`, pelo menos no `Suggests`. + +## Vinhetas em HTML ## + +```{r, include=FALSE} +file.copy(from = "aux/pitagoras.Rmd", + to = "meupacote/vignettes/pitagoras.Rmd", + overwrite = TRUE) +``` +```{r, echo=FALSE, comment=NA} +## Mostra a vinheta mínima. +cat(readLines("./meupacote/vignettes/pitagoras.Rmd"), + sep = "\n") +``` + +Para produzir a vinheta, use o comando `build_vignettes()`. Ele vai +gerar as vinhetas de cada arquivo e levá-las para outro diretório, como +pode ser visto abaixo. Caso você não tenha um dos seguintes pacotes: +`evaluate`, `formatR`, `highr`, `knitr`, `mime`, `stringi`; será +necessário instalá-los. + +```{r, eval=FALSE} +build_vignettes() +``` +```{r, eval=FALSE, echo=FALSE, comment=NA, highlight=FALSE} +## FIXME: Não existe como sair desse erro! De usar o output do +## build_vignettes(). +x <- capture.output(build_vignettes("./meupacote/")) +cat(x, sep = "\n") + +sink("aux.txt") +build_vignettes("./meupacote/") +sink() +``` +``` +Building meupacote vignettes +Moving pitagoras.html, pitagoras.R to inst/doc/ +Copying pitagoras.Rmd to inst/doc/ +``` + +TODO Incluir a vinheta do `pitagoras()` ou outra funcionalidade com +output em PDF. + +Por fim, basta executar `check()` e `build()` mais uma vez para incluir +as vinhetas no `.tar.gz` do seu pacote. + +## Vinhetas em PDF + +TODO Demonstrar um dataset e uma função. + +As vinhetas ficam no `inst/doc/` quando o pacote é instalado. Os fontes +ficam em `vignettes/` + +Elas ficam no diretório `vignettes/`. São parte do sistema de +ajuda/documentação do pacote. + +`R CMD check` ou `devtools::check()` avalia as vinhetas, extrai o código +e avalia sua execussão sequêncial, chunk por chunk. + +`R CMD build` vai criar o PDF ou HTML da vinheta e colocar no +`inst/doc/`, para isso vai rodar a engine declarada (knitr ou Sweave, +rmarkdown, enfim). + +A partir da versão 3.0.0, o R admite vignettes engines diferentes do +Sweave. No caso, permite usar o **knitr** para gerar PDF e HTML. + diff --git a/config.R b/config.R index 9331a536b4bdbdf08445fd452b4cafe6bb41a85d..ec574b1711820a763132685c8889380b6b3134cd 100644 --- a/config.R +++ b/config.R @@ -12,3 +12,18 @@ renderUrl <- function(text, url, output){ ## renderUrl("Walmes Zeviani", "http://www.leg.ufpr.br/~walmes") ## renderUrl("Walmes Zeviani", "http://www.leg.ufpr.br/~walmes", ## output="tex") + +## http://stackoverflow.com/questions/13848137/figure-captions-references-using-knitr-and-markdown-to-html +fig <- local({ + i <- 0 + ref <- list() + list( + cap = function(refName, text) { + i <<- i + 1 + ref[[refName]] <<- i + paste("Figura ", i, ": ", text, sep = "") + }, + ref = function(refName) { + ref[[refName]] + }) +}) diff --git a/setup_knitr.R b/setup_knitr.R new file mode 100644 index 0000000000000000000000000000000000000000..0d6df0004100baa24043414636ead606343f8c48 --- /dev/null +++ b/setup_knitr.R @@ -0,0 +1,8 @@ +library(knitr) + +opts_chunk$set( + dev.args=list(family = "Palatino")) + +opts_knit$set(eval.after = "fig.cap") + +options(width = 68) diff --git a/style.css b/style.css index 0ab316dcb0e536325becd16f5582a4c3a4eae7b6..c7dc32207e90c5cf052a326fdb57b2147a42d2cf 100644 --- a/style.css +++ b/style.css @@ -21,6 +21,16 @@ tt, code, pre { /* h4.author {} */ /* code { font-size: 16px; } */ +p { + /* margin: 0px 0px 10px; */ + text-indent: 1em; + text-align: justify; +} + +pre { + word-break: keep-all; +} + pre code { font-size: 14px; }