TikZ/PGF:使用宏时编译挂起

TikZ/PGF:使用宏时编译挂起

使用以下代码编译时pdflatex

\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{fpu}
\begin{document}
\begin{tikzpicture}
\def\dim#1{
    \pgfkeys{/pgf/fpu=true,/pgf/fpu/output format=fixed}
    \pgfmathparse{#1}
    \pgfmathresult pt
    \pgfkeys{/pgf/fpu=false}
}
\draw ( 0, \dim{10in + 1in} ) circle (1in);
\end{tikzpicture}
\end{document}

编译在以下几行处挂起:

[...]
[Loading MPS to PDF converter (version 2006.09.02).]
) (/usr/share/texmf-dist/tex/generic/oberdiek/pdftexcmds.sty)
(/usr/share/texmf-dist/tex/latex/oberdiek/epstopdf-base.sty
(/usr/share/texmf-dist/tex/latex/oberdiek/grfext.sty
(/usr/share/texmf-dist/tex/generic/oberdiek/kvdefinekeys.sty))
(/usr/share/texmf-dist/tex/latex/oberdiek/kvoptions.sty
(/usr/share/texmf-dist/tex/generic/oberdiek/kvsetkeys.sty
(/usr/share/texmf-dist/tex/generic/oberdiek/etexcmds.sty)))
(/usr/share/texmf-dist/tex/latex/latexconfig/epstopdf-sys.cfg))

问题到底出在哪里?为什么编译会挂起?

基本上,我想要一个 TeX 宏,它使用 PGF 的 FPU 解析第一个参数,然后在pts 中返回其结果。

编辑:我正在使用 texlive 20120701 和 PGF 2.10


我注意到这个问题与宏完全无关。以下代码以同样的方式失败:

\draw ( 0,
    \pgfkeys{/pgf/fpu=true,/pgf/fpu/output format=fixed}
    \pgfmathparse{sqrt(pow(10in, 2) + pow(12in, 2))}
    \pgfmathresult pt
    \pgfkeys{/pgf/fpu=false}
) circle (1in);

答案1

您不能直接将任何旧命令放入tikz坐标系中,因为每个x, y(o z) 组件都使用 进行扩展\edef。您可以尝试定义一个特殊的坐标系(请注意,在下面的示例中,无单位维度将被解释为点)。

\documentclass[tikz,border=5]{standalone}
\usetikzlibrary{fpu}
\tikzset{fpu cs/.cd, x/.initial=0, y/.initial=0}

\tikzdeclarecoordinatesystem{fpu}{%
\tikzset{fpu cs/.cd,#1}%
  \pgfkeys{/pgf/fpu=true,/pgf/fpu/output format=fixed}%
  \pgfmathparse{\pgfkeysvalueof{/tikz/fpu cs/x}}%
  \let\tmpx=\pgfmathresult%
  \pgfmathparse{\pgfkeysvalueof{/tikz/fpu cs/y}}%
  \let\tmpy=\pgfmathresult%
  \pgfpoint{+\tmpx pt}{+\tmpy pt}%
}

\begin{document}
\begin{tikzpicture}
\draw (fpu cs:x=0, y={sqrt(pow(10in, 2) + pow(12in, 2))}) circle [radius=1in];
\end{tikzpicture}

\end{document}

显示输出没什么意义,因为它只是一个圆圈。当然,你可以添加fpu选项tikzpicture

答案2

我不知道下一个代码是否有用,但在这种情况下有效

\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{fpu}
\begin{document}
\begin{tikzpicture}
\newcommand\mydim[2]{
    \pgfkeys{/pgf/fpu=true,/pgf/fpu/output format=fixed}
    \pgfmathsetlengthmacro{#1}{#2}
    \pgfkeys{/pgf/fpu=false}
}

\draw ( 0, {(10in + 1in)} ) circle (1in);

\mydim{\test}{sqrt(pow(10in,2)+pow(12in,2))}
\draw ( 0, \test ) circle (1in);

\end{tikzpicture}
\end{document}

相关内容