Eu tenho um conjunto de estilos tikz que uso para vários tikzpicture
arquivos no meu documento. Esses estilos estão em nodestyle.tex
. Opcionalmente, posso modificar o tamanho desses estilos fazendo \newcommand{\trnodesize}{1em}
before \input{nodestyles}
. Quero fazer o mesmo com o tamanho da fonte, mas não consigo fazer funcionar (veja abaixo).
documento.tex:
\documentclass{article}
\usepackage{tikz}
% For use in nodestyle.tex
\newlength{\mnodesize}
\begin{document}
% Default node styling.
\begin{tikzpicture}
\input{nodestyle}
\node [inner] at (0, 0) {1};
\end{tikzpicture}
% Smaller nodes (and text).
\begin{tikzpicture}
\newcommand{\trnodesize}{1em}
% This currently has no effect:
\newcommand{\trnodefontsize}{\tiny}
\input{nodestyle}
\node [inner] at (0, 0) {2};
\end{tikzpicture}
\end{document}
nodestyle.tex:
% Want a default value; most of the time 1.5em is ideal.
\providecommand{\trnodesize}{1.5em}
\setlength{\mnodesize}{\trnodesize}
% Again, usually \normalsize is fine.
\providecommand{\trnodefontsize}{\normalsize}
\tikzset{
inner/.style = {
align=center,
inner sep=0pt,
white,
solid,
fill=red,
text centered,
text width=\mnodesize,
minimum height=\mnodesize,
font=\sffamily,
% Doesn't work:
% font=\trnodefontsize\sffamily,
},
}
% So the next \newcommand{\trnodesize}{...} and
% \newcommand{\trnodefontsize}{...} will work.
\let\trnodesize\undefined
\let\trnodefontsize\undefined
Remover o comentário da font=\trnodefontsize\sffamily
linha resulta em sequências de controle indefinidas em ambas \node [inner] ...
as linhas. Usar, por exemplo, font=\small\sffamily
funciona bem, mas claramente estou fazendo algo errado. Como posso consertar isso?
Imagino que haverámuitomelhores maneiras de alcançar o tipo de funcionalidade que procuro e aceitarei alegremente alternativas como respostas - mas ainda gostaria de saber por que o procedimento acima não funciona.
Responder1
No meu ponto de vista o grande erro é usar \input{...}
with tikzpicture
com esta configuração.
Não há problema em carregar o general nodestyle.tex
no preâmbulo e fazer as \renewcommand
definições for \trnodesize
e \trnodefontsize
inside tikzpicture
. Tais redefinições ocorrem dentro de um grupo e nãonãoalterar configurações externas.
A configuração de \trnodesize
não leva à alteração de mnodesize
a menos que \setlength
seja usado. Como comprimentos são usados em registros, uma mudança de comprimento dentro de um grupo não vaza para fora do grupo!
\providecommand
as configurações serão ignoradas se o comando já estiver definido.
\providecommand{\trnodesize}{1.5em}
\setlength{\mnodesize}{\trnodesize}
% Again, usually \normalsize is fine.
\providecommand{\trnodefontsize}{\normalsize}
\tikzset{
inner/.style = {
align=center,
inner sep=0pt,
white,
solid,
fill=red,
text centered,
text width=\mnodesize,
minimum height=\mnodesize,
font=\sffamily,
% Doesn't work:
font={\trnodefontsize\ttfamily},
},
}
% So the next \newcommand{\trnodesize}{...} and
% \newcommand{\trnodefontsize}{...} will work.
%\let\trnodesize\undefined
%\let\trnodefontsize\undefined
Para tornar as redefinições efetivas, use um \setupmytikz
comando:
\documentclass{article}
\usepackage{tikz}
% For use in nodestyle.tex
\newlength{\mnodesize}
\input{nodestyle}
\newcommand{\setupmytikz}[2]{%
\renewcommand{\trnodesize}{#1}%
\setlength{\mnodesize}{\trnodesize}%
\renewcommand{\trnodefontsize}{#2}%
}
\begin{document}
% Default node styling.
\begin{tikzpicture}
\node [inner] at (0, 0) {1};
\end{tikzpicture}
% Smaller nodes (and text).
\begin{tikzpicture}
\setupmytikz{1em}{\tiny}
\node [inner] at (0, 0) {2};
\end{tikzpicture}
\begin{tikzpicture}
\node [inner] at (0, 0) {1};
\end{tikzpicture}
\end{document}