У меня есть набор стилей tikz, которые я использую для нескольких tikzpicture
s в моем документе. Эти стили находятся в 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}