以下代码按预期工作。
\documentclass[tikz,margin=1em]{standalone}
\usetikzlibrary{math}
\begin{document}
\begin{tikzpicture}[scale=3]
\draw (0,0) circle [radius=1cm];
\foreach \a in {0,30,...,330}{
\draw (\a:1cm-1pt) -- (\a:1cm+1pt);
\tikzmath {
int \b;
if \a<90 then { \b = \a; } else {
if \a==90 then { \b = 0; } else {
if \a<270 then { \b = \a+180; } else {
if \a==270 then { \b = 0; } else {
if \a<360 then { \b = \a; };
};
};
};
};
};
\draw (\a:1cm+1pt) node[rotate=\b,anchor=west] {$\a^\circ$};
}
\end{tikzpicture}
\end{document}
这段代码是否可以扩展,以从条件语句中设置的变量中设置节点的锚值?类似于以下功能失调的代码。
...
\tikzmath {
int \b;
if \a<90 then { \b = \a; \c = west; } else {
if \a==90 then { \b = 0; \c = south; } else {
if \a<270 then { \b = \a+180; \c = east; } else {
if \a==270 then { \b = 0; \c = north; } else {
if \a<360 then { \b = \a; \c = west; };
};
};
};
};
};
\draw (\a:1cm+1pt) node[rotate=\b,anchor=\c] {$\a^\circ$};
...
显然数学库并不是为了处理这个问题。
当然,我可以直接分割循环,但是没有更直接的方法吗?
答案1
我不确定我是否正确理解了你的问题,但我的看法是:你可以将一个角度传递给键,anchor
以便在节点的边界上以该角度获取锚点。因此你只需要计算正确的角度。
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage{tikz}
\usepackage{siunitx}
\begin{document}
\begin{tikzpicture}[scale=3]
\draw (0,0) circle [radius=1cm];
\foreach \a in {0,30,...,330}{
\draw (\a:1cm-1pt) -- (\a:1cm+1pt);
\pgfmathsetmacro\anchr{
ifthenelse(
mod(\a, 90),
floor((floor(mod(floor(\a/90), 4)) - 1) / 2) * 180,
(2 + floor(mod(floor(\a/90), 4))) * 90
)
}
\pgfmathsetmacro\rottn{
ifthenelse(
mod(\a, 90),
\a + \anchr + 180,
0
)
}
\path (\a:1cm) node [anchor=\anchr, rotate=\rottn, outer sep=1ex] {\ang{\a}};
}
\end{tikzpicture}
\end{document}
然而,我发现下面的做法更令人愉快(并且更容易做到)。
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage{tikz}
\usepackage{siunitx}
\begin{document}
\begin{tikzpicture}[scale=3]
\draw (0,0) circle [radius=1cm];
\foreach \a in {0,30,...,330}{
\draw (\a:1cm-1pt) -- (\a:1cm+1pt);
\path (\a:1cm) node [anchor=\a+180, outer sep=1ex] {\ang{\a}};
}
\end{tikzpicture}
\end{document}