在 HTML 和 PDF 输出中指定透明颜色

问题描述 投票:0回答:1

在渲染为 PDF 和 HTML 的 R markdown 报告中,我想使用不同的透明度为文本着色。
例如,我想使用 相同的橙色 和 3 个不同的 alpha 值(0.3、0.6、1.0)。

Nicholas Hamilton 提供了一种为文本着色的功能,无论输出格式如何(PDF/latex 或 HTML)。 fct 的更新 MWE。由Mark Neal提供。

要使用透明颜色,据我所知,

colFmt()
函数需要进行某种调整。

我尝试了什么

gplots::col2hex(color)
允许将颜色名称转换为十六进制 RGB 字符串,然后可以在
colFmt()
中使用。 不幸的是,该功能不允许透明。

palr::col2hex(color)
允许使用透明胶片进行转换。对于 PDF 输出,这些会被
colFmt()
“忽略”(透明度值只是作为文本添加)。对于 HTML 输出,它们与所提供颜色的透明版本不同(见下图)

MWE的PDF输出

PDF Output of MWE

MWE 的 HTML 输出

HTML Output of MWE

MWE

---
title: "Colored text with transparency"
author: "Test"
output: html_document
#output: pdf_document
header-includes:
  \usepackage[usenames,dvipsnames]{xcolor}
---

```{r setup, include=FALSE}
library(knitr)
opts_chunk$set(echo = TRUE)
```

## Define colorizing function

```{r colFmt}
colFmt = function(x,color){
  outputFormat = opts_knit$get("rmarkdown.pandoc.to")
  if(outputFormat == 'latex')
    paste("\\textcolor[HTML]{",color,"}{",x,"}",sep="")
  else if(outputFormat == 'html')
    paste("<font color='",color,"'>",x,"</font>",sep="")
  else
    x
}
```

## Apply colorizing function

### gplots

```{r include=FALSE}
library(gplots) # to be able to use col2hex() to convert color names to hex RGB strings
hex_color <- str_remove(gplots::col2hex(color),"#") # convert color names to hex RGB strings
```
Some `r colFmt("orange text",hex_color)` 

### palr
```{r include=FALSE}
library(palr) # for col2hex() 
hex_color <- str_remove(palr::col2hex(color),"#")
hex_color_light <- str_remove(palr::col2hex(color, alpha = 0.3),"#")
```
Some `r colFmt("orange text",hex_color)` and some `r colFmt("light orange text", hex_color_light)` 
r pdf colors r-markdown gplots
1个回答
0
投票

在 Latex 中,您可以使用

\transparent{}
包向文档引入部分透明的颜色(请参阅此 StackExchange 答案中的用法)。

请注意,理想情况下,乳胶输出应类似于

{\transparent{0.3} this}
,其中整个受影响的文本段包含在大括号中。然而,RMarkdown 想要转义第一个和最后一个花括号,所以我不得不选择
\transparent{0.3} that instead\transparent{1}

---
title: 'Transparencies'
output: pdf_document
#output: pdf_document
header-includes:
  \usepackage[usenames,dvipsnames]{xcolor}
  \usepackage{transparent}
---

```{r setup, include=FALSE}
library(knitr)
opts_chunk$set(echo = TRUE)

colFmt <- function(x, color, alpha=1){
  outputFormat <- opts_knit$get('rmarkdown.pandoc.to')
  
  if(!startsWith(color, '#')) {
    color <- gplots::col2hex(color) |> substring(2)
  }
  
  if(outputFormat == 'latex') 
    sprintf('\\transparent{%f}\\textcolor[HTML]{%s}{%s}\\transparent{1}', alpha, color, x)
  else if(outputFormat == 'html')
    sprintf('<span style="color: #%s; opacity: %f">%s</span>', color, alpha, x)
  else
    x
}
```

Careful, this is an `r colFmt("orange text", "orange")`!

Let's make it a little `r colFmt("less orange", "orange", 0.7)`.

Or maybe `r colFmt("even less orange", "orange", 0.3)`.

HTML and PDF output showing different opacity levels in certain parts of a text

© www.soinside.com 2019 - 2024. All rights reserved.