使用 pgfplots 在 tcolorbox 中进行阴影处理

使用 pgfplots 在 tcolorbox 中进行阴影处理

背景:我正在使用tcolorbox它来构建我的定理、定义和示例环境。我一直在使用阴影作为这些环境的背景,但最近了解到阴影pgf被硬编码为 RGB,但我必须使用 CMYK 进行打印。

pgfplots能够在 CMYK 色彩空间中进行阴影处理,请参阅这里

问题: tcolorbox似乎使用pgf来进行着色。是否可以改用tcolorboxusepgfplots来进行着色,最好是以自动方式?

例如,这是一个 MWE:

\documentclass{article}
\usepackage[cmyk]{xcolor}
\usepackage[many]{tcolorbox}
\usepackage{pgfplots}
\pgfplotsset{compat=1.8}

\tcbset{
definitionstyle/.style={%
enhanced,
interior style={left color=black!2, right color=blue!30}
}
}   

\begin{document}

\begin{tcolorbox}[definitionstyle]
Blah blah
\end{tcolorbox}

\end{document}

我想left color=black!2, right color!30用类似的东西代替

\begin{tikzpicture}
\begin{axis}[x=1cm,y=1cm,hide axis]
\addplot[surf,mesh/color input=explicit,shader=interp] 
table[meta=cdata]{
x y cdata
1 1 color=black!2
2 1 color=blue!30

1 2 color=black!2
2 2 color=blue!30
};
\end{axis}
\end{tikzpicture}

pgfplots这将使用 CMYK 颜色进行阴影处理。

答案1

\shade例如,TikZ命令可以在底层中使用。我认为pgfplots这里没有必要。

不要忘记使用\begin{tcbclipinterior}...\end{tcbclipinterior}来获得正确的阴影剪辑。

\documentclass{article}
\usepackage[cmyk]{xcolor}
\usepackage[many]{tcolorbox}

\tcbset{
definitionstyle/.style={%
  enhanced,
  underlay={\begin{tcbclipinterior}
      \shade[left color=black!2, right color=blue!30] (interior.north west) rectangle (interior.south east);
    \end{tcbclipinterior} 
  },
}
}   

\begin{document}

\begin{tcolorbox}[definitionstyle]
Blah blah
\end{tcolorbox}

\end{document}

答案2

(警告:非常黑客的解决方案)

利用克里斯蒂安的tcbclipinterior和的想法underlay,我想出了以下方法来确保一切都是 CMYK。

首先,使用下面的代码来制作一个完全着色的页面:

\pdfcompresslevel=0
\documentclass{minimal}

\usepackage[cmyk]{xcolor}
\usepackage{pgfplots}
\pgfplotsset{compat=1.8}
\usepackage{tikz}

\addtolength{\oddsidemargin}{-1.5in}
\addtolength{\evensidemargin}{-1.5in}
\addtolength{\textwidth}{1.5in}
\addtolength{\topmargin}{-1.5in}
\addtolength{\textheight}{1.75in}

\begin{document}

\begin{tikzpicture}
    \begin{axis}[xmin=0, ymin=0, x=9in,y=13in, hide axis]
    \addplot[surf,mesh/color input=explicit,shader=interp] 
    table[meta=cdata] {
        x y cdata
        0 0 color=black!4
        1 0 color=teal!20

        0 1 color=black!4
        1 1 color=teal!20
    };
    \end{axis}
\end{tikzpicture}
\end{document}

输出前面有一个额外的空白页,因此将其删除(我只将第二页打印为 PDF,然后选择“预检”并执行“分析和修复”(完成此步骤是因为否则会出现“设备无关的颜色”)。假设最终结果是文件background.pdf。然后我们可以执行以下操作:

\documentclass{article}
\usepackage[cmyk]{xcolor}
\usepackage[many]{tcolorbox}
\usepackage{pgfplots}
\pgfplotsset{compat=1.14}
\usepackage{graphicx}
\usepackage{lipsum}

\tcbset{
definitionstyle/.style={%
  enhanced,
  underlay={
    \begin{tcbclipinterior}
    \includegraphics{background.pdf}
    \end{tcbclipinterior} 
  }
}
} 

\begin{document}

\begin{tcolorbox}[definitionstyle]
\lipsum[1]
\end{tcolorbox}

\end{document}

这将生成没有 RGB 的 pdf。

我要补充的是,如果您正在使用任何节点(就像我一样),您可以添加 \tcbuselibrary{skins} 然后添加 fill plain image=background.pdf 到该节点的选项。

答案3

这个问题很久以前就被问到了,但我想我有一个新的答案。

我遵循了最初的想法,用 阴影 代替传统的阴影pgfplotsaxis的环境pgfplots在内部用于fill overzoom picture缩放到给定的节点,这里是 的背景tcolorbox

不幸的是,由于某些技术原因,代码无法直接应用于新样式definitionstyle cmyk(至少我做不到)。我猜(但不知道)代码被扫描为逐字逐句pgfplots。我的笨拙但可行的解决方案是将代码保存在一个文件中,然后在所需的位置输入该文件。

完整示例为:

\documentclass{article}
\usepackage[cmyk]{xcolor}
\usepackage[many]{tcolorbox}
\usepackage{pgfplots}
\pgfplotsset{compat=1.16}

\begin{tcbverbatimwrite}{\jobname_myshading.tex}
\begin{axis}[x=1cm,y=1cm,hide axis]
\addplot[surf,mesh/color input=explicit,shader=interp]
table[meta=cdata]{
x y cdata
1 1 color=black!2
2 1 color=blue!30

1 2 color=black!2
2 2 color=blue!30
};
\end{axis}
\end{tcbverbatimwrite}

\tcbset{
  definitionstyle/.style={%
    enhanced,
    interior style={left color=black!2, right color=blue!30}
  },
  definitionstyle cmyk/.style={%
    enhanced,
    interior style={fill overzoom picture={\input{\jobname_myshading.tex}}}
  },
}

\begin{document}

\begin{tcolorbox}[definitionstyle]
Shading RGB
\end{tcolorbox}

\begin{tcolorbox}[definitionstyle cmyk]
Shading CMYK via pgfplots
\end{tcolorbox}

\end{document}

在此处输入图片描述

相关内容