7

Wondering how to draw this sort of thing with tikz:

I ░░░░░░░░░░░░░░░ am a blank space.

...but with text overlaid on the dot grid. Also, instead of the dot-grid being diagonal, I would like to make it simply vertical/horizontal, and make the dots smaller and lighter so when the text goes over it it's not distracting. But it would be along these lines:

I ░Hello░World░░░ am a blank space.

But the "Hello World" would have ░ faded dots behind each letter. Just using this ░ unicode character for demo, this instead would use tikz.

Lance
  • 1,799

2 Answers2

13

Are you looking for something like this? (If yes, all I'd have to do is to introduce a slightly more flexible pattern such that things look good also with more reasonable scale factors, if no, then this may help others to understand the question better.)

\documentclass{article}
\usepackage[margin=1in]{geometry}
\usepackage{tikz}
\usetikzlibrary{fadings,patterns}
\newcommand{\PlaceCharOverDots}[2][10]{%
\begin{tikzfadingfrompicture}[name=temp]
\node[transparent!20,scale=#1] 
{\bfseries\sffamily \textcolor{white}{#2}};
\end{tikzfadingfrompicture}%
\tikz[baseline=(X.base)]{\node[inner sep=0pt,outer sep=0pt,scale=#1] (X) {\bfseries\sffamily 
\textcolor{white}{\strut#2}};
\path[pattern=dots,overlay] (X.north west)
rectangle (X.south east);%
\path[path fading=temp,fit fading=false,overlay,pattern=dots,pattern
color=gray!20] (X.north west)
rectangle (X.south east);}%
}
\begin{document}
\PlaceCharOverDots{Hello world} 
\end{document}

enter image description here

EDIT: If you only want the text being placed over dots, all one needs to do is to define a somewhat denser dot pattern and to use it as the background of a node. I recommend \tikzmarknode here because it automatically detects the mode your in (math mode, font size etc.) and has other advantages, which this however does not exploit. Of course, you may adjust inner sep to your needs and/or replace it by inner xsep and inner ysep.

\documentclass{article}
\usepackage[margin=1in]{geometry}
\usepackage{tikz}
\usetikzlibrary{tikzmark,patterns}
% based on the rings example on p. 1060 of the pgfmanual as well as 
% https://tex.stackexchange.com/a/29367/1952 for the color
\makeatletter 
\pgfdeclarepatternformonly[/tikz/radius,\size]{flexible dots}
{\pgfpoint{-0.5*\size}{-0.5*\size}}
{\pgfpoint{0.5*\size}{0.5*\size}}
{\pgfpoint{\size}{\size}}
{
 \pgfsetfillcolor{\tikz@pattern@color}
 \pgfpathcircle\pgfpointorigin{\pgfkeysvalueof{/tikz/radius}}
 \pgfusepath{fill}
}
\makeatother
\tikzset{
radius/.initial=0.1pt,
size/.store in=\size, 
size=0.5pt,
}
\begin{document}
\tikzmarknode[pattern=flexible dots,inner sep=2pt]{test}{Hello world}
\end{document}

enter image description here

  • Pretty much, but the Hello World would just be plain black text, not a cutout of the dots. It's as if the blank is just a background made of dots, and you are typing right over it to fill in the blank. – Lance Dec 23 '18 at 01:28
  • @LancePollard I am not sure I fully understand yet but I added a proposal that among other things comes with a more flexible dot pattern. –  Dec 23 '18 at 01:47
  • copy-pasting the code into pdflatex I am getting an error: ! Undefined control sequence. l.24 \tikzmarknode [pattern=flexible dots,inner sep=2pt]{test}{Hello world} – Lance Dec 23 '18 at 03:18
  • 1
    @LancePollard When was the last time you updated your TeX installation? \tikzmarknode has been added only a few months to the tikzmark library. The error message seems to indicate that you are using an older version. –  Dec 23 '18 at 03:22
4

Here is one way to do it. The TikZ pattern has been adopted from https://tex.stackexchange.com/a/323867/8650. Instead of setting up a background layer, I simply draw the node twice.

   documentclass{article}
    \usepackage{xcolor}
    \usepackage{tikz}
    \usetikzlibrary{patterns}
    \pgfdeclarepatternformonly{my dots}{\pgfqpoint{-1pt}{-1pt}}{\pgfqpoint{5pt}{5pt}}{\pgfqpoint{2pt}{2pt}}%
    {
        \pgfpathcircle{\pgfqpoint{0pt}{0pt}}{.4pt}
        \pgfusepath{fill}
    }
    \newcommand{\fade}[1]{%
    \begin{tikzpicture}[anchor=base, baseline]
    \node[inner sep=0, outer sep=0] (node) {#1};
    \fill[pattern=my dots, pattern color=black!10] (node.south west) rectangle (node.north east);
    \node[inner sep=0, outer sep=0] (node) {#1};
    \end{tikzpicture}}
    \begin{document}
    \ \\
    I \fade{Hello World} am a blank space.\\
    I Hello World am a blank space.
    \end{document}

Dot pattern behind Hello World.

  • @marmots answer is better - using a tikzmarknode and applying the pattern directly to that node -you just need the lighter color. – hpekristiansen Dec 23 '18 at 02:08