我正在使用 tikzposter 并定义了自己的块样式。块的背景是左右特殊,因此我需要在左右留出较大的填充,以使文本不与特殊边框重叠。但是,据我所知,我只能指定一个同样适用于左、上、右下角的 bodyinnersep 值。
是否可以为左、上、右、下分隔指定不同的 bodyinnersep 值,就像在 html/css 中对 margin/padding 执行的操作一样?
我该如何处理这个问题?
答案1
注意:我不能保证这在所有情况下都有效。
只要稍微花点功夫,你至少可以分别设置左/右和上/下,尽管将左填充设置为与右填充不同需要完全不同的方法,因为 TikZ 一开始就没有实现它。但它确实有inner xsep
/ inner ysep
。
因此,可以做的是定义两个新键bodyxinnersep
和bodyyinnersep
,然后在需要时修补(修改)\block
以使用这些键代替bodyinnersep
。您还需要bodyxinnersep=X,bodyyinnersep=Y
在自定义块定义中设置。
\documentclass[a2paper]{tikzposter}
\usepackage{lipsum}
\usepackage{xpatch}
\makeatletter
% define new lenghts for x and y inner sep
\newlength\TP@blockbodyxinnersep
\newlength\TP@blockbodyyinnersep
\newlength\blockbodyxinnersep
\newlength\blockbodyyinnersep
% define keys for tikzposter to use
\define@key{block}{bodyxinnersep}{\TP@blockbodyxinnersep=#1 \blockbodyxinnersep=#1}
\define@key{block}{bodyyinnersep}{\TP@blockbodyyinnersep=#1 \blockbodyyinnersep=#1}
% patch to fix https://bitbucket.org/surmann/tikzposter/issues/38/
% note use of bodyxinnersep
\xpatchcmd{\block}%
{\TP@blockbodywidth-2\TP@blockbodyinnersep-\TP@blockbodyoffsetx}
{\TP@blockbodywidth-2\TP@blockbodyxinnersep}
{}{}
% patch to use the bodyyinnersep to calculate height of node
\xpatchcmd{\block}
{\setlength{\TP@blockbodyheight}{\ht\TP@blockbodybox + \dp\TP@blockbodybox +2\TP@blockbodyinnersep}}
{\setlength{\TP@blockbodyheight}{\ht\TP@blockbodybox + \dp\TP@blockbodybox +2\TP@blockbodyyinnersep}}
{}{}
% patch to set inner x and y seps separately, instead of just inner sep
\xpatchcmd{\block}
{text width=\TP@blockbodywidth-2\TP@blockbodyinnersep, inner sep=\TP@blockbodyinnersep}
{text width=\TP@blockbodywidth-2\TP@blockbodyxinnersep, inner xsep=\TP@blockbodyxinnersep,
inner ysep=\TP@blockbodyyinnersep}
{}{}
\makeatother
% I grabbed this sampleblockstyle from the manual
\defineblockstyle{sampleblockstyle}{
titlewidthscale=0.9, bodywidthscale=1,titleleft,
titleoffsetx=0pt, titleoffsety=0pt, bodyoffsetx=0mm, bodyoffsety=15mm,
bodyverticalshift=10mm, roundedcorners=5, linewidth=2pt,
titleinnersep=6mm, bodyinnersep=1cm,
% note addition of the following two keys:
bodyxinnersep=6cm,bodyyinnersep=1cm
}{
\draw[color=framecolor, fill=blockbodybgcolor,
rounded corners=\blockroundedcorners] (blockbody.south west)
rectangle (blockbody.north east);
\ifBlockHasTitle
\draw[color=framecolor, fill=blocktitlebgcolor,
rounded corners=\blockroundedcorners] (blocktitle.south west)
rectangle (blocktitle.north east);
\fi
}
% use the custom style
\useblockstyle{sampleblockstyle}
\author{a}
\title{b}
\begin{document}
\maketitle
\block{foo}{\lipsum*[1]}
\end{document}