10 tikz 利用函数简化坐标表达式

发布于 2026-03-12 23:25:06

tikz 有办法简化这个 ({\ii+\jj*0.5},{-\jj*0.8}) 吗?

我试了 declare functiontikzmath 好像都不能解析坐标?

! Package tikz Error: Cannot parse this coordinate.

参考的 declare-function-for-tikzpicture

\documentclass[tikz,border=10pt]{standalone}
\begin{document}
\begin{tikzpicture}[
  declare function={
    labelpos(\x,\y) = ({\x+\y*0.5},{-\y*0.8});
}]
\foreach \ii in {0, 1, ..., 5}{
  \foreach \jj in {0, 1, ..., 4}{
    \node at labelpos(\x,\y) {$(\ii,\jj)$};
  }
}
\end{tikzpicture}
\end{document}

image.png

查看更多

关注者
0
被浏览
274
Sagittarius Rover
Sagittarius Rover 2026-03-12
这家伙很懒,什么也没写!

declare function看文档似乎只能允许一元的输出...

如果重复使用这个坐标就要写很多次了,虽然可以复制粘贴,但是不太优雅
image.png

我一般的做法是\pgfmathsetmacro:

\documentclass[tikz,border=10pt]{standalone}
\begin{document}
\begin{tikzpicture}
\foreach \ii in {0, 1, ..., 5}{
  \foreach \jj in {0, 1, ..., 4}{
    \pgfmathsetmacro{\x}{\ii+\jj*0.5}
    \pgfmathsetmacro{\y}{-\jj*0.8}
    \node at (\x,\y) {$(\ii,\jj)$};
  }
}
\end{tikzpicture}
\end{document}

或者\fpeval?

\documentclass[tikz,border=10pt]{standalone}
\begin{document}
\begin{tikzpicture}
\foreach \ii in {0, 1, ..., 5}{
  \foreach \jj in {0, 1, ..., 4}{
    \def\x{\fpeval{\ii+\jj*0.5}}
    \def\y{\fpeval{-\jj*0.8}}
    \node at (\x,\y) {$(\ii,\jj)$};
  }
}
\end{tikzpicture}
\end{document}
2 个回答
Aihua
Aihua 14小时前
这家伙很懒,什么也没写!
\documentclass[tikz,border=10pt]{standalone}
\begin{document}
\begin{tikzpicture}

\foreach \ii in {0,1,...,5} {
  \foreach \jj in {0,1,...,4} {
    \node at ({\ii+\jj*0.5}, {-\jj*0.8}) {$(\ii,\jj)$};
  }
}

\end{tikzpicture}
\end{document}

用最简单的方式,或者定义两个函数

\documentclass[tikz,border=10pt]{standalone}
\begin{document}
\begin{tikzpicture}[
    declare function={
        px(\i,\j) = \i + \j*0.5;   % x 坐标
        py(\i,\j) = -\j*0.8;       % y 坐标
    }
]
\foreach \i in {0,...,5}
  \foreach \j in {0,...,4}
    \node at (px(\i,\j), py(\i,\j)) {$(\i,\j)$};
\end{tikzpicture}
\end{document}

非要一次返回一对坐标,用command方式,但不推荐

\documentclass[tikz,border=10pt]{standalone}
\newcommand\labelpos[2]{#1+#2*0.5, -#2*0.8} % 👈 一次返回 x,y
\begin{document}
\begin{tikzpicture}
\foreach \i in {0,...,5}
  \foreach \j in {0,...,4}
    \node at (\labelpos{\i}{\j}) {$(\i,\j)$}; % 👈 完美可用
\end{tikzpicture}
\end{document}

撰写答案

请登录后再发布答案,点击登录

发布
问题

分享
好友

手机
浏览

扫码手机浏览