10 circledtext包中的带圈阿拉伯数字,如何缩放数字而仍保持正圆? 悬赏已过期

发布于 2025-08-15 11:59:53

微信图片_20250815115831.png

% !TeX program = xelatex
\documentclass[UTF8]{ctexart}
\usepackage[centering,scale=0.85,papersize={10.5cm,14.85cm},showframe]{geometry}
\usepackage{tikz}
\usepackage{circledtext}
\begin{document}
\circledtext{2}\circledtext{22}\circledtext{222}
\tikz{\node [scale=5] {\circledtext{2}\circledtext{22}\circledtext{222}}}
\end{document}

\circledtext{<arabic number>}这个命令给出了一个所谓具有“字符压缩”效果的带圈数字,但是我发现其实只有个位数字效果较好。因为个位数字本身只有一个字符,所占位置较小,而它的数字的缩放比例又较大,所以最终看起来就感觉个位数字在这个命令下比较饱满,圆圈内不会留下太多空白。

然而,当这个数字变成两(三、多)位数字时,例如\circledtext{22}\circledtext{222}就会显得数字很小,而圆圈内的空白较多,显得不够饱满,有点浪费圆圈内的版面。个人感觉,这个所谓“字符压缩”效果是将数字所在的矩形盒子内接于外部的圆圈,这样的结果就是看起来(在cmu字体下)数字具有了被压缩而变小的感觉。

为了使圆圈内的空白稍小、目视感觉“饱满”,我希望可以为内部的矩形盒子的高度和宽度提供缩放接口,具体来说就是阿拉伯数字(cmu字体):

  1. 可以在y轴方向上伸长一点,让数字字符拉高一点,
  2. 可以在x轴方向上,总宽度伸长一点,每一个数字字符(可以)变瘦一点,以上这是两位数字的情况,
  3. 当三(多)位数字时,在x轴方向上,每一个数字字符可以再变瘦一点,在y轴方向上,高度与两位数字的情况保持一致,
  4. 而外部的圆圈始终保持正圆,不要椭圆,且数字字符不应超出圆圈的边界。

考虑到几乎没人会排版一个1000以上的带圈数字,所以就不考虑四位以上的带圈数字的情况(可能处理方式类似,希望暴露接口)。要满足这些要求,应该如何实现?

查看更多

关注者
1
被浏览
173
2 个回答
Sagittarius Rover
Sagittarius Rover 2025-08-15
这家伙很懒,什么也没写!
可以在y轴方向上缩放一点,让数字字符拉高/低一点
可以在x轴方向上缩放一点,让数字字符拉宽/瘦一点,以上这是两位数字的情况
当三(多)位数字时,在x轴方向上,数字字符可以再瘦一点,在y轴方向上,与两位数字的情况保持一致

其中「三(多)位数字」要「在y轴方向上,与两位数字的情况保持一致」,这样「2」似乎就会被拉长得的又高又瘦(?)个人觉得略显奇怪...

没完全解决上面的需求

如果只是要调大小的话,也许可以用charshrink来改善「222文字太小」的问题:

image.png

\documentclass{ctexart}
\usepackage{tikz}
\usepackage{circledtext}
\newcommand*{\mysingle}[1]{\circledtext[charshrink=.8]{#1}}
\newcommand*{\mydouble}[1]{\circledtext[charshrink=.85]{#1}}
\newcommand*{\mytriple}[1]{\circledtext[charshrink=.92]{#1}}

\begin{document}
\circledtext{2}\circledtext{22}\circledtext{222}

\tikz{\node[scale=5] {\circledtext{2}\circledtext{22}\circledtext{222}};}

\mysingle{2}\mydouble{22}\mytriple{222}

\tikz{\node[scale=5] {\mysingle{2}\mydouble{22}\mytriple{222}};}

\end{document}

image.png

side-notes:

  • 不建议用pdflatex编译ctexart
  • 若使用xelua,则无需显式写出UTF8,早已是默认值

感谢@u19850 鱼老师...
可以考虑用下面的方式实现将三个命令封装为一个...

image.png

远方不远
远方不远 3天前
Hello, LuaLaTeX!

命令\circledtext{<arg>}中的<arg>可以是“普通”的未经处理的阿拉伯数字,也可以是经过处理的阿拉伯数字。
这样的话,就可以使用由\graphicx宏包提供的\scalebox{<h-scale>}[<v-scale>]{<arg>}命令作为命令\circledtext{<arg>}的参数——可能\scalebox命令是健壮的,所以无需保护而不报错。
总之,效果大概是这样:
image.png
image.png

\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}

撰写答案

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

发布
问题

分享
好友

手机
浏览

扫码手机浏览