在 tikz 中用负色写文字

在 tikz 中用负色写文字

对此可能没有简单而通用的解决方案,但tikz无论背景是什么,是否有可能用背景的负片色来书写文字?

为了说明问题(但我不要求针对特定问题的解决方案)背景):

\documentclass[tikz]{standalone}

\begin{document}
\begin{tikzpicture}
\shade[left color=black,right color=red] (0,0) rectangle (4,2);
\node at (2,1) {this text is hard to read};
\end{tikzpicture}
\end{document}

在此处输入图片描述

负片可以以任何方式理解(补色,黑色的补色),其实这并不重要。其目的是获得适合任何背景的可读内容。

编辑这是对所建议的不同方法的比较。

  • 第一栏:原文(黑色文字),400不太好读
  • 第二栏:我的要求:根本不是一个好主意!
  • 第三列:白色文字,黑色轮廓:小的时候难以阅读
  • 第四栏:白底黑字,上面写着opacity:我的最爱
  • 第五列:黑色背景中的白色文字:我也喜欢它,但稍微更喜欢这里的第四个,因为它更浅。

在此处输入图片描述

答案1

简短的回答是:使用blend modes(p.340,pgfmanual v3.0.1a)和difference模式。

但是,为了获得更好的结果,你可以使用文字轮廓或者不透明度的背景下图为不同的测试:

在此处输入图片描述

\documentclass[tikz]{standalone}
\usepackage[outline]{contour}
\usetikzlibrary{calc}
\begin{document}
\begin{tikzpicture}
  \node (a) {\includegraphics{tiger}};

  \path (a.north) -- (a.south)
  \foreach \pos in {1,...,7}{coordinate[pos=\pos/8] (p-\pos)};

  \tikzset{my text/.style={text=white,font=\Huge\bfseries}}
  \def\mytext{Test of long text}

  \node[my text] (ex) at (p-1) {\mytext};
  \node[anchor=east] at (ex -| a.west) {white text};

  \node[my text,text=black](ex) at (p-2) {\mytext};
  \node[anchor=east] at (ex -| a.west) {black text};

  \node[my text,fill opacity=.5,fill=black,text opacity=1] (ex) at (p-3) {\mytext};
  \node[anchor=east] at (ex -| a.west) {black background with opacity};

  \node[my text,text=black,fill opacity=.5,fill=white,text opacity=1] (ex) at (p-4) {\mytext};
  \node[anchor=east] at (ex -| a.west) {white background with opacity};

  \node[my text] (ex) at (p-5) {\contour{white}{\mytext}};
  \node[anchor=east] at (ex -| a.west) {white outlined text};

  \node[my text] (ex) at (p-6) {\contour{black}{\textcolor{white}{\mytext}}};
  \node[anchor=east] at (ex -| a.west) {black outlined text};

  \begin{scope}[blend group=difference]
    \clip ($(p-7 -| a.west) + (0,1.1em)$) rectangle ($(p-7 -| a.east) + (0,-1.1em)$);
    \node {\includegraphics{tiger}};
    \node[my text] (ex) at (p-7) {\mytext};
  \end{scope}
  \node[anchor=east] at (ex -| a.west) {\emph{required} blended text (difference)};
\end{tikzpicture}
\end{document}

答案2

不回答:你让一个糟糕的决定变得更糟。首先,你不需要t=前缀,因为它们都是 t 值。如果你删除它,你可以选择放置一个带有纯色背景的角框,指定四个字符的宽度和一个字符的高度

\documentclass[tikz]{standalone}
\usepackage{mwe} % <- for dummy images
\begin{document}
\begin{tikzpicture}[
cornerbox/.style 2 args={
  path picture={
    \node{\includegraphics[width=1cm,height=1cm]{#1}};
    \node[fill=black,text=white,
          minimum width=3ex,minimum height=1ex,
          anchor=north west,
          outer sep=0,font=\sffamily\tiny] 
          at (path picture bounding box.north west) {#2};
  },
  inner sep=0,
  minimum size=1cm
}
]

\node[cornerbox={example-image}{$\infty$},draw,thick] at (0,0) {};
\node[cornerbox={example-image-a}{200},draw,thick] at (1,0) {};
\node[cornerbox={example-image-b}{5000},draw,thick] at (2,0) {};
\end{tikzpicture}
\end{document}

在这里,您可以根据需要将注释框设置得尽可能小,以便视障人士和色盲人士也能读取您的数据。

在此处输入图片描述

答案3

这个问题很有趣,我不知道答案。不过,你可以这样做来模拟这种效果:

\documentclass{article}

\usepackage{tikz}
\usetikzlibrary{fadings}
\usepackage{lipsum}
\newcommand\fadingtext[3][]{%
    \begin{tikzfadingfrompicture}[name=fading letter]
        \node[text=transparent!0,inner xsep=0pt,outer xsep=0pt,#1] {#3};
    \end{tikzfadingfrompicture}%
    \begin{tikzpicture}[baseline=(textnode.base)]
    \node[inner sep=0pt,outer sep=0pt,#1](textnode){\phantom{#3}}; 
    \shade[path fading=fading letter,#2,fit fading=false]
    (textnode.south west) rectangle (textnode.north east);% 
    \end{tikzpicture}% 
}

\begin{document}
\begin{tikzpicture}
\shade[left color=black,right color=red] (0,0) rectangle (4,2) (2,1) node{\fadingtext{left color=white, right color=yellow}{this text is easier to read}};
\end{tikzpicture}


\end{document}

(示例基于本论坛上的另一个答案

在此处输入图片描述

相关内容