我有一个命令\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
将在内部处理。
nicematrix
(tikz
内部使用)允许命令Block
垂直居中并为单元格着色,也可以\\
在内部使用。
另外,请注意垂直线占据最高单元格的长度。
\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}