Reputation: 16064
In RMarkdown is there a way to specify the font color?
There doesn't seem to be an option while browsing through the chunk options
Upvotes: 93
Views: 132922
Reputation: 4275
if you are using next.js & tailwind
,then
This is <span style={{ color: 'red' }}>red</span> in color
Upvotes: 0
Reputation: 3683
beamer
presentation and HTMLs including reveal.js
A lua filter enables you to specify the font colors in RMarkdown, Quarto Markdown (.qmd
), and vanilla Pandoc Markdown in very easy and markdown-ish format. You just specify the font color by color names, e.g. [red]{color="red"}
, or even by hexadecimal integers (hex), e.g. [red]{color="#FF6347"}
.
beamer
reveal.js
color-text.lua
Using a lua filter to change font colors is originally presented in 5.1 Font color | R Markdown Cookbook. This GitHub comment further elaborated the lua filter so that we can set font colors with hex codes.
The following lua filter is a modified version of the lua filter presented in the GitHub comment I mentioned above. The current version enables you to use the notations ([red]{color="red"}
and [red]{color="#FF6347"}
) when you render beamer
and reveal.js
presentation formats.
Span = function(span)
color = span.attributes['color']
-- if no color attribute, return unchange
if color == nil then return span end
-- tranform to <span style="color: red;"></span>
if FORMAT:match 'html' or FORMAT:match 'revealjs' then -- Also available for revealjs
-- remove color attributes
span.attributes['color'] = nil
-- use style attribute instead
span.attributes['style'] = 'color: ' .. color .. ';'
-- return full span element
return span
elseif FORMAT:match 'latex' or FORMAT:match 'beamer' then -- Also available for beamer
-- remove color attributes
span.attributes['color'] = nil
-- encapsulate in latex code
if string.sub(color, 1, 1) == "#" and #color == 7 then
-- TODO: requires xcolor
local R = tostring(tonumber(string.sub(color, 2, 3), 16))
local G = tostring(tonumber(string.sub(color, 4, 5), 16))
local B = tostring(tonumber(string.sub(color, 6, 7), 16))
table.insert(
span.content, 1,
pandoc.RawInline('latex', '\\textcolor[RGB]{'..R..','..G..','..B..'}{')
)
elseif string.sub(color, 1, 1) == "#" and #color == 4 then
-- TODO: requires xcolor
local R = tostring(tonumber(string.sub(color, 2, 2), 16) * 0x11)
local G = tostring(tonumber(string.sub(color, 3, 3), 16) * 0x11)
local B = tostring(tonumber(string.sub(color, 4, 4), 16) * 0x11)
table.insert(
span.content, 1,
pandoc.RawInline('latex', '\\textcolor[RGB]{'..R..','..G..','..B..'}{')
)
else
table.insert(
span.content, 1,
pandoc.RawInline('latex', '\\textcolor{'..color..'}{')
)
end
table.insert(
span.content,
pandoc.RawInline('latex', '}')
)
-- returns only span content
return span.content
else
-- for other format return unchanged
return span
end
end
---
title: "Changing the font color"
output:
## PDFs
bookdown::pdf_document2:
pandoc_args:
- "--lua-filter=color-text.lua"
bookdown::beamer_presentation2:
pandoc_args:
- "--lua-filter=color-text.lua"
## HTMLs
bookdown::html_document2:
# base_format: "function(..., number_sections) revealjs::revealjs_presentation(...)" # comment this line when creating ordinary HTMLs
pandoc_args:
- "--lua-filter=color-text.lua"
self_contained: false
always_allow_html: yes
link-citations: yes
---
## First
we define a Lua filter and write it to
the file `color-text.lua`.
```{cat, engine.opts = list(file = "color-text.lua")}
Span = function(span)
color = span.attributes['color']
-- if no color attribute, return unchange
if color == nil then return span end
-- tranform to <span style="color: red;"></span>
if FORMAT:match 'html' or FORMAT:match 'revealjs' then -- Also available for revealjs
-- remove color attributes
span.attributes['color'] = nil
-- use style attribute instead
span.attributes['style'] = 'color: ' .. color .. ';'
-- return full span element
return span
elseif FORMAT:match 'latex' or FORMAT:match 'beamer' then -- Also available for beamer
-- remove color attributes
span.attributes['color'] = nil
-- encapsulate in latex code
if string.sub(color, 1, 1) == "#" and #color == 7 then
-- TODO: requires xcolor
local R = tostring(tonumber(string.sub(color, 2, 3), 16))
local G = tostring(tonumber(string.sub(color, 4, 5), 16))
local B = tostring(tonumber(string.sub(color, 6, 7), 16))
table.insert(
span.content, 1,
pandoc.RawInline('latex', '\\textcolor[RGB]{'..R..','..G..','..B..'}{')
)
elseif string.sub(color, 1, 1) == "#" and #color == 4 then
-- TODO: requires xcolor
local R = tostring(tonumber(string.sub(color, 2, 2), 16) * 0x11)
local G = tostring(tonumber(string.sub(color, 3, 3), 16) * 0x11)
local B = tostring(tonumber(string.sub(color, 4, 4), 16) * 0x11)
table.insert(
span.content, 1,
pandoc.RawInline('latex', '\\textcolor[RGB]{'..R..','..G..','..B..'}{')
)
else
table.insert(
span.content, 1,
pandoc.RawInline('latex', '\\textcolor{'..color..'}{')
)
end
table.insert(
span.content,
pandoc.RawInline('latex', '}')
)
-- returns only span content
return span.content
else
-- for other format return unchanged
return span
end
end
```
Now we can test the filter with some text in brackets with
the `color` attribute, e.g.,
> Roses are [red and **bold**]{color="red"} and
> violets are [blue]{color="blue"}.
> Roses are [red and **bold**]{color="#FF6347"} and
> violets are [blue]{color="#6a5acd"}.
Upvotes: 0
Reputation: 3222
sass
There's a new and better way of specifying colors or fonts in R Markdown:
sass
{sass, echo = FALSE}
// This chunk contains SASS-code to specify font color
h1, h2, h3, h4, h5
color: blue // Color for the headers
body
color: red // Color for the text in the main part of your document
// The colors are only examples. You can change them to anything. You could also use hex codes.
Typically, I include something like this in my documents, to also change the font type, the sizes, the link colors etc.:
// These are variables, and are easy to change
$color: blue
$color2: red
$font: "Arial"
$font-size: 16px
h1, h2, h3, h4, h5
color: $color
font-family: $font
font-weight: bold
body
background-color: white
color: black
font-family: $font
font-size: $font-size
a
color: $color
a:link
color: $color
a:hover
background-color: $color2
You can change any HTML tag you can think of this way.
Read more about SASS here.
Upvotes: 2
Reputation: 10526
I create a function like this:
## Color Format
colFmt <- function(x,color) {
outputFormat <- knitr::opts_knit$get("rmarkdown.pandoc.to")
if(outputFormat == 'latex') {
ret <- paste("\\textcolor{",color,"}{",x,"}",sep="")
} else if(outputFormat == 'html') {
ret <- paste("<font color='",color,"'>",x,"</font>",sep="")
} else {
ret <- x
}
return(ret)
}
Then you can use it inline like this:`r colFmt("MY RED TEXT",'red')`
, and colored text will be rendered regardless of whether working on latex or HTML document.
Upvotes: 51
Reputation: 21
For PDF and HTML, to get colored text which you can modify with markdown highlighting : see the rmarkdown book. Pandoc filter is the best choice.
For Microsoft word, you have to create first a Template_MS.docx with custom styles. Warning: create different styles for coloring paragraphs (paragraph style) and for colorings few words (character style). It is an option when you made a new style.
Add in th YAML:
---
output:
word_document:
reference_docx: Template_MS.docx
---
And next:
For <span custom-style="Character1">few words</span> of colored text.
For paragraph.
<div custom-style="Paragraph1">Paragraph of colored text. Blabla. Blabla.</div>
Nota Bene:
+ Do not use the same style for Paragraph and a few words, it is bugging.
+ If it is not working, check that your style is for paragraph ou character in MS.
+ If it is not working, install an updated version of pandoc.
Upvotes: 2
Reputation: 1135
An output-format agnostic solution would be to use the dedicated text_spec()
function in the kableExtra
package:
Roses are `r kableExtra::text_spec("red", color = "red")`,
violets are `r kableExtra::text_spec("blue", color = "blue")`
Upvotes: 22
Reputation:
Others have provided answers for output other than Word. For Word, you can use the Pandoc custom-style syntax to accomplish this with the aid of a reference word document. First, inside your reference.docx template, create a new Word style with a short, distinct name. If you want your font color to apply to a full paragraph, you can use the default, “Linked Paragraph and Character” style type. If you only want to emphasize some words in a paragraph with color, you need to select the “Character” style type. Change the font color (and any other styling you need) and save the reference.docx file.
Then, inside your .Rmd file, you can use the tag as follows:
<div custom-style=“DivCol”>Whole paragraph of colored text</div>
Just a <span custom-style=“SpanCol”>few words</span> of colored text
A word regarding style names - for reasons I don’t understand, this process did not work with the style name “Span_Add” but “SpanAdd” was fine.
Upvotes: 10
Reputation: 520
This seems to work very well in both output formats, pdf and html:
Roses are $\color{red}{\text{beautiful red}}$,
violets are $\color{blue}{\text{lovely blue}}$.
Hope it helps.
Upvotes: 29
Reputation: 3891
I basically used Nicholas Hamilton's answer but because I used xtable
and print
, I had some problems with certain latex sequences being escaped. Namely, \\textcolor
being transformed to $\backslash$textcolor
. I was able to get it right by avoiding sanitizing in the following way:
```{r results='asis'}
tbl = data.frame(a = letters[1:10], b = 1:10 / 10)
tbl$b = ifelse(tbl$b < 0.5, colFmt(tbl$b, "red"), colFmt(tbl$b, "green"))
print(xtable(tbl), sanitize.text.function = identity)
```
I then had to go and manually sanitize a few characters like %
but at least \textcolor
was correctly applied. Of course, this could be avoided by expanding your own sanitize function.
Upvotes: 5
Reputation: 1216
The answer given at the link provided by @Ben Bolker:
Roses are <span style="color:red">red</span>,
violets are <span style="color:blue">blue</span>.
does work if you select HTML (ioslides) as the output format.
However, it does not work if you select pdf (beamer) as output format. If you want to create a pdf, use LaTeX syntax:
Roses are \textcolor{red}{red}, violets are \textcolor{blue}{blue}.
Upvotes: 109