我目前已设置了一个命令,用于绘制一个带有阴影的框,框内有一些文本。我希望它具有最小宽度,但当我设置它时,如果表格小于框的宽度,则表格现在会对齐在框的中心。我希望它右对齐。这是当前设置:
\documentclass{scrlttr2}
\usepackage{tikz}
\usepackage{color}
\usetikzlibrary{shadows}
\definecolor{myblue}{rgb}{0, 0.58, 0.85}
\newcommand*\invhead[1]{\sffamily{\color{myblue}\footnotesize{\textbf{#1}}}}
\tikzstyle{shadedbox} = [
draw=black,
shade,
top color=white,
bottom color=bottom,
drop shadow={
top color=black,
bottom color=black,
shadow xshift=2pt,
shadow yshift=-2pt,
},
thin,
rectangle,
inner sep=2pt,
inner ysep=2pt
]
\newcommand*\monobox[2]{%
\begin{tikzpicture}
\definecolor{top}{RGB}{250,250,250}
\definecolor{bottom}{RGB}{235,235,235}
\node [shadedbox, minimum width=3.1cm] (box) {
\begin{tabular}{r}
\invhead{\scriptsize #1}\\
\footnotesize{#2}\\
\end{tabular}
}
\end{tikzpicture}
}
\setkomavar{fromname}{TestCompany}
\setkomavar{fromaddress}{37 Test Road, Someplace\\Somewhere, 6020\\Australia}
\setkomavar{fromphone}{+61 123 1234 1234}
\setkomavar{fromemail}{[email protected]}
\setkomavar{signature}{TestCompany}
\setkomavar{invoice}[Invoice number]{1234}
\setkomavar{date}[Issue Date]{\today}
\setkomavar{customer}[Account number]{1234567}
\begin{document}
\begin{letter}{%
Mr Nick Sandford\\
23 Test St\\
Somewhere, Someplace\\
Australia
}
\opening{Dear Nick Sandford,}
\monobox{Test Box}{\$0.00}
\closing{Regards}
\end{letter}
\end{document}
我称其为\monobox{This Bill}{\$20.00}
。它渲染后的样子如下:
希望我没有做错什么:)。
答案1
要使节点中的文本右对齐,您必须设置节点上的text width
选项align
。在您的示例代码中,您可以修改monobox
命令,使其如下所示:
\newcommand*\monobox[2]{%
\begin{tikzpicture}
\definecolor{top}{RGB}{250,250,250}
\definecolor{bottom}{RGB}{235,235,235}
\node [shadedbox, minimum width=3.1cm, text width=3.1cm, align=right] (box) {
\begin{tabular}{r}
\invhead{\scriptsize #1}\\
\footnotesize{#2}\\
\end{tabular}
}
\end{tikzpicture}
}
结果:
更新:在 Martin 和 Peter 的评论之后,我修改了代码,无论输入的宽度如何,这都应该有效
\newcommand*\monobox[2]{%
\begin{tikzpicture}
\definecolor{top}{RGB}{250,250,250}
\definecolor{bottom}{RGB}{235,235,235}
\pgfmathsetlengthmacro{\mylen}{max(width("#1"),3.1cm)}
\node [shadedbox, minimum width=3.1cm, text width=\mylen, align=right] (box) {
\begin{tabular}{r}
\invhead{\scriptsize #1}\\
\footnotesize{#2}\\
\end{tabular}
};
\end{tikzpicture}
}
剩下的问题是文本是使用invhead
和设置的scriptsize
,出于某种原因,我无法让 TikZ 在操作中接受这些width
。手册上说用“保护”它应该\noexpand
可以解决问题,但事实并非如此。因此分配了太多空间。有人知道如何解决这个问题吗?
编辑:马丁建议使用盒子,但为什么这不起作用?
额外奖励-编辑:马丁在聊天中和这个回答中解释道(谢谢马丁:)
):如何在 TikZ 环境中使用 hbox 进行文本尺寸测量?
\newcommand*\monobox[2]{%
\newsavebox\mybox
\sbox{\mybox}{%
\begin{tabular}{r}
\invhead{\scriptsize #1}\\
\footnotesize{#2}\\
\end{tabular}
}
\begin{tikzpicture}
\definecolor{top}{RGB}{250,250,250}
\definecolor{bottom}{RGB}{235,235,235}
\pgfmathsetlengthmacro{\mywd}{max(3.1cm,\wd\mybox)}
\node [shadedbox, minimum width=3.1cm, text width=\mywd, align=right] (box) {
\usebox{\mybox}
};
\end{tikzpicture}
}
这会产生一个正确大小的框,使用\mywd
宏可确保如果文本短于,则文本也右对齐3.1cm
。