4

The tikzpicture environment allows to define styles in square brackets that are available within the picture. I would like to share the styles between multiple pictures to edit them in a single place. I know that this is possible with global variables, but I'd like to avoid making the styles available to all pictures. Is there a way to selectively include styles only into the picture environments where I want to use them?

  • 1
    What about newcommands? – koleygr Sep 1 '18 at 19:09
6

You can define a style that 'installs' more styles. For example, in the following MWE I define a style b that is globally available, that in turn installs/sets style c to be available. Similarly, I defined a style a that is globally available, but is overwritten by b. And finally, I defined a style e that only adjusts style a, without completely redefining it.

\documentclass{article}

\usepackage{tikz}

\tikzset{
    a/.style={ % 'a' is globally available 
        draw=green,
        line width=2pt,
        dashed,
    },
    b/.style={ % 'b' installs 'c' and overwrites 'a'
        c/.style={
            draw=red,
            fill=blue,
            text=white,
        },
        a/.style={
            draw=blue,
            line width=1pt,
        },
    },
    e/.style={ % The 'e' style will only change 'a' a bit, but will not overwrite
        a/.append style={
            fill=gray,
        }
    }
}

\begin{document}
    \begin{tikzpicture}
        \node[a] {Text}; % 'a' is globally available
    \end{tikzpicture}

    \begin{tikzpicture}[b]
        \node[a] {Text}; % Having called 'b', 'a' is redefined
        \node[c] at (1,0) {Text}; % And 'c' is available only in this picture
    \end{tikzpicture}

    \begin{tikzpicture}
        \node[a] {Text};
        %\node[c] at (2,0) {Text}; % This will not compile, 'c' is unknown here
        \begin{scope}[b]
            \node[a] at (1,0) {Text}; % In this scope, 'a' is redefined by 'b'
            \node[c] at (2,0) {Text}; % Again 'c' is available due to 'b'
        \end{scope}
    \end{tikzpicture}

    \begin{tikzpicture}[b,e]
        \node[a] {Text}; % Now 'a' is not completely redefined, but is changed due to 'e'
    \end{tikzpicture}
\end{document}

The code above results in:

enter image description here

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.