制作 \textcircled 数字的好方法?

制作 \textcircled 数字的好方法?

这个问题导致了一个新的方案的出现:
circledsteps

我正在尝试使用简单的命令在圆圈内绘制一些好看的数字:

\textcircled{1}

但是,圆圈​​与数字垂直方向未对齐,看起来有点混乱:

替代文本

有什么建议可以让我调整垂直对齐方式,让数字看起来更靠近圆圈的中心吗?或者,如果那不是一个选项,还有哪些其他方法可以实现相同的结果?

我只会将它们用于数字,并且只在很少的地方使用,因此每个字形的手动调整是一个选项。

如果重要的话,我正在使用pdfLaTeXComputer Modern。

答案1

以下是 TikZ 的解决方案:

\documentclass{article}
\usepackage{tikz}
\newcommand*\circled[1]{\tikz[baseline=(char.base)]{
            \node[shape=circle,draw,inner sep=2pt] (char) {#1};}}
\begin{document}
Numbers aligned with the text:  \circled{1} \circled{2} \circled{3} end.
\end{document}

替代文本

它只是一个节点。TikZ 选项用于对齐基线、调整大小和获取圆形。您可以自由选择有关大小或圆形厚度的更多选项(选项thick)。还有更多:例如,您甚至可以用另一个参数命名节点,以便稍后通过箭头连接它们。

例如,如果有人喜欢将它用于枚举列表,这很容易,但必须受到保护:

\usepackage{enumitem}
...
\begin{enumerate}[label=\protect\circled{\arabic*}]
\item First item
\item Second item
\item Third item
\item Fourth item
\end{enumerate}

替代文本

答案2

我很高兴看到有这么多人决定尝试一下,并且出现了许多有趣的解决方案。按照惯例,这个答案将是社区 wiki,并将总结和比较所有建议的解决方案。


我在此建议三种不同的评估标准,每项标准从 1 到 5 级:

  • 简单。这是衡量所提解决方案的易用性的标准。​​使用附加包或定义除简单便利宏以外的任何内容都会扣分。
  • 灵活性。这主要包括在其他情况下使用它的难易程度,在这种情况下是不同的框架形状、大小和厚度。
  • 准确性。简而言之,解决方案看起来有多美观,特别是字形在圆圈中的居中程度,以及它如何适应自由运行的文本。

开始了:

  1. 解决方案raisebox

    谢谢吉米·奥克适合手指快的人。这是第一个,也是我特别喜欢的应用程序。它非常简单:

    \raisebox{.5pt}{\textcircled{\raisebox{-.9pt} {8}}}
    

    仅此而已。从简单性方面来看,没有比这更好的了。固体5/5,因为不需要额外的包,并且可以用一行代码轻松地抽象出笨拙的定义\def

    灵活性方面,这个解决方案的评分很低,因为你无法控制圆圈的大小或参数(我相信一些 TeX 黑客会证明我错了,但出于对 TeX 的热爱神祇,让我们免受这种可恶的对待)。2/5在这里是当之无愧的。{1}

    准确性问题一如既往地是主观的,但您需要调整垂直距离以获得与您选择的字体相符的准确度(tm)。2/5

  2. -y 解决方案ding

    这是来自是。建议使用一些预定义的符号字形。omniscient symbol-a4 文档说,唯一正确的方法是使用:

    \usepackage{pifont}
    
    \ding{172}--\ding{181} % seriffed fonts
    \ding{192}--\ding{201} % sans-seriffed fonts
    

    甚至是围棋棋盘的命名法:

    \usepackage{igo}
    \whitestone{1}--\whitestone{99}
    

    从简单性方面来看,这款4.5/5,尽管由于涉及额外的包裹,我不愿意直接给它 5 分。

    这根本就不灵活。如果你不喜欢这些字形,那你就只能靠自己了。1/5

    正如人们所期望的那样,字形本身设计得很好,数字在视觉上与圆圈很好地对齐。不过,如果你的字体风格独特,数字字体可能与文本不太协调。

  3. 必须的tikz解决方案。

    啊,总是有这样的事,不是吗?这是因为史蒂芬·柯特维茨

    \usepackage{tikz}
    \newcommand*\circled[1]{\tikz[baseline=(char.base)]{
        \node[shape=circle,draw,inner sep=2pt] (char) {#1};}}
    \begin{document}
    Numbers aligned with the text:  \circled{1} \circled{2} \circled{3} end.
    \end{document}
    

    就我个人而言,我对此并不感兴趣tikz(我知道,总有一天我会学会的),所以对我来说,使用这个包只是一次性使用,我想避免这种情况。我不能给出更多2/5这里,但tikz粉丝们(和姑娘们!)应该把它提升到4/5

    就灵活性而言:这是真正的交易。Stefan 甚至演示了如何使用带圆圈的符号和枚举列表。不同的框架形状当然是可能的,并且与字形的贴合程度各不相同。无可争辩5/5

    基线对齐是一流的,无需进行一些手动调整,这非常好。符号周围的间距看起来不错,尽管在自由运行的文本中,圆圈最好与数字紧密贴合,这可以通过调整inner sep命令定义中的参数来实现。5/5这里。

  4. pict2e/picture解决方案

    后期添加赫伯特建议使用picturepict2e包中的一些基本原语。如下所示:

    \usepackage{pict2e,picture}
    \newsavebox\CBox
    \newlength\CLength
    \def\Circled#1{\sbox\CBox{#1}%
      \ifdim\wd\CBox>\ht\CBox \CLength=\wd\CBox\else\CLength=\ht\CBox\fi
        \makebox[1.5\CLength]{\makebox(0,1.5\CLength){\put(0,0){\circle{1.5\CLength}}}%
        \makebox(0,1.5\CLength){\put(-.5\wd\CBox,0){#1}}}}
    

    从简单性方面来看,这款软件的评价并不高。它看起来有点复杂,但研究过之后肯定是可以理解的,并且使用了两个额外的包。2/5这是一个合理的分数。

    灵活性不是内置的,但肯定是可能的。可以通过修改系数来调整圆半径1.5,并且可以调整基线。3.5/5

    按照此定义,周围文本的基线与圆圈相切,而不是与圆圈内的数字基线对齐。在某些情况下,这可能是可取的,但这样数字看起来有点不合适。在放置框时进行一些额外的计算,以及3.5/5在此处给出以反映这种潜力。

  5. 另一个强制性tikz解决方案

    马修·林冈莫布格尝试过,虽然他们的努力当然值得赞赏,但我觉得 Stefan 的解决方案更简单。我很感激他们的努力(和你的谦逊),我赞同你的两个答案。

最终得分:

  • 简单raisebox
  • 灵活性tikz
  • 准确性:介于tikz和之间ding

总体而言:tikz,毫不犹豫(公众欢呼、抛帽子、挥舞手帕等等)。

最后,一些测试代码:

\documentclass{article}
\usepackage{pict2e,picture} % picture 
\usepackage{tikz}   % tikz
\usepackage{pifont} % ding

% Picture solution
\newsavebox\CBox
\newlength\CLength
\def\numcircledpict#1{\sbox\CBox{#1}%
  \ifdim\wd\CBox>\ht\CBox \CLength=\wd\CBox\else\CLength=\ht\CBox\fi
    \makebox[1.5\CLength]{\makebox(0,1.5\CLength){\put(0,0){\circle{1.5\CLength}}}%
    \makebox(0,1.5\CLength){\put(-.5\wd\CBox,0){#1}}}}

% TikZ solution
\newcommand*\numcircledtikz[1]{\tikz[baseline=(char.base)]{
            \node[shape=circle,draw,inner sep=1.2pt] (char) {#1};}} 

% Modified \textcircled solution
\newcommand*\numcircledmod[1]{\raisebox{.5pt}{\textcircled{\raisebox{-.9pt} {#1}}}}

\begin{document}
    \begin{tabular}{l|l}
        Original & Lorem \textcircled{1} ipsum \textcircled{2} dolor \\
        Modified & Lorem \numcircledmod{1} ipsum \numcircledmod{2} dolor\\
        TikZ & Lorem \numcircledtikz{1} ipsum \numcircledtikz{2} dolor\\
        Picture & Lorem \numcircledpict{1} ipsum \numcircledpict{2} dolor\\
        Ding serif & Lorem \ding{172} ipsum \ding{173} dolor\\
        Ding sans & Lorem \ding{192} ipsum \ding{193} dolor\\
    \end{tabular}
\end{document}

{1} 如果有人决定写这样的东西,请告诉我,我将免费将其包含在此答案中,但请注意,该帖子随后将被标记,\textcircled{18+}以保护胆小者。

答案3

最快的解决方法是使用命令\raisebox。我尝试了一下,似乎将文本降低 0.9pt 会使图形大致位于中心:

\textcircled{\raisebox{-0.9pt}{8}}

你可以尝试一下以获得绝对中心,但它肯定在 0.9 到 1pt 之间。我明白了这里。看来该\textcircled命令最适合文本!但无论如何,这应该可以解决您的问题。

答案4

morbusg 已经提到有些字体有圆圈数字Unicode 字形并展示了如何直接嵌入它们。有些字体提供了更加人性化的界面用于访问数字,例如 Linux Libertine 和 Junicode。显然,这意味着我们偏离了您使用 Computer Modern 的要求。这些 Unicode 数字的优势大概在于它们是由字体设计师制作的,因此不需要进行任何微调。

这是一个简单的概念验证(您还需要junicode安装该软件包):

\documentclass{article}
\usepackage{fontspec}
\usepackage{libertine}

\begin{document}
\libertineGlyph{uni2460} \libertineGlyph{uni24F5} \libertineGlyph{uni2776}

{\fontspec[Ligatures=Discretionary]{Junicode}[1] [[1]] <1>}
\end{document}

输出

这些方法在相应的文档中进行了描述。

这是访问这些数字集的更舒适的方法。双圈数字(根据 Unicode)的范围是 1 到 10,其他数字的范围是 0 到 20。

\documentclass{article}
\usepackage{fontspec}
\usepackage{libertine}
\usepackage{pgf} % for the calculation
% \libcirc and \libcircblk display their '0' if the parameter is out of range
\newcommand{\libcirc}[1]{\pgfmathparse{
    ifthenelse(#1 > 0 && #1 < 21, Hex(9311+#1), Hex(9450)
    }\libertineGlyph{uni\pgfmathresult}}
\newcommand{\libcircdbl}[1]{\pgfmathparse{Hex(9460+#1)}\libertineGlyph{uni\pgfmathresult}}
\newcommand{\libcircblk}[1]{\pgfmathparse{
    ifthenelse(#1 > 0 && #1 < 11, Hex(10101+#1),
        ifthenelse(#1 > 10 && #1 < 21, Hex(9450-10+#1),
            Hex(9471)
        )
    )
    }\libertineGlyph{uni\pgfmathresult}}

\newcommand{\juncirc}[1]{{\fontspec[Ligatures=Discretionary]{Junicode}[#1]}}
\newcommand{\juncircdbl}[1]{{\fontspec[Ligatures=Discretionary]{Junicode}[[#1]]}}
\newcommand{\juncircblk}[1]{{\fontspec[Ligatures=Discretionary]{Junicode}<#1>}}

\usepackage{pgffor} % just for the demo loop
\setlength{\parindent}{0pt} % just for the demo
\begin{document}
\section{Linux Libertine}
\foreach \x in {0,...,20} {\libcirc{\x} }

\foreach \x in {1,...,10} {\libcircdbl{\x} }

\foreach \x in {0,...,20} {\libcircblk{\x} }

\section{\fontspec{Junicode}Junicode}
\foreach \x in {0,...,20} {\juncirc{\x} }

\foreach \x in {1,...,10} {\juncircdbl{\x} }

\foreach \x in {0,...,20} {\juncircblk{\x} }
\end{document}

输出

相关内容