我用过以下SE 答案尝试将文本置于节点的左半部分或右半部分的中心。左半部分放置正确,但右半部分表现得很奇怪,我还没弄明白为什么。
梅威瑟:
\documentclass[tikz,border=1cm]{standalone}
\usepackage{standalone}
\usepackage{tikz}
\begin{document}
\newcommand{\textlabel}[3]{\node[label, inner xsep=\LabelSize/2, fill=#2] at (0,2*#1) {#3};}
\newcommand{\textlefthalf}[2] {\textlabel{#1}{#2}{\hspace*{-\LabelSize}1}}
\newcommand{\textrighthalf}[2] {\textlabel{#1}{#2}{\hspace*{\LabelSize}1}}
\newcommand{\textrighthalfalt}[2] {\textlabel{#1}{#2}{1\hspace*{-\LabelSize}}}
\newcommand{\textrighthalfaltcolor}[2]{\textlabel{#1}{#2}{\color{white}1\hspace*{-\LabelSize}}}
\newlength\LabelSize
\setlength\LabelSize{1cm}
\tikzset{
label/.style={fill=black,text width=\LabelSize, align=center,minimum height=\LabelSize,minimum width=\LabelSize*2,inner sep=0em,text=white,font=\sffamily\fontsize{15pt}{0pt}\selectfont},
}
\begin{tikzpicture}
\textlefthalf{0}{blue}
\textrighthalf{1}{red}
\textrighthalfalt{2}{black}
\textrighthalfaltcolor{3}{gray}
\draw[dashed] (0,-1) -- (0,7);
\draw[green, dashed] (-\LabelSize/2,-1) -- (-\LabelSize/2,7);
\draw[green, dashed] (\LabelSize/2,-1) -- (\LabelSize/2,7);
\end{tikzpicture}
\end{document}
蓝色是可以的,右边是偏离“中心”的,黑色是居中于真实中心(不是我想要的那个)。灰色是我想要看到的。但是为什么添加有助于\color{white}
实现这一点呢?
我想了解发生了什么,以便我可以调整我的乳胶心理模型。
答案1
如果你仔细观察,你会发现“不工作”部分是唯一包含正数的部分\hspace
。你在其中设置
text width=\LabelSize
并放置了一个相同宽度的水平空间。因此,框已满:该空间之后的所有内容都超出了框。我使用了 来\rule
显示这一点。
相反,使用负空间来定位框可以很好地工作,正如您所看到的,但必须仔细弄清楚您实际上在做什么。为了正确获得您想要的结果,您可以使用另一个负空间,但为了显示其效果,必须有任何框后它。否则这个空间不会被识别。所以我\null
在那里放了一个:
\documentclass[tikz,border=1cm]{standalone}
\usepackage{standalone}
\usepackage{tikz}
\begin{document}
\newcommand{\textlabel}[3]{\node[label, inner xsep=\LabelSize/2, fill=#2] at (0,2*#1) {#3};}
\newcommand{\textlefthalf}[2] {\textlabel{#1}{#2}{\hspace*{-\LabelSize}1}}
\newcommand{\textrighthalf}[2] {\textlabel{#1}{#2}{\rule{\LabelSize}{1pt}1}}
\newcommand{\textrighthalfalt}[2]{\textlabel{#1}{#2}{1\hspace*{-\LabelSize}\null}}
\newlength\LabelSize
\setlength\LabelSize{1cm}
\tikzset{
label/.style={fill=black,text width=\LabelSize, align=center,minimum height=\LabelSize,minimum width=\LabelSize*2,inner sep=0em,text=white,font=\sffamily\fontsize{15pt}{0pt}\selectfont},
}
\begin{tikzpicture}
\textlefthalf{0}{blue}
\textrighthalf{1}{red}
\textrighthalfalt{2}{black}
\draw[dashed] (0,-1) -- (0,5);
\draw[green, dashed] (-\LabelSize/2,-1) -- (-\LabelSize/2,5);
\draw[green, dashed] (\LabelSize/2,-1) -- (\LabelSize/2,5);
\end{tikzpicture}
\end{document}
答案2
这不是您问题的答案,而是一种实现您想要的替代方法。(这shapes.multiparts
不是必需的,但在您想要访问各个部分时可能会有用。)当然,可以为这些事情编写宏。
\documentclass[tikz,border=1cm]{standalone}
\usepackage{tikz}
\usetikzlibrary{shapes.multipart}
\begin{document}
\newlength\LabelSize
\setlength\LabelSize{1cm}
\begin{tikzpicture}[font=\sffamily\fontsize{15pt}{0pt}\selectfont]
\node[rectangle split, rectangle split parts=2,rectangle split
horizontal,fill=blue,text=white,rectangle split part align={center,center},
inner sep=0pt,minimum height=1cm]
at (0,0) {\makebox[1cm][c]{1}\nodepart{two}\makebox[1cm][c]{}};
\node[rectangle split, rectangle split parts=2,rectangle split
horizontal,fill=red,text=white,rectangle split part align={center,center},
inner sep=0pt,minimum height=1cm]
at (0,2) {\makebox[1cm][c]{}\nodepart{two}\makebox[1cm][c]{1}};
\node[fill=black,text=white,minimum width=2*\LabelSize,
inner sep=0pt,minimum height=1cm]
at (0,4) {1};
\draw[dashed] (0,-1) -- (0,5);
\draw[green, dashed] (-\LabelSize/2,-1) -- (-\LabelSize/2,5);
\draw[green, dashed] (\LabelSize/2,-1) -- (\LabelSize/2,5);
\end{tikzpicture}
\end{document}