10

I made this simple latex file :

\documentclass{minimal}
\usepackage{tikz}
\newcommand\randdot{%
\tikz{\pgfmathsetmacro{\r}{0.01+0.05*random()}\fill (0,0) circle (\r);}\ }

\begin{document}

\randdot\randdot\randdot\randdot\randdot\randdot

Test \leaders\hbox{\randdot\ }\hfill 3 \hfill \ 

\randdot\randdot\randdot\randdot\randdot\randdot

\end{document}

Random dots, but not in leaders

The new command randdot typeset a dot of random size. The command works good, BUT when I use it in a leader, the dots are no more random. The leaders command must evaluate only once the randdot, and copy it...

How can I obtain a random leader, with each dot being evaluated differently ?

Thanks !!

2
  • 3
    Leaders simply repeat copies of the box, they don't rebuild it at every instance.
    – egreg
    Commented Jul 22, 2012 at 20:10
  • Would it be possible to know how much will TeX expand a hfill, perhaps from lua? If that were possible, the problem would be solved writting a TikZ loop which fill that given dimension with random dots.
    – JLDiaz
    Commented Jul 22, 2012 at 20:43

2 Answers 2

10

The TikZ way David mentions is the now-famous (thanks to Andrew Stacey and Peter Grill) \tikzmark macro. Basically you leave TikZ coordinates at places you like and then refer to them in a later TikZ picture.

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{decorations.markings}
\tikzset{randlead/.style={decoration={
        markings,% switch on markings
        mark=% actually add a mark
        between positions 0 and 1 step 5mm
        with
            {
            \pgfmathsetmacro{\r}{0.01+0.05*random()}\fill (0,0) circle (\r);
            }
        },
        decorate
    }
}
\newcommand{\tikzmark}[1]{\tikz[overlay,remember picture,baseline=-0.5ex] \node (#1) {};}

\begin{document}
Test\tikzmark{a1} \hfill \tikzmark{a2}3 \hfill 

Test some text and then Test \tikzmark{a3} \hfill \tikzmark{a4}165 \hfill 

\begin{tikzpicture}[overlay,remember picture]
\draw[randlead] (a2) -- (a1);
\draw[randlead] (a4) -- (a3);
\end{tikzpicture} 
\end{document}

enter image description here

Further tweaks are possible but take this as a proof of concept.

2
  • This is very elegant. Why do you need to set the baseline to -0.5ex in the definition of the tikzmark ?
    – Xoff
    Commented Jul 22, 2012 at 22:00
  • 1
    @Xoff Well just cosmetics. It starts a little higher on the text line. Also you need two runs with this solution too.
    – percusse
    Commented Jul 22, 2012 at 22:01
11

enter image description here

There's probably a tikz way of getting the coordinates but I use the pdftex primitive here. Use glue instead of leaders, but measure the distance and overlay some boxes on a second run.

\documentclass{minimal}
\usepackage{tikz}
\newcommand\randdot{%
\tikz{\pgfmathsetmacro{\r}{0.01+0.05*random()}\fill (0,0) circle (\r);}\ }

\begin{document}
\makeatletter

\randdot\randdot\randdot\randdot\randdot\randdot


Test \leaders\hbox{\randdot\ }\hfill 3 \hfill \ 

Test %
\pdfsavepos\write\@auxout{\gdef\noexpand\leada{\the\pdflastxpos}}%
\ifx\leada\@undefined\else
\rlap{%
\dimen@\leadb sp
\advance\dimen@ - \leada sp
\loop
\setbox0\hbox{\randdot\ }%
\advance\dimen@-\wd\z@
\ifdim\dimen@>\z@
\box\z@
\repeat
}%
\fi
\hfill
\pdfsavepos\write\@auxout{\gdef\noexpand\leadb{\the\pdflastxpos}}%
4 \hfill \ 

\randdot\randdot\randdot\randdot\randdot\randdot

\end{document}
3
  • I like that solution, but I was wondering : you need at least 2 compilations to get the result. But are there some special cases where you need more to converge ?
    – Xoff
    Commented Jul 22, 2012 at 21:59
  • I don't think so (if the file isn't edited to change the leader stretch) the boxes are in an \rlap so take up zero space so have no effect on the typesetting of other item, so the second run adding the boxes should not. move anything else. (you could generate degenerate case which explicitly check with \lastboox if a box has been used and do something strange so requiring a third run, but not in any normal processing. Commented Jul 22, 2012 at 22:08
  • I checked the other solution with tikz, because it's easier to use, but I like that one very much too :)
    – Xoff
    Commented Jul 23, 2012 at 9:08

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .