如何用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
被浏览
170
3 个回答
Eureka
Eureka 5天前
这家伙很懒,什么也没写!

使用 LaTeX 自带的 picture 环境 + LaTeX 3 手搓了一个, 没有使用其它的任何宏包. 且带圈数字的大小会根据当前文档的字体大小自动调整.

\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage{lipsum}
\usepackage{xcolor}

\ExplSyntaxOn\makeatletter
\NewDocumentCommand{\circlenum}{O{black}m}
  {
    \__circle_num:nn {#1}{#2}
  }

%%%%%    box typesetting config   %%%%%
\fp_const:Nn \c__circle_num_scale_fp { .85 }
\dim_const:Nn \c_circle_num_wd_dim { \f@size pt }
\dim_const:Nn \c__circle_num_typeset_box_dp { 1.6pt }
%%%%%    box typesetting config   %%%%%
\box_new:N \l__circle_num_box
\box_new:N \l__circle_num_typeset_box
\cs_set_protected:Npn \__circle_num:nn #1#2
  {
    % scale number
    \hbox_set:Nn \l__circle_num_box { #2 }
    \fp_set:Nn \l_tmpa_fp
      {
        \dim_ratio:nn
          { \fp_use:N \c__circle_num_scale_fp\c_circle_num_wd_dim }
          { \box_wd:N \l__circle_num_box }
      }
    \box_scale:Nnn \l__circle_num_box
      {
        \fp_min:nn {\fp_use:N \l_tmpa_fp}{1}
      }{ 1 }
    % typeset cirle num
    \exp_args:Nne \__circle_num_typeset:nnN
      { \c_circle_num_wd_dim }
      { #1 }
      \l__circle_num_box
  }
\cs_new:Npn \__circle_num_typeset:nnN #1#2#3
  {% #1:radius(float); #2:style; #3:content
    \hbox_set:Nw \l__circle_num_typeset_box
    \begin{picture}(0pt, 0pt)(\dim_eval:n {-\c_circle_num_wd_dim/2}, 0pt)
      \put(0, \dim_to_decimal:n {\dim_eval:n {#1/2 - \c__circle_num_typeset_box_dp}}) 
        { \color{#2}\circle{#1} }
      \put(0, 0) { \clap{\box_use_drop:N #3} }
    \end{picture}
    \hbox_set_end:
    \box_set_wd:Nn \l__circle_num_typeset_box 
      { \dim_use:N \c_circle_num_wd_dim }
    \box_set_ht:Nn \l__circle_num_typeset_box
      { 
        \dim_eval:n { \c_circle_num_wd_dim
          - \c__circle_num_typeset_box_dp }
      }
    \box_set_dp:Nn \l__circle_num_typeset_box 
      { \dim_use:N \c__circle_num_typeset_box_dp }
    \box_use_drop:N \l__circle_num_typeset_box
  }
\makeatother\ExplSyntaxOff


\begin{document}
\lipsum[1][1-2]

XXX, \kern2.3pt\relax1| 11| 111| 999| 9999| ZZZ

\def\vbar{\makebox[0pt]{|}}
\fboxsep0pt\relax
XXX, \fbox{\circlenum[blue]{11}}, \fbox{HxM}

XXX, \circlenum[red]{1}|\circlenum[blue]{11}|\circlenum[teal]{111}|%
\circlenum{\color{gray}999}|\circlenum[red]{\color{purple}9999}|\circlenum[yellow]{XXVII} ZZZ
\end{document}

如果用户需要自定义样式, 可以更改下面的配置:

%%%%%    box typesetting config   %%%%%
\fp_const:Nn \c__circle_num_scale_fp { .85 }
\dim_const:Nn \c_circle_num_wd_dim { \f@size pt }
\dim_const:Nn \c__circle_num_typeset_box_dp { 1.6pt }
%%%%%    box typesetting config   %%%%%

输出结果:
image.png

Sagittarius Rover
这家伙很懒,什么也没写!

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

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

shadow
shadow 5天前
这个人懒得不得了,竟然啥也没写

给个简单方法,对0-99,更大数字同理:

\documentclass[border=5pt,tikz]{standalone}

\begin{document}
\begin{tikzpicture}[x=0.53cm, y=0.53cm, nodes={draw,circle,minimum size=5mm,inner sep=0pt}]
  \foreach \x in {0,1,...,9}
  {%
    \node[font=\Large] at(\x,0){\x};
    \foreach \y in {1,...,9}
    {\node at(\x,\y){\y\x};}
  }
\end{tikzpicture}
\end{document}

image.png

撰写答案

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

发布
问题

分享
好友

手机
浏览

扫码手机浏览