在SVG中生成数字圆圈 - 如何使文本居中

时间:2015-06-22 00:17:24

标签: bash svg text-alignment

我编写了一个脚本来生成SVG文件,以圆圈形式显示1个数字。这是在绘图应用程序中用作剪贴画。

这是脚本:

if [ ! -d circleNums ]
then
   mkdir circleNums
fi
rm circleNums/index.html
# Add this line for center guide <line x1="63" y1="0" x2="63" y2="128" style="stroke:rgb(255,127,64);stroke-width:2"/>
for I in {1..9}
do
   cat <<EOF > circleNums/$I.svg
<svg width='128' height='128' viewBox='0 0 128 128' xmlns='http://www.w3.org/2000/svg' version='1.1' >
<circle cx="64" cy="64" r="62" fill="rgb(0,100,0)" stroke="red" stroke-width="2"/>
<text x="35" y="95" font-family="sans-serif" font-size="90px" fill="white">$I</text>
</svg>
EOF
   echo "<img src=\"$I.svg\" >" >> circleNums/index.html
done
for I in {10..99}
do
   cat <<EOF > circleNums/$I.svg
<svg width='128' height='128' viewBox='0 0 128 128' xmlns='http://www.w3.org/2000/svg' version='1.1' >
<circle cx="64" cy="64" r="62" fill="rgb(0,100,0)" stroke="red" stroke-width="2"/>
<text x="15" y="95" font-family="sans-serif" font-size="90px" fill="white">$I</text>
</svg>
EOF
   echo "<img src=\"$I.svg\" >" >> circleNums/index.html
done
ls circleNums

输出示例,1.svg:

<svg width='128' height='128' viewBox='0 0 128 128' xmlns='http://www.w3.org/2000/svg' version='1.1' >
<circle cx="64" cy="64" r="62" fill="rgb(0,100,0)" stroke="red" stroke-width="2"/>
<text x="35" y="95" font-family="sans-serif" font-size="90px" fill="white">1</text>
</svg>

99.svg:

<svg width='128' height='128' viewBox='0 0 128 128' xmlns='http://www.w3.org/2000/svg' version='1.1' >
<circle cx="64" cy="64" r="62" fill="rgb(0,100,0)" stroke="red" stroke-width="2"/>
<text x="15" y="95" font-family="sans-serif" font-size="90px" fill="white">99</text>
</svg>

正如你所看到的,中心是猜测工作和实验。如何让文本以特定点为中心,在这种情况下x = 64,y = 64?

1 个答案:

答案 0 :(得分:1)

我对你的剧本做了一些小改动:

  1. 我将两个循环合并为一个
  2. 我将xy替换为50%,就像您对中心文字的期望一样
  3. 我使用text-anchor="middle"属性使文本渲染居中(相对于图像中心)
  4. 我使用dy=".35em"来纠正垂直移位 - 它看起来对我很好。其他字体可能需要其他值。
  5. if [ ! -d circleNums ]
    then
       mkdir circleNums
    fi
    rm circleNums/index.html
    # Add this line for center guide <line x1="63" y1="0" x2="63" y2="128" style="stroke:rgb(255,127,64);stroke-width:2"/>
    for I in {1..99}
    do
       cat <<EOF > circleNums/$I.svg
    <svg width='128' height='128' viewBox='0 0 128 128' xmlns='http://www.w3.org/2000/svg' version='1.1' >
    <circle cx="64" cy="64" r="62" fill="rgb(0,100,0)" stroke="red" stroke-width="2"/>
    <text text-anchor="middle" x="50%" y="50%" dy=".35em" font-family="sans-serif" font-size="90px" fill="white">$I</text>
    </svg>
    EOF
       echo "<img src=\"$I.svg\" >" >> circleNums/index.html
    done
    ls circleNums
    

    结果:

    result