我理解尝试使用类似“循环函数”\foreach
环形听起来像是一个悖论,但我会试着解释一下我的意思。最近,我问了一个关于自动创建时间轴中的小时数,以使它们增加,即,,00:00
等等。01:00
02:00
我忘了提到一些事情,当我在玩选项时问题就出现了。现在作为参考,这是控制时间的代码部分:
\newcommand*{\MaxNumber}{17}%
\begin{document}
\begin{tikzpicture}
%draw horizontal line
\draw[|->, -latex] (0,0) -- (\MaxNumber,0);
\draw[-, dashed] (-1,0) -- (0,0);
%draw hours
\foreach \x in {0,...,\MaxNumber} {%
\draw (\x,0) node[below=7pt,anchor=east,xshift=0,rotate=45] {$\x\colon 00$};
\draw[] (\x,-0.1) -- (\x,0.1);
}
如果我将其设置\MaxNumber
为 23,则每小时将使用 24 小时制时钟绘制。
但是如果我将其设置为 50,显示的小时数不会从 00:00(即午夜)重新开始,而是会不断增加直到 50:00。但由于这是一条时间线,我希望\foreach
每次到达 23:00 时都重新启动,因为 24:00 和 00:00 是同一小时。
我尝试过调整它,并搜索过这个网站和互联网,但我还不是专家,不知道我能做些什么。我预计有很多方法可以做到这一点,所以我想知道,什么是最合适的方法?
答案1
一种方法是使用mod
函数并将 1 加到其中。
下面我将其设置为显示模 10 的值,以便于说明。您会看到它上升到 10,然后又从 1 开始。对于您的示例,您应该设置
\newcommand*{\ModValue}{24}
笔记:
正如 egreg 指出的那样,也许您希望将最后一个小时显示为
0:00
而不是24:00
。 如果是这样,您可以删除+1
:\pgfmathtruncatemacro{\ModValue}{mod(\x,\ModValue)+1}
David Carlisle 说他更喜欢用两位数来表示小时数,所以我采用了如何将一位数转换为两位数来做到这一点。如果不想这样,可以简单地删除对 的调用
\TwoDigits
,或者用 的定义替换\TwoDigits
:\newcommand{\TwoDigits}[1]{#1}
代码:
\documentclass{article}
\usepackage{tikz}
\newcommand{\TwoDigits}[1]{\ifnum#1<10 0#1\else #1\fi}
\newcommand*{\MaxNumber}{17}%
\newcommand*{\ModValue}{10}% Change this to 24 for your actual use case.
\begin{document}
\begin{tikzpicture}
%draw horizontal line
\draw[|->, -latex] (0,0) -- (\MaxNumber,0);
\draw[-, dashed] (-1,0) -- (0,0);
%draw hours
\foreach \x in {0,...,\MaxNumber} {%
\pgfmathtruncatemacro{\ModValue}{mod(\x,\ModValue)+1}
\draw (\x,0) node[below=7pt,anchor=east,xshift=0,rotate=45] {\TwoDigits{\ModValue}:00};
\draw[] (\x,-0.1) -- (\x,0.1);
}
\end{tikzpicture}
\end{document}
答案2
你只是想改变文本,而不是设置它的位置?比如
\foreach \x in {0,...,\MaxNumber} {%
\count0=\ifnum\x<24 \x\else\numexpr\x-24\fi\relax\relax
\draw (\x,0) node[below=7pt,anchor=east,xshift=0,rotate=45] {$\the\count0\colon 00$};
\draw[] (\x,-0.1) -- (\x,0.1);
}