如何用foreach简化这个循环?

发布于 2025-08-22 01:32:11

image.png
相关链接:

  1. 问题1
  2. 问题2
  3. 问题3
\documentclass[tikz,border=2pt]{standalone}
\usepackage{ctex}
\usepackage{graphicx}
\usepackage{circledtext}
\begin{document}
\tikz{
    \foreach \x in {0,...,9} {
        \node 
            at (\x,0)
            [scale=2.75] 
            {\circledtext{\x}};
    }
    \foreach \x in {10,...,19} {
        \node 
            at (\x-10,1)
            [scale=2.75] 
            {\circledtext{\scalebox{1.25}[2]{\x}}};
    }
    \foreach \x in {20,...,29} {
        \node 
            at (\x-20,2)
            [scale=2.75] 
            {\circledtext{\scalebox{1.25}[2]{\x}}};
    }
    \foreach \x in {30,...,39} {
        \node 
            at (\x-30,3)
            [scale=2.75] 
            {\circledtext{\scalebox{1.25}[2]{\x}}};
    }
    \foreach \x in {40,...,49} {
        \node 
            at (\x-40,4)
            [scale=2.75] 
            {\circledtext{\scalebox{1.25}[2]{\x}}};
    }
    \foreach \x in {50,...,59} {
        \node 
            at (\x-50,5)
            [scale=2.75] 
            {\circledtext{\scalebox{1.25}[2]{\x}}};
    }
    \foreach \x in {60,...,69} {
        \node 
            at (\x-60,6)
            [scale=2.75] 
            {\circledtext{\scalebox{1.25}[2]{\x}}};
    }
    \foreach \x in {70,...,79} {
        \node 
            at (\x-70,7)
            [scale=2.75] 
            {\circledtext{\scalebox{1.25}[2]{\x}}};
    }
    \foreach \x in {80,...,89} {
        \node 
            at (\x-80,8)
            [scale=2.75] 
            {\circledtext{\scalebox{1.25}[2]{\x}}};
    }
    \foreach \x in {90,...,99} {
        \node 
            at (\x-90,9)
            [scale=2.75] 
            {\circledtext{\scalebox{1.25}[2]{\x}}};
    }
}
\tikz{
    \foreach \x in {100,...,109} {
        \node 
            at (\x-100,10)
            [scale=2.75] 
            {\circledtext{\scalebox{1}[2]{\x}}};
    }
    \foreach \x in {110,...,119} {
        \node 
            at (\x-110,11)
            [scale=2.75] 
            {\circledtext{\scalebox{1}[2]{\x}}};
    }
    \foreach \x in {120,...,129} {
        \node 
            at (\x-120,12)
            [scale=2.75] 
            {\circledtext{\scalebox{1}[2]{\x}}};
    }
    \foreach \x in {130,...,139} {
        \node 
            at (\x-130,13)
            [scale=2.75] 
            {\circledtext{\scalebox{1}[2]{\x}}};
    }
    \foreach \x in {140,...,149} {
        \node 
            at (\x-140,14)
            [scale=2.75] 
            {\circledtext{\scalebox{1}[2]{\x}}};
    }
    \foreach \x in {150,...,159} {
        \node 
            at (\x-150,15)
            [scale=2.75] 
            {\circledtext{\scalebox{1}[2]{\x}}};
    }
    \foreach \x in {160,...,169} {
        \node 
            at (\x-160,16)
            [scale=2.75] 
            {\circledtext{\scalebox{1}[2]{\x}}};
    }
    \foreach \x in {170,...,179} {
        \node 
            at (\x-170,17)
            [scale=2.75] 
            {\circledtext{\scalebox{1}[2]{\x}}};
    }
    \foreach \x in {180,...,189} {
        \node 
            at (\x-180,18)
            [scale=2.75] 
            {\circledtext{\scalebox{1}[2]{\x}}};
    }
    \foreach \x in {190,...,199} {
        \node 
            at (\x-190,19)
            [scale=2.75] 
            {\circledtext{\scalebox{1}[2]{\x}}};
    }
}
\end{document}

查看更多

关注者
1
被浏览
78
1 个回答
Sagittarius Rover
Sagittarius Rover 20小时前
我要成为Typst糕手/(ㄒoㄒ)/~~

差不多就是小学生找规律问题((^_^))

07 -> (7,0)
23 -> (3,2)
152 -> (2,5)

使用取模和向下取整的函数即可,规律是显然的。

第一步:

先把「10-99」缩为一重循环;再把「100-199」也缩为一重循环即可

\documentclass[tikz,border=2pt]{standalone}
\usepackage{ctex}
\usepackage{circledtext}
\begin{document}
\tikz{
    \foreach \x in {0,...,9} {
        \node[scale=2.75]  at (\x,0) {\circledtext{\x}};
    }
    \foreach \x in {10,...,99}{%
        \pgfmathtruncatemacro{\xx}{mod(\x,10)}
        \pgfmathtruncatemacro{\yy}{floor(\x/10)}
        \node[scale=2.75] at (\xx,\yy) {\circledtext{\scalebox{1.25}[2]{\x}}};
    }%
}
\tikz{
    \foreach \x in {100,...,199}{%
        \pgfmathtruncatemacro{\xx}{mod(\x-100,10)}
        \pgfmathtruncatemacro{\yy}{floor((\x-100)/10)}
        \node[scale=2.75] at (\xx,\yy) {\circledtext{\scalebox{1}[2]{\x}}};
    }%
}
\end{document}

第二步:

根据数字的位数使用一个分支判断。这样可以把三个循环再缩为一个。

这里我不希望把0-199的数字拆分为两个tikzpicture,所以我稍微修改了一下逻辑和目标效果。

\documentclass[tikz,border=2pt]{standalone}
\usepackage{ctex}
\usepackage{circledtext}
\begin{document}
\tikz{
    \foreach \x in {0,...,299} {
        \pgfmathtruncatemacro{\xx}{mod(\x,10)}
        \pgfmathtruncatemacro{\yy}{floor(\x/10)}
        \ifnum\yy<1\relax
           \def\content{\x}
        \else%
            \ifnum\yy<10\relax
               \def\content{\scalebox{1.25}[2]{\x}}
            \else
               \def\content{\scalebox{1}[2]{\x}}
            \fi
        \fi
        \node[scale=2.75] at (\xx,\yy) {\circledtext{\content}};
    }%
}
\end{document}

image.png

撰写答案

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

发布
问题

分享
好友

手机
浏览

扫码手机浏览