使用以下代码编译时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 解析第一个参数,然后在pt
s 中返回其结果。
编辑:我正在使用 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}