4

I would like to specify custom hierarchies of tikz nodes where I do a few geometry calculations related to text depth, text width, text height, and so on.

In the process of writing custom commands to automate some of these calculations, I end up wanting to use TeX conditionals mixed in with tikz code. I read in another question that \pgfextra{} can be used for this. However, it seems that this only works at the level of the tikzpicture environment.

A minimal example of what I would like to do is the following:

\documentclass[class=minimal, border=0pt]{standalone}

\usepackage{tikz}

\newif\ifDebug
%\Debugtrue
\Debugfalse

\newcommand\MyNode{
  \node[anchor=north west,
        minimum width=5cm,
        minimum height=5cm,
        fill=green,
        \pgfextra{\ifDebug opacity=0.2,\fi}
        ] at (current page.north west) {}}

\begin{document}
\begin{tikzpicture}
  \MyNode{};
\end{tikzpicture}
\end{document}

The line containing \pgfextra is giving me trouble. What should I do to conditionally change arguments to \node?

Thanks!

2 Answers 2

5

Welcome to TeX.SE! Please try to avoid all pgfextra stuff. You can achieve almost everything with pgfkeys, also here.

\documentclass[class=minimal, border=0pt]{standalone}

\usepackage{tikz}

\newif\ifDebug
%\Debugtrue
\Debugfalse

\tikzset{Debug/.code={\ifDebug\pgfkeysalso{opacity=0.2}\fi}}

\newcommand\MyNode{
  \node[anchor=north west,
        minimum width=5cm,
        minimum height=5cm,
        fill=green,
        Debug,
        ] at (current page.north west) {}}

\begin{document}
\begin{tikzpicture}
\Debugtrue
  \MyNode{};
\end{tikzpicture}
\end{document}

enter image description here

If I comment out \Debugtrue, I get.

enter image description here

4

With a Tikz style (implemented with the /.code handler) this is rather straightforward:

\documentclass[class=minimal, border=0pt]{standalone}

\usepackage{tikz}

\newif\ifDebug
\Debugtrue
%\Debugfalse

\tikzset{
    my node/.code={
        \tikzset{
            anchor=north west,
            minimum width=5cm,
            minimum height=5cm,
            fill=green,
        }
        \ifDebug
           \tikzset{opacity=0.2}
        \fi
    }
}

\begin{document}
\begin{tikzpicture}
  \node[my node]{};
  \Debugfalse
  \node[my node] at (6,0){};
\end{tikzpicture}
\end{document}

enter image description here

As mentioned by marmot in his answer you should stay away from \pgfextra in general. My personal preference is also to stay away from custom commands where styles can do the same, but that really is personal.

2
  • 1
    You were faster, +1. I don't know why someone would upvote only my answer, but not yours. Sad.
    – user121799
    Sep 10, 2018 at 12:29
  • @marmot Well if someone thinks your solution is cleaner (which I could agree with) then it's a normal reaction :)
    – Max
    Sep 10, 2018 at 12:33

You must log in to answer this question.

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