![tikz 字体样式中的字体大小宏](https://linux22.com/image/328016/tikz%20%E5%AD%97%E4%BD%93%E6%A0%B7%E5%BC%8F%E4%B8%AD%E7%9A%84%E5%AD%97%E4%BD%93%E5%A4%A7%E5%B0%8F%E5%AE%8F.png)
我有一组 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}
节点样式.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] ...
行的控制序列均未定义。使用 egfont=\small\sffamily
可以正常工作,但显然我做错了什么。我该如何修复此问题?
我想会有很多实现我想要的功能的更好方法,并且很乐意接受替代方案作为答案 - 但我仍然想知道为什么上述方法不起作用。
答案1
在我看来,最大的错误是使用\input{...}
这种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}