如何放置具有相同(动态)高度和与通常文本宽度组合的相邻 Tikz 节点?

如何放置具有相同(动态)高度和与通常文本宽度组合的相邻 Tikz 节点?

我有一个命令\entry,将两个 tikz 节点并排放置。如何确保两个节点始终具有相同的高度(同时保持内部文本的垂直居中)?

\linewidth另外,如果两个节点加起来 ( 0.25\linewidth+ 0.75\linewidth) 应该正好等于 1 ,那么右节点怎么会延伸 呢\linewidth?我希望两个节点的总宽度等于底部文本的文本宽度。我该如何解决这个问题?

在此处输入图片描述

梅威瑟:

\documentclass[
    12pt,
    parskip=half,
]{scrartcl}

\usepackage[
    a4paper,
    left=25mm,
    right=20mm,
    top=25mm,
    bottom=30mm,
    showframe,
]{geometry}
\usepackage{blindtext}

% Font
\usepackage{inconsolata}
\usepackage[T1]{fontenc}
\renewcommand*\familydefault{\sfdefault} %% Only if the base font of the document is to be sans serif

\usepackage{tikz}
\usetikzlibrary{positioning}

\definecolor{colour-a}{HTML}{eefaea}
\definecolor{colour-b}{HTML}{e8f4f2}

\newcommand\entry[2]{%
    \begin{tikzpicture}
        \node(node-a)[fill=colour-a, text width=0.25\linewidth] {
            \textbf{#1}
        };
        \node(node-b)[fill=colour-b, right=0pt of node-a, align=left, text width=0.75\linewidth]{
            #2
        };
        \draw[thick] (node-b.south west)--(node-b.north west);
    \end{tikzpicture}
    \par % end of previous paragraph
    %\vspace*{1ex}% optional vertical  space in between
}

\begin{document}
    \entry{%
        test1
    }{
        test1
    }

    \entry{%
        test2 \\
        test2 \\
        test2 \\
    }{
        test2
    }

    \entry{%
        test3
    }{
        test3 \\
        test3 \\
        test3 \\
    }

    \entry{%
        test4
    }{
        \footnotesize \blindtext
    }

    \textbf{Bottom Text}: \\
    \blindtext
\end{document}

答案1

Zarko 已回答您的问题。需要将内部间距的两倍添加到文本宽度,以获得完整宽度为的节点,例如0.25\textwidth

但值得考虑的是,使用带有列的 tabular(x)X将简化代码,因为适合的计算\linewidth将在内部处理。

nicematrixtikz内部使用)允许命令Block垂直居中并为单元格着色,也可以\\在内部使用。

另外,请注意垂直线占据最高单元格的长度。

A

\documentclass[
12pt,
parskip=half,
]{scrartcl}

\usepackage[
a4paper,
left=25mm,
right=20mm,
top=25mm,
bottom=30mm,
]{geometry}
\usepackage{blindtext}

% Font
\usepackage{inconsolata}
\usepackage[T1]{fontenc}
\renewcommand*\familydefault{\sfdefault} %% Only if the base font of the document is to be sans serif

%**************************************** added <<<<<<<<<<<<<<<<<<<<<
\usepackage{ragged2e} %\justifying
\usepackage{showframe}

\usepackage{nicematrix}
\definecolor{colour-a}{HTML}{eefaea}
\definecolor{colour-b}{HTML}{e8f4f2}
\newcolumntype{P}[1]{m{#1}}

\newcommand\dateentry[2]{% *********  changed <<<<<<<<<<<<
\begin{NiceTabularX}{\textwidth}{P{0.25\textwidth}| X}                  
    \Block[l, fill= colour-a ]{1-1}{#1}&\Block[fill= colour-a]{1-1}{\justifying#2} \\
\end{NiceTabularX}
\par% end of previous paragraph
}
%*********************************************************


\begin{document}

    \dateentry{test1}{test1}
    \dateentry{test1 \\ test2 \\ test2}{test2}
    \dateentry{test3}{ test3 \\ test3 \\ test3}
    \dateentry{test4}{ \footnotesize \blindtext }   
        
\textbf{Bottom Text}: \newline  
\blindtext
\end{document}

答案2

sidebyside这是使用tcolorboxes 代替节点的提议TikZ。在这种情况下,总宽度是\linewidth默认的,无需担心。

sidebyside盒子是牢不可破的,但由于TiKZ节点也是牢不可破的,所以这应该不是问题。

\documentclass[12pt,parskip=half]{scrartcl}
\usepackage[
    a4paper,
    hmargin={25mm,20mm}, vmargin={25mm,30mm},
    showframe,
            ]{geometry}
\usepackage{blindtext}
% Font
\usepackage{inconsolata}
\usepackage[T1]{fontenc}
\renewcommand*\familydefault{\sfdefault} % Only if the base font is sans serif

\usepackage[most]{tcolorbox}

\newtcolorbox{mysidebysidebox}[1][]{
    sidebyside,
    sidebyside align=center seam,
    lefthand width=.25\linewidth,
    sharp corners,
    bicolor,
    overlay={\draw[black, very thick] (segmentation.north)--(segmentation.south);},
    frame hidden,
    colback=colour-a,
    colbacklower=colour-b,
    #1
}

\newcommand{\entry}[3][]{%
    \begin{mysidebysidebox}[#1]
    #2\tcblower #3
    \end{mysidebysidebox}
}

\definecolor{colour-a}{HTML}{eefaea}
\definecolor{colour-b}{HTML}{e8f4f2}

\begin{document}
    \entry{%
        test1
    }{
        test1
    }

    \entry{%
        test2 \\
        test2 \\
        test2 \\
    }{
        test2
    }

    \entry{%
        test3
    }{
        test3 \\
        test3 \\
        test3 \\
    }

    \entry[colbacklower=blue!20]{%
        test4
    }{
        \footnotesize \blindtext
    }

    \textbf{Bottom Text}: \\
    \blindtext
\end{document}

在此处输入图片描述

答案3

编辑:
显然我对问题的标题看得太肤浅了:(。

  • 你的结论是错误的。请参阅@Qrrbrbirlbel 评论。可能的解决方案是将文本宽度定义为
text width=0.25\linewidth-2*\pgfkeysvalueof{/pgf/inner xsep} 
  • 一个(相对)简单的方法是让两个节点具有相同的高度,即用一个多部分节点替换它们
\documentclass[12pt,parskip=half]{scrartcl}
\usepackage[
    a4paper,
    hmargin={25mm,20mm}, vmargin={25mm,30mm},
    showframe,
            ]{geometry}
\usepackage{blindtext}
% Font
\usepackage{inconsolata}
\usepackage[T1]{fontenc}
\renewcommand*\familydefault{\sfdefault} 

\usepackage{tikz}
\usetikzlibrary{shapes.multipart}

\definecolor{colour-a}{HTML}{eefaea}
\definecolor{colour-b}{HTML}{e8f4f2}

\newcommand\entry[2]%
{
\begin{tikzpicture}[
mpnh/.style = {
    rectangle split, rectangle split horizontal,
    rectangle split parts=2,
    rectangle split part fill={colour-a,colour-b},
               }
                 ]
\node (a) [mpnh] {
    \nodepart[text width=0.25\linewidth-2*\pgfkeysvalueof{/pgf/inner xsep}]{one} \textbf{#1}
    \nodepart[text width=0.75\linewidth-2*\pgfkeysvalueof{/pgf/inner xsep}]{two} #2
                };
\draw[thick] (a.one split north)--(a.one split south);
\end{tikzpicture}\par
}

\begin{document}
    \entry{test 1}{test 1}
    \entry{test 2a\\
           test 2b\\
           test 2c}{test 2}
    \entry{test 3}{test 3a \\
                   test 3b \\
                   test 3c}
    \entry{test 4}{\blindtext}

\textbf{Bottom Text}: \\
    \blindtext
\end{document}

在此处输入图片描述

另一种方法是使用表格代替绘制节点。使用tabularray包代码会更简单、更短:

\documentclass[12pt,parskip=half]{scrartcl}
\usepackage[a4paper,
            hmargin={25mm,20mm}, vmargin={25mm,30mm},
            showframe,
            ]{geometry}
\usepackage{blindtext}
% Font
\usepackage[T1]{fontenc}
\usepackage{inconsolata}
\usepackage{microtype}
\renewcommand*\familydefault{\sfdefault}

\usepackage{xcolor}
\usepackage{tabularray}
\makeatletter
\ExplSyntaxOn
\pretocmd{\@declaredcolor}{\my@hack@color{#1}}{}{}
\def\my@hack@color#1{\@ifundefined{\@backslashchar color@#1}{\MyDefineColor{#1}}{\relax}}
\cs_generate_variant:Nn \seq_set_split:Nnn { Nnx }

\NewDocumentCommand \MyDefineColor { m } {
  \seq_set_split:Nnx \l_tmpa_seq {|} {#1}
  %\seq_show:N \l_tmpa_seq
  \exp_args:Nnxx \definecolor{#1} { \seq_item:Nn \l_tmpa_seq {1} } { \seq_item:Nn \l_tmpa_seq {2} }
}
\ExplSyntaxOff
\makeatother

\definecolor{colour-a}{HTML}{eefaea}
\definecolor{colour-b}{HTML}{e8f4f2}
\newcommand\entry[2]%
{
\begin{tblr}{colspec = {X[1, l,   bg={HTML|eefaea}] | 
                        X[3, j,m, bg={HTML|e8f4f2}]}}
\textbf{#1} &   #2  
\end{tblr}\par
}

\begin{document}
    \entry{test 1}{test 1}
    \entry{test 2a\\
           test 2b\\
           test 2c}{test 2}
    \entry{test 3}{test 3a \\
                   test 3b \\
                   test 3c}
    \entry{test 4}{\small   \blindtext}

\textbf{Bottom Text}: \\
    \blindtext
\end{document}

在此处输入图片描述

相关内容