当我构建以下代码时
\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 page
与remember 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}