不完整 \iffalse;行后所有文本均被忽略...使用 pgfmathparse 用新命令结果替换值时发生致命错误

不完整 \iffalse;行后所有文本均被忽略...使用 pgfmathparse 用新命令结果替换值时发生致命错误

当我构建以下代码时

\documentclass{article}

\newcommand{\halve}[1]{
    \pgfmathparse{int(#1 / 2))}
    \pgfmathresult
}
\usepackage{tikz}
\usepackage[paperwidth=100pt, paperheight=100pt, margin=0pt]{geometry}
\begin{document}
        \begin{tikzpicture}[x=1pt, y=1pt]
            \draw[xshift=\halve{100}, yshift=\halve{100}] node[anchor=north west, text width=40, align=justify] {
                Should have anchor in the middle};
        \end{tikzpicture}
\end{document}

我明白了不完整 \iffalse;行后的所有文本均被忽略...致命错误

您知道为什么会这样以及怎样解决吗?

如果我\halve{100}用 50 替换,一切就顺利了。

顺便问一下,有没有比这个 \pgfmathparse 后跟 \pgfmathresult 更轻的语法来进行计算?

答案1

虽然评论者已经给出了替代解决方案

  • 使用可扩展的 TeX 数学,即

    \newcommand*\halve[1]{\numexpr#1/2\relax}
    

    或者

  • LaTeX3(但几个月后并入了 LaTeX2)\inteval

还有一种 PGFkeys 方法:.evaluated处理程序

有了这个你就可以

xshift/.evaluated = 100/2
% or
yshift/.evaluated = int(100/2)

\newcommand*\halve[1]{int(#1/2)}

您可以使用

xshift/.evaluated = \halve{100}

但是,由于 TikZ 在 PGFmath 中投入了很多精力,所以最后一个甚至不需要:

xshift = int(100/2)
yshift = \halve{100}

与 的这个定义配合得很好\halve


但是,你对 TikZ 的使用无论如何都是错误的。所有坐标和变换都只与 TikZ 图片中的其他所有内容相关。移动没有任何作用,因为你的图片中没有其他内容。

在环境的最后tikzpicture,TikZ 将所有东西都装在一个密封的盒子里,返回那个框给 TeX。现在,这个框放在哪里由 TeX 掌控。(除了current pageremember picture和结合的特殊节点overlay。)

无论如何,在下面的代码中,有三种方法可以实现这一点,即使根本没有 TikZ。

代码

\documentclass{article}
\usepackage{tikz}
\usepackage[paperwidth=100pt, paperheight=100pt, margin=0pt]{geometry}
\begin{document}
\tikz[remember picture, overlay]
  \node [text width=40pt, align=justify] at (current page.center) {
    Should have anchor in the middle};

\pagebreak

\centering
\vspace*{\fill} % that's not TikZ's \fill!
\tikz
  \node [text width=40pt, align=justify] {
    Should have anchor in the middle};
\vspace{\fill}


\pagebreak

\centering
\vspace*{\fill}
\begin{minipage}{40pt}
    Should have anchor in the middle
\end{minipage}
\vspace{\fill}
\end{document}

相关内容