让 \foreach 重新启动或循环

让 \foreach 重新启动或循环

我理解尝试使用类似“循环函数”\foreach 环形听起来像是一个悖论,但我会试着解释一下我的意思。最近,我问了一个关于自动创建时间轴中的小时数,以使它们增加,即,,00:00等等。01:0002: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);
        }

相关内容