在动画中使用 tikz 更改路径上文本的字体大小,导致 TeX 容量超出错误

在动画中使用 tikz 更改路径上文本的字体大小,导致 TeX 容量超出错误

我正在尝试使用 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,因此建议执行以下操作:

  1. 在终端的 shell 提示符下通过 kpsewhich texmf.cnf 找到配置文件“texmf.cnf”。
  1. 以 Root 身份,在您最喜欢的文本编辑器中打开该文件,滚动到“main_memory”条目并将其更改为上面给出的值;保存并退出。
  1. 通过以下方式重建格式

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循环中的选项,而不是路径的选项
  • 而是使用decorationtext along pathtext 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}$} ;

由于尚未提供其他答案,因此我不会将其标记为已接受的答案。

相关内容