我正在尝试在 tikz 环境中圈出一些数字。我遵循了此问题的答案:制作 \textcircled 数字的好方法?
我使用了这个解决方案,它在普通文本中效果很好。
\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 节点内的圆圈中创建一些数字。但似乎新的“嵌套”节点从“父”节点继承了最小宽度,因此圆圈变得非常大。有什么办法可以解决这个问题吗?
谢谢你的帮助。
编辑:
我添加了 MWE 来解决我的问题。
\documentclass{standalone}
\usepackage{tikz}
\newcommand*\circled[1]{\tikz[baseline=(char.base)]{
\node[shape=circle,draw,inner sep=2pt] (char) {#1};}}
\begin{document}
\begin{tikzpicture}
\tikzstyle{big}=[draw,rectangle,rounded corners, fill=blue!20,minimum width=2cm, minimum height=2cm]
\node[big] (0) {First number = \circled{20}, Second number = \circled{20}};
\end{tikzpicture}
\end{document}
答案1
你想要这样的东西吗?
我修改了\circled
命令,现在它接受逗号分隔的列表。如果列表只包含一个条目,则该条目会被圈出。如果列表包含多个条目,则每个条目都会被圈出,然后在所有被圈出的数字周围绘制另一个圆圈。因此,上面右侧的条目是 的结果\circled{1,2,3}
。
我的宏tikzpicture
通过输入逗号分隔列表中的项目数来避免嵌套环境remember
。如果逗号分隔列表包含多个条目,则它使用蒂克兹 fit
库在所有节点周围绘制外圆。以下是完整代码:
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{fit}
\newcommand*\circled[1]{%
\begin{tikzpicture}[baseline=(1.base),
circ/.style={shape=circle,draw,inner sep=1pt}]
\foreach \num [count=\c,remember=\c as \C (initially 0)] in {#1}{
\node[circ] (\c) at (\c*3ex,0) {\num};% hack the node placement
} % probably should use the positioning library
\ifnum\C>1\node[circ,fit=(1)(\C)]{};\fi% circle multiple entries
\end{tikzpicture}%
}
\begin{document}
Numbers aligned with the text: \circled{1} \circled{2}
\circled{3} end and then we have \circled{1,2,3}
\end{document}
我已隐含地假设逗号分隔列表中所有带圆圈的条目都是单个字符。如果不是这样,那么很容易修改上面的代码,使其使用蒂克兹 positioning
库将节点彼此相邻放置。
答案2
您的 MWE 中的问题可以通过minimum size=0pt
在 中添加节点样式的选项来解决\circled
。
\documentclass{standalone}
\usepackage{tikz}
\newcommand*\circled[1]{\tikz[baseline=(char.base)]{
\node[shape=circle,draw,inner sep=2pt,minimum size=0pt] (char) {#1};}}
\begin{document}
\begin{tikzpicture}
\tikzset{big/.style={draw,rectangle,rounded corners, fill=blue!20,minimum
width=2cm, minimum height=2cm}}
\node[big] (0) {First number = \circled{20}, Second number = \circled{20}};
\end{tikzpicture}
\end{document}
请注意,\tikzstyle
已被弃用。
然而,这不是一个干净的解决方案,它可能会产生不可预测的结果。一个干净的解决方案是把里面的tikz
图片放在\savebox
。
\documentclass{standalone}
\usepackage{tikz}
\newcommand*\circled[1]{\tikz[baseline=(char.base)]{
\node[shape=circle,draw,inner sep=2pt,minimum size=0pt] (char) {#1};}}
\newsavebox\SBoxA
\begin{document}
\savebox\SBoxA{\circled{20}}%
\begin{tikzpicture}
\tikzset{big/.style={draw,rectangle,rounded corners, fill=blue!20,minimum
width=2cm, minimum height=2cm}}
\node[big] (0) {First number = \usebox\SBoxA, Second number = \usebox\SBoxA};
\end{tikzpicture}
\end{document}