我正在尝试使用 Tikz 和 animate 包创建几何图形的动画,其中我想逐帧排版线条之间的角度。我实际上可以做到这一点,但是当我想更改角度的字体大小时,我收到以下错误:
! TeX capacity exceeded, sorry [input stack size=5000].
\pgf@selectfontorig ->\pgf@selectfontorig
\nullfont
l.43 }
下面提供了描述该问题的 MWE。
梅威瑟:
\documentclass[a4paper,10pt]{standalone}
\usepackage[utf8]{inputenc}
\usepackage{tikz}
\usepackage{animate}
\usetikzlibrary{shapes.geometric, calc, positioning, decorations.text}
\newlength{\R}\setlength{\R}{6cm}
\def\hbb{-2cm}
\def\wbb{6cm}
\def\frate{10}
\begin{document}
\begin{animateinline}[poster=first, controls,autoplay, width=\textwidth, keepaspectratio, begin={\begin{tikzpicture} \useasboundingbox (\hbb,\hbb) rectangle (\wbb,\wbb);}, end={\end{tikzpicture}}]{\frate}
\newframe[\frate]
\begin{tikzpicture}
\useasboundingbox (\hbb,\hbb) rectangle (\wbb,\wbb);
\node [circle, fill=none, draw=black, minimum size=\R, thick] (BaseCircle) {};
\node [circle, fill=none, draw=black, minimum size=0.25\R, thick] (Hole) {};
\end{tikzpicture}
\multiframe{4}{n=1+1}{
\begin{tikzpicture}
\useasboundingbox (\hbb,\hbb) rectangle (\wbb,\wbb);
\node [circle, fill=none, draw=black, minimum size=\R, thick] (BaseCircle) {};
\node [circle, fill=none, draw=black, minimum size=0.25\R, thick] (Hole) {};
\foreach \j in {1,...,\n}{
\pgfmathsetmacro\startangle{30*\j}
\pgfmathsetmacro\endangle{\startangle + 30}
\draw [draw=blue, -latex, postaction={decorate},decoration={text along path, text color=blue, text={{}|{\small}|{$\theta/n$} {}}, text align=center, raise=3pt}] +(\startangle:0.2\R) arc [start angle=\startangle, end angle=\endangle, radius=0.2\R] {};
}
\end{tikzpicture}
}
\end{animateinline}
\end{document}
因此,只要我删除\small
代码中的宏,动画就会按预期工作,但事实证明路径上的文本对我来说太大了。我也尝试过\fontsize{6}{6}\selectfont
减小字体大小,但到目前为止没有成功。
我还认为这可能是 tikz 装饰库的问题,因此我采用了老式的方法,并定义了一个以倾斜方式包含文本的节点,使用如下方法:
\draw [draw=blue, -latex] +(\startangle:0.2\R) arc [start angle=\startangle, end angle=\endangle, radius=0.2\R] node [pos =0.5, sloped, above] {\small Test} ;
但我得到了同样的错误。我不得不说这实际上是有效的,并且文档在没有 animateinline 环境的情况下编译时没有任何错误。
更新1:
这个问题与编译器无关。我已经用 PDFLaTeX、XeLaTeX 和 LuaLaTeX 测试了 MWE。但错误仍然相同。
无论如何,该文档根本没有生成。
更新2:
按照文档 (第 10 节) 中 animate 包的建议,增加内存和堆栈输入大小,也无法解决问题。由于我使用的是 Linux,因此建议执行以下操作:
- 在终端的 shell 提示符下通过 kpsewhich texmf.cnf 找到配置文件“texmf.cnf”。
- 以 Root 身份,在您最喜欢的文本编辑器中打开该文件,滚动到“main_memory”条目并将其更改为上面给出的值;保存并退出。
- 通过以下方式重建格式
fmtutil-sys --byfmt latex
fmtutil-sys --byfmt pdflatex
fmtutil-sys --byfmt xelatex
我必须补充一点,我必须以 root 身份运行 fmutil-sys 命令,否则它不会成功。我不知道这是否是导致问题的可能原因。
更新3:
当将堆栈大小增加到 500000 时,错误略有不同,变为:
! TeX capacity exceeded, sorry [input stack size=30000].
\pgf@selectfontorig ->\pgf@selectfontorig
\nullfont
l.43 }
因此,[input stack size=30000]
而不是[input stack size=5000]
。
更新4
我尝试改变分数分母和分子之间的间距(角度),按照这里给出的答案:分母上的横线和水平线之间的距离太小
我定义了一个自定义分数,有趣的是,出现了类似的错误。似乎某种字体修改是不允许的。
有什么建议吗?我在这里做错了什么?
最好的,
C。
答案1
编辑:
在进一步研究 Ti 中的例子后钾Z & PGF 手册,第 660-661 页的示例我成功地在decorate
环境中定义了不同的字体大小,就像在动画代码和文档的其余部分一样。因此,请尝试以下 MWE,与您的 MWE 相比,它有以下变化:
decoration
定义为tikzpicture
循环中的选项,而不是路径的选项- 而是使用
decoration
text along path
text effects along path
- 循环内路径的选项定义为
\path [postaction={decorate}, % <--- changed
text effects={text along path, font=\scriptsize}] % <--- new
(\startangle:\R/2) arc (\startangle:\endangle:\R/2);
完整的 MWE 是:
\documentclass[border=3.141592mm]{standalone}
\usepackage{tikz}
\usepackage{animate}
\usetikzlibrary{decorations.text}
\tikzset{
C/.style = {circle, draw, thick, minimum size=#1},
}
\newlength{\R}\setlength{\R}{2cm}
\def\hbb{4cm}
\def\wbb{3.2cm}
\def\frate{10}
\begin{document}
\begin{animateinline}[poster=first, controls, autoplay,
]{\frate}
\multiframe{12}{n=1+1}%
{
\begin{tikzpicture}[
decoration={text effects along path, reverse path,
text={~{$\theta_{\i}$}~},
text align=center,
raise=3pt
}
]
\useasboundingbox (-\wbb,-\hbb) rectangle (\wbb,\hbb);
%
\node [C=3\R] (BaseCircle) {};
\node [C= \R] (Hole) {};
\foreach \i in {1,...,\n}
{
\pgfmathsetmacro\startangle{30*(\i-1)}
\pgfmathsetmacro\endangle{\startangle + 30}
%
\path [postaction={decorate},
text effects={text along path, font=\scriptsize}]
(\startangle:\R/2) arc (\startangle:\endangle:\R/2);
}
\end{tikzpicture}
}
\end{animateinline}
$\theta_{12}$
\end{document}
编译它(使用最新版本的 MiKTEX 包)得到:
为了进行比较,在动画边界框的右上角添加了 $\theta_{11}$,在文档的右下角添加了 $\theta_{12}$。两者都具有正常的字体大小。
编辑: 如果您喜欢标记角度范围,那么您只需要更改循环中的路径选项:
\draw [<->, thin, blue, % <--- new
postaction={decorate}, % <--- changed
text effects={text along path, font=\scriptsize}] % <--- new
(\startangle:0.6\R) arc (\startangle:\endangle:0.6\R);
答案2
因此,从技术上讲,这并没有改变文本的字体大小,而且也没有回答原始问题。
在这种情况下,对节点应用缩放会产生与减小文本字体大小相同的效果。这实际上对沿路径的文本无效,因此我认为这是一种“可接受的”解决方法。
\draw [draw=blue, -latex] +(\startangle:0.2\R) arc [start angle=\startangle, end angle=\endangle, radius=0.2\R] node [pos =0.5, sloped, above, scale=0.65, text=blue] {$\dfrac{\theta}{n}$} ;
由于尚未提供其他答案,因此我不会将其标记为已接受的答案。