У меня есть черный значок на прозрачном фоне в файле png. Я хочу использовать этот значок в разных местах документа LaTeX в разных цветах. В качестве бонуса было бы неплохо, если бы я мог дать верхней половине значка другой цвет, чем нижней, потому что он иногда появляется на границе разных фонов.
Этот ответпоказывает, как раскрасить файл png в оттенках серого, и легко придать верхней половине другой цвет, чем нижней. К сожалению, для этого требуется, чтобы логотип был на белом фоне:
\documentclass{article}
\usepackage{graphicx}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
\fill[yellow!50!white] (0,1) rectangle (2,2);
\fill[gray!50!black] (0,0) rectangle (2,1);
\begin{scope}[blend group=screen]
\node[inner sep=0,line width=0] (logo) at (1,1) [anchor=center] {\includegraphics{icon-bw}};
\fill[blue] (logo.west) rectangle (logo.north east);
\fill[green] (logo.south west) rectangle (logo.east);
\end{scope}
\end{tikzpicture}
\end{document}
Пример значка с добавленным белым фоном:
Если вместо этого я использую черно-прозрачный png, то весь узел будет окрашен в синий и зеленый цвета.
Пример значка с прозрачным фоном:
Этот ответпоказывает, как использовать файл png в качестве маски прозрачности. Но как переместить значок так, чтобы он был центрирован в точке (1,1)?
\documentclass{article}
\usepackage{graphicx}
\usepackage{tikz}
\usetikzlibrary{fadings}
\begin{tikzfadingfrompicture}[name=icon]
\begin{scope}[transparency group]
\node (icon) [fill, draw, white] {\includegraphics[height=1cm]{icon}};
\begin{scope}[blend mode=difference]
\fill[white] (icon.south west) rectangle (icon.north east);
\end{scope}
\end{scope}
\end{tikzfadingfrompicture}
\begin{document}
\begin{tikzpicture}
\fill[yellow!50!white] (0,1) rectangle (2,2);
\fill[gray!50!black] (0,0) rectangle (2,1);
% How I intend to use it
\begin{scope}[scope fading=icon, fit fading=false]
\fill[blue] (0.5,1) rectangle (1.5,1.5);
\fill[green] (0.5,0.5) rectangle (1.5,1);
\end{scope}
% Approach of the original answer. The icon is not positioned correctly.
% The specified coordinate does not seem to make any difference.
\path[scope fading=icon,fit fading=false] (1,1);
\node[fill=yellow,minimum width=1cm,minimum height=1cm] {};
\end{tikzpicture}
\end{document}
В моем реальном варианте использования иконка состоит только из черного и прозрачного. Поэтому было бы приемлемо, если бы ответ не работал с промежуточными серыми тонами.
решение1
Шаблон затухания будет центрирован относительно (0,0), и единственный способ его переместить — это переместить содержимое узла с помощью таких вещей, как \hspace
и \raisebox
. Перемещение реализации просто использует шаблон в этом месте (вне края). Поскольку он центрирован, вам нужно переместить его в два раза дальше, чем он фактически перемещается.
\documentclass{article}
\usepackage{graphicx}
\usepackage{tikz}
\usetikzlibrary{fadings}
\begin{tikzfadingfrompicture}[name=icon,inner sep=0]
\node [fill=transparent!0]
{\hspace{2cm}\raisebox{2cm}{\includegraphics[height=2cm, width=2cm]{images/icon}}};
\end{tikzfadingfrompicture}
\begin{document}
\begin{tikzpicture}
\fill[yellow!50!white] (0,1) rectangle (2,2);
\fill[gray!50!black] (0,0) rectangle (2,1);
\begin{scope}[shift={(1,1)}]
\path[scope fading=icon, fit fading=false];
\node[bottom color=blue,top color=green,minimum width=2cm,minimum height=2cm]{};
\end{scope}
\end{tikzpicture}
\end{document}
решение2
Этот ответ отличается от ответа Джона Кормило в основном двумя моментами:
- Я использую
fading transform
там, где я применяю затухание вместо\hspace
и\raisebox
в определении затухания. Также обратите внимание, что я используюpath fading
вместоscope fading
. Я не уверен, насколько велика эта разница, но у меня не получилось заставить это работать с прохождениемscope fading
иfading transform
вscope
окружение. - Я инвертирую цвета файла png, чтобы вместо прозрачных участков были заполнены черные части.
\documentclass{article}
\usepackage{graphicx}
\usepackage{tikz}
\usetikzlibrary{fadings}
\newcommand\IconNodeContent{%
\includegraphics[height=1cm]{icon}%
}
\begin{tikzfadingfrompicture}[name=icon]
% I am using \fill[white] with blend mode=difference to invert the colors
% so that I can use my black on transparent icon without needing to convert it to white on transparent/black.
% This has the down side that the area around the icon node is not transparent but opaque.
% I am increasing the transparent area a little with draw thick to avoid a visible rectangle around the icon when filling it later.
\begin{scope}[transparency group]
\node (icon) [fill, draw, thick, white] {\IconNodeContent};
\begin{scope}[blend mode=difference]
\fill[white] (icon.south west) rectangle (icon.north east);
\end{scope}
\end{scope}
\end{tikzfadingfrompicture}
\begin{document}
\begin{tikzpicture}
% draw background
\fill[yellow!50!white] (0,1) rectangle (2,2);
\fill[gray!50!black] (0,0) rectangle (2,1);
% create an invisible node to define size and position of icon
\node (icon) at (1,1) [anchor=center, transparent] {\IconNodeContent};
% draw the top half of the icon in one color, shifting the coordinates 1pt inwards to make sure no border is visible
\fill[blue, path fading=icon, fit fading=false, fading transform={shift=(icon.center)}] ([shift={(1pt,-1pt)}] icon.north west) rectangle ([shift={(-1pt,+0pt)}] icon.east);
% draw the bottom half of the icon in another color, shifting the coordinates 1pt inwards to make sure no border is visible
\fill[green, path fading=icon, fit fading=false, fading transform={shift=(icon.center)}] ([shift={(1pt,+1pt)}] icon.south west) rectangle ([shift={(-1pt,-0pt)}] icon.east);
\end{tikzpicture}
\end{document}