如何在 tikz 图片中右对齐表格

如何在 tikz 图片中右对齐表格

我目前已设置了一个命令,用于绘制一个带有阴影的框,框​​内有一些文本。我希望它具有最小宽度,但当我设置它时,如果表格小于框的宽度,则表格现在会对齐在框的中心。我希望它右对齐。这是当前设置:

\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

相关内容