奇怪的 tikz 文本/内部 sep 定位行为

奇怪的 tikz 文本/内部 sep 定位行为

我用过以下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}

在此处输入图片描述

相关内容