Макрос размера шрифта в стиле шрифта tikz

Макрос размера шрифта в стиле шрифта tikz

У меня есть набор стилей tikz, которые я использую для нескольких tikzpictures в моем документе. Эти стили находятся в nodestyle.tex. Я могу по желанию изменить размер в этих стилях, выполнив \newcommand{\trnodesize}{1em}до \input{nodestyles}. Я хочу сделать то же самое для размера шрифта, но не могу заставить это работать (см. ниже).

документ.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

Раскомментирование font=\trnodefontsize\sffamilyстроки приводит к неопределенным управляющим последовательностям в обеих \node [inner] ...строках. Использование eg font=\small\sffamilyработает отлично, но я явно делаю что-то не так. Как это исправить?

Я думаю, что будетмноголучшие способы достижения нужной мне функциональности и я с радостью приму альтернативные варианты в качестве ответов, но мне все равно хотелось бы знать, почему вышеизложенное не работает.

решение1

На мой взгляд, большой ошибкой является использование \input{...}with tikzpictureпри такой настройке.

Можно загрузить общее nodestyle.texв преамбулу и делать \renewcommandопределения для \trnodesizeи \trnodefontsizeвнутри tikzpicture. Такие переопределения происходят внутри группы и ненетизменить внешние настройки.

Установка \trnodesizeне приводит к изменению, mnodesizeесли не \setlengthиспользуется. Поскольку длины используются в регистрах, изменение длины внутри группы не просачивается за пределы группы!

\providecommandНастройки игнорируются, если команда уже определена.

\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

Чтобы переопределения вступили в силу, используйте \setupmytikzкоманду:

\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}

введите описание изображения здесь

Связанный контент