这个问题导致了一个新的方案的出现:
circledsteps
我正在尝试使用简单的命令在圆圈内绘制一些好看的数字:
\textcircled{1}
但是,圆圈与数字垂直方向未对齐,看起来有点混乱:
有什么建议可以让我调整垂直对齐方式,让数字看起来更靠近圆圈的中心吗?或者,如果那不是一个选项,还有哪些其他方法可以实现相同的结果?
我只会将它们用于数字,并且只在很少的地方使用,因此每个字形的手动调整是一个选项。
如果重要的话,我正在使用pdfLaTeX
Computer 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 级:
- 简单。这是衡量所提解决方案的易用性的标准。使用附加包或定义除简单便利宏以外的任何内容都会扣分。
- 灵活性。这主要包括在其他情况下使用它的难易程度,在这种情况下是不同的框架形状、大小和厚度。
- 准确性。简而言之,解决方案看起来有多美观,特别是字形在圆圈中的居中程度,以及它如何适应自由运行的文本。
开始了:
解决方案
raisebox
。谢谢吉米·奥克适合手指快的人。这是第一个,也是我特别喜欢的应用程序。它非常简单:
\raisebox{.5pt}{\textcircled{\raisebox{-.9pt} {8}}}
仅此而已。从简单性方面来看,没有比这更好的了。固体5/5,因为不需要额外的包,并且可以用一行代码轻松地抽象出笨拙的定义
\def
。灵活性方面,这个解决方案的评分很低,因为你无法控制圆圈的大小或参数(我相信一些 TeX 黑客会证明我错了,但出于对 TeX 的热爱神祇,让我们免受这种可恶的对待)。2/5在这里是当之无愧的。{1}
准确性问题一如既往地是主观的,但您需要调整垂直距离以获得与您选择的字体相符的准确度(tm)。2/5。
-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。
正如人们所期望的那样,字形本身设计得很好,数字在视觉上与圆圈很好地对齐。不过,如果你的字体风格独特,数字字体可能与文本不太协调。
必须的
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这里。pict2e
/picture
解决方案后期添加赫伯特建议使用
picture
和pict2e
包中的一些基本原语。如下所示:\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在此处给出以反映这种潜力。
另一个强制性
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}