Configurando estilos no tikzset

Configurando estilos no tikzset

Estou enfrentando vários problemas ao tentar criar uma imagem como tikzsete carregá-la com diferentes variáveis.

O tikzset inclui estilos para:

  1. partes da imagem tikz (no exemplo, os nós) e
  2. partes que podem ser adicionadas (no exemplo o caminho)

Enquanto isso, as imagens devem ser dimensionadas de forma diferente, o que parece ser um problema com meu código atual

\documentclass{article}
\usepackage{tikz,pgfplots} 
\pgfplotsset{compat=1.16}  % 
\usetikzlibrary{positioning}

\begin{document}

\tikzset{
    pics/withscope/.style n args={2}{
        code = { %
            scale=#1,
            mypathstyle/.style={line width=#2mm, ->}, 
            \begin{scope}
                [scale=#1,  
                %mypathstyle/.style would only work here if path inside scope
                every node/.append style={transform shape},
                nodestyle/.style={circle,draw=black,fill=white,thick, font=\bfseries}]
                %nodes 
                \node(1) [nodestyle] {$1$};
                \node(2) [right=of 1] [nodestyle] {$2$};
            \end{scope}
        } %code
    }, % style
    pics/withscope/.default={1}{2}
} %tikzset  


\tikzset{
    pics/thisisscopeless/.style n args={1}{
        code = { %
            %Those wont do anything
            mypathstyle/.style={line width=#1mm, ->}, 
            every node/.append style={transform shape},
            nodestyle/.style wont work

            \node(1) [circle,draw=black,fill=white,thick, font=\bfseries] {$1$};
            \node(2) [right=of 1] [circle,draw=black,fill=white,thick, font=\bfseries] {$2$};
        } %code
    }, % style
    pics/thisisscopeless/.default={1}
} %tikzset


Loading without parameter works\\[2cm]
\begin{tikzpicture}
    \pic {withscope};
\end{tikzpicture} \\

putting everything in tikzpicture works\\

\begin{tikzpicture} [scale=1.5, 
    every node/.append style={transform shape},
    nodestyle/.style={circle,draw=black,fill=white,thick, font=\bfseries},
    mypathstyle/.style={line width=0.2mm, ->}] 
    \node(1) [nodestyle] {$1$};
    \node(2) [right=of 1] [nodestyle] {$2$};
    %path   
    \draw [mypathstyle] (1) -- (2) node[pos=0.5,above] {2};
\end{tikzpicture} \\

scale doesnt work with scope \\

\begin{tikzpicture}[scale=2,mypathstyle/.style={line width=0.5mm, ->}]
    \pic {withscope};
    %   %path   
    \draw [mypathstyle] (1) -- (2) node[pos=0.5,above]  {3};
\end{tikzpicture}   


without scope it works   \\

\begin{tikzpicture}[scale=2,
    every node/.append style={transform shape},
    mypathstyle/.style={line width=0.5mm, ->}]
    \pic {thisisscopeless};
    \draw [mypathstyle] (1) -- (2) node[pos=0.5,above]  {4};
\end{tikzpicture}   

with scope the scale in tkzpicture wont work. You can hand scale through tikzset, but this isnt great\\

\begin{tikzpicture}[scale=3,mypathstyle/.style={line width=0.5mm, ->}]
    \pic {withscope={3,8}};
    %   %path   
    \draw [mypathstyle] (1) -- (2) node[pos=0.5,above]  {5};
\end{tikzpicture}


without mypathstyle in tikzpicture gives an error as "mypathstyle" is unknown\\

\begin{tikzpicture}%[mypathstyle/.style={line width=0.5mm, ->}]
    \pic {withscope={4,8}};
    %   %path   
    \draw [mypathstyle] (1) -- (2) node[pos=0.5,above]  {6};
\end{tikzpicture}   


\end{document}

Meus problemas são: Se eu usar scopeo estilo funciona, mas scalenão funciona. Se eu não usar scopeos estilos não funcionarão, mas scalefuncionam. Em ambos os cenários, definir um estilo para algo fora do tikzset, mas dentro do tikzset, tikzpicturenão funcionará.

Tenho quase certeza de que o problema da última parte está em algum lugar na chave dos estilos que defino, mas não consigo descobrir como chamá-lo corretamente. Alguém tem uma idéia de como criar um tikzset que defina estilos para o tikzpicture em que é chamado e também tenha conteúdo que seja escalonável através do ambiente tikzpicture?

Muito obrigado

Responder1

Existem dois problemas:

  1. se você disser code={...}, ...tem que haver algum código, não algo como key=blabla. Vocêpodedefina chaves usando \tikzset, por exemplo, .
  2. Se tiver n args=2, os dois argumentos devem ser passados ​​para a picvia \pic {withscope={3}{8}};e não\pic {withscope={3,8}};

Levando isso em consideração, o MWE passa a ser

\documentclass{article}
\usepackage{tikz,pgfplots} 
\pgfplotsset{compat=1.16}  % 
\usetikzlibrary{positioning}

\begin{document}

\tikzset{
    pics/withscope/.style n args={2}{
        code = { %scale=#1,
            %mypathstyle/.style={line width=#2mm, ->}, 

            \begin{scope}
                [scale=#1,  
                %mypathstyle/.style would only work here if path inside scope
                every node/.append style={transform shape},
                nodestyle/.style={circle,draw=black,fill=white,thick, font=\bfseries}]
                %nodes 
                \node(1) [nodestyle] {$1$};
                \node(2) [right=of 1] [nodestyle] {$2$};
            \end{scope}
        } %code
    }, % style
    pics/withscope/.default={1}{2}
} %tikzset  


\tikzset{
    pics/thisisscopeless/.style n args={1}{
        code = { %

            \tikzset{mypathstyle/.style={line width=#1mm, ->}, 
            every node/.append style={transform shape},}
            %nodestyle/.style wont work

            \node(1) [circle,draw=black,fill=white,thick, font=\bfseries] {$1$};
            \node(2) [right=of 1] [circle,draw=black,fill=white,thick, font=\bfseries] {$2$};
        } %code
    }, % style
    pics/thisisscopeless/.default={1}
} %tikzset


Loading without parameter works\\[2cm]
\begin{tikzpicture}
    \pic {withscope};
\end{tikzpicture} 

putting everything in tikzpicture works

\begin{tikzpicture} [scale=1.5, 
    every node/.append style={transform shape},
    nodestyle/.style={circle,draw=black,fill=white,thick, font=\bfseries},
    mypathstyle/.style={line width=0.2mm, ->}] 
    \node(1) [nodestyle] {$1$};
    \node(2) [right=of 1] [nodestyle] {$2$};
    %path   
    \draw [mypathstyle] (1) -- (2) node[pos=0.5,above] {2};
\end{tikzpicture} 

scale doesn't work with scope \textbf{because the options are local}

\begin{tikzpicture}[scale=2,mypathstyle/.style={line width=0.5mm, ->}]
    \pic {withscope};
    %   %path   
    \draw [mypathstyle] (1) -- (2) node[pos=0.5,above]  {3};
\end{tikzpicture}   


without scope it works  

\begin{tikzpicture}[scale=2,
    every node/.append style={transform shape},
    mypathstyle/.style={line width=0.5mm, ->}]
    \pic {thisisscopeless};
    \draw [mypathstyle] (1) -- (2) node[pos=0.5,above]  {4};
\end{tikzpicture}   

with scope the scale in tkzpicture won't work. You can hand scale through
tikzset, but this isnt great.

\begin{tikzpicture}[scale=3,mypathstyle/.style={line width=0.5mm, ->}]
    \pic {withscope={3}{8}}; %corrected syntax for two arguments 
    %   %path   
    \draw [mypathstyle] (1) -- (2) node[pos=0.5,above]  {5};
\end{tikzpicture}


without mypathstyle in tikzpicture gives an error as "mypathstyle" is unknown\\

\begin{tikzpicture}%[mypathstyle/.style={line width=0.5mm, ->}]
    \pic {withscope={4}{8}};%corrected syntax for two arguments 
    %   %path   
    %\draw [mypathstyle] (1) -- (2) node[pos=0.5,above]  {6};
    % doesn't work because mypathstyle is defined in scope
\end{tikzpicture}   
\end{document}

insira a descrição da imagem aqui

informação relacionada