如何在 TikZ 中设置文本样式以及更改节点的形状和颜色?

如何在 TikZ 中设置文本样式以及更改节点的形状和颜色?

我有一个如下所示的投影仪框架,它产生类似以下内容的内容: 在此处输入图片描述

重点是我想要做以下改变:

  1. 我希望所有上部节点都具有相同的大小,并且与下部节点具有相同的长度。
  2. 我希望节点内的文本左对齐,例如,$\pi_{t^*}$ 没有对齐。
  3. 我希望字体小一点,这样我就可以水平放置 4 个字体(目前我有 2 个,如您所见)。
  4. 我希望节点具有弯曲的边缘并填充颜色,例如,当我使用tikzmarkin和时如下所示tikzmarkend

在此处输入图片描述

对如何实现这些有什么想法吗?

\documentclass[xcolor=table,10pt,aspectratio=169]{beamer}
\usetheme{metropolis} 

\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[american]{babel}
\usepackage{amsmath,amssymb,amsthm}
\usepackage[beamer,customcolors]{hf-tikz}
\usepackage{booktabs} % Tables
\usepackage{tikz}
\usetikzlibrary{
    arrows,
    calc,
    chains,
    decorations,
    decorations.text,
    decorations.pathmorphing,
    matrix,
    overlay-beamer-styles,
    positioning,
    shapes,
    tikzmark
}

\begin{document}

 \begin{frame}{Intuition}
\begin{center}
\begin{tikzpicture}[every text node part/.style={align=center}]
\node[draw, minimum size=1cm] (A) {$c_0 \gets \mathsf{Enc}(\mathsf{pk}_0^{\mathsf{PKE}}, m_0)$\\ $c_1 \gets \mathsf{Enc}(\mathsf{pk}_1^{\mathsf{PKE}}, m_0)$\\ $\pi_{t^*} \gets \mathsf{Prover}(t^*, x, w)$};
\node[draw, minimum size=1cm, below=0.1cm of A] (C) {$\mathsf{sk}_{f, t} = iO(\text{PKey}[\mathsf{sk}_0^{\mathsf{PKE}}, t])$};
\node[draw, minimum size=1cm, right=1cm of A] (B) {$c_0 \gets \mathsf{Enc}(\mathsf{pk}_0^{\mathsf{PKE}}, m_0)$\\ $c_1 \gets \mathsf{Enc}(\mathsf{pk}_1^{\mathsf{PKE}}, m_0)$\\ $\pi_{t^*} \gets \mathsf{Sim}(t^*, x)$};
\node[draw, minimum size=1cm, below=0.1cm of B] (D) {$\mathfs{sk}_{f, t} = iO(\text{PKey}[\mathfs{sk}_0^{\mathsf{PKE}}, t])$};
\end{tikzpicture}
\end{center}
\end{frame}


\end{document}

答案1

  1. 为了使节点具有相同的宽度,您需要为所有节点设置一个公共的text width或一个公共的minimum width

    如果text width设置得太小,文本将超出节点。如果选择的minimum width太小,它将被忽略。

    您还可以使用PGFmath 函数width例如

    text width={width("$\mathsf{sk}_{f, t}
               = iO(\text{PKey}[\mathsf{sk}_0^{\mathsf{PKE}}, t])$")}
    

    但如果您稍后更改公式,这可能会很烦人。

    在第二帧中,我使用我的ext.node-families图书馆它会为您进行测量,但需要运行两次编译。这里我为所有节点使用了相同的系列名称,这意味着左侧节点的宽度与右侧节点的宽度相同(而不仅仅是同一列中的节点)。

  2. 我认为最好的方法是使用aligned环境,它基本上是环境的内联版本align。(这意味着左侧没有左对齐,但我认为这并不可取。不过你也可以使用 的alignat小兄弟alignedat。)

  3. 您可以使用常规字体切换命令\small\footnotesize\scriptsize\tiny获取较小的文本(从而获得较小的图表)。不过我认为这不是一个好主意,因为您需要非常小的尺寸才能在一页上显示四个这样的文本。

    您也可以使用scaleTikZ 的转换,但这并没有真正使它变得更好。

  4. hf-tikz包定义了何时使用其选项\bcol\fcol因此我们也可以将其用于我们的真实节点,以模拟其效果。不幸的是,没有很好的样式可用于应用包hf-tikz提供的所有设置。

我在第二帧上使用\matrix(数学节点),对我来说,这使得写下和显示这些公式更加清晰。

代码

\documentclass[xcolor=table,10pt,aspectratio=169]{beamer}
\usetheme{metropolis}
\usepackage[T1]{fontenc}
\usepackage[american]{babel}
\usepackage{amsmath,amssymb,amsthm}
\usepackage[beamer]{hf-tikz}
\usetikzlibrary{
    matrix,
    positioning,
    ext.node-families,
}
\DeclareMathOperator{\Enc}   {Enc} % instead of \mathsf{Enc}
\DeclareMathOperator{\PKey}  {PKey}
\DeclareMathOperator{\Sim}   {Sim}
\DeclareMathOperator{\Prover}{Prover}
\begin{document}
\begin{frame}{Intuition}
Guessed \texttt{minimum width}
\begin{center}
\begin{tikzpicture}[nodes={draw=\bcol, fill=\fcol, rounded corners, minimum width=4.5cm}]
\node[] (A) {$\begin{aligned} c_0 & \gets \Enc(\PKey_0^{\mathsf{PKE}}, m_0) \\
                              c_1 & \gets \Enc(\PKey_1^{\mathsf{PKE}}, m_0) \\
                        \pi_{t^*} & \gets \Prover(t^*, x, w) \end{aligned}$};
\node[below=0.1cm of A] (C) {$\mathsf{sk}_{f, t} = iO(\text{PKey}[\mathsf{sk}_0^{\mathsf{PKE}}, t])$};
\node[right=1cm of A] (B) {$\begin{aligned} c_0 & \gets \Enc(\PKey_0^{\mathsf{PKE}}, m_0) \\
                                              c_1 & \gets \Enc(\PKey_1^{\mathsf{PKE}}, m_0) \\
                                        \pi_{t^*} & \gets \Sim(t^*, x) \end{aligned}$};
\node[below=0.1cm of B] (D) {$\mathsf{sk}_{f, t} = iO(\text{PKey}[\mathsf{sk}_0^{\mathsf{PKE}}, t])$};
\end{tikzpicture}
\end{center}
\end{frame}

\begin{frame}{Intuition}
\texttt{\string\matrix} and \texttt{ext.node-families} (needs two compilations)
\begin{center}
\scriptsize
\begin{tikzpicture}
\matrix[
  nodes={draw=\bcol, fill=\fcol, rounded corners, node family/width=samewidth},
  matrix of math nodes,
  ampersand replacement = \&,
  row sep=.1cm,
  column sep=.2cm] {
\begin{aligned} c_0 & \gets \Enc(\PKey_0^{\mathsf{PKE}}, m_0) \\
                c_1 & \gets \Enc(\PKey_1^{\mathsf{PKE}}, m_0) \\
          \pi_{t^*} & \gets \Prover(t^*, x, w) \end{aligned}
\& 
\begin{aligned} c_0 & \gets \Enc(\PKey_0^{\mathsf{PKE}}, m_0) \\
                c_1 & \gets \Enc(\PKey_1^{\mathsf{PKE}}, m_0) \\
          \pi_{t^*} & \gets \Sim(t^*, x) \end{aligned}
\&
\begin{alignedat}{3} & c_0 && \gets \Enc(\PKey_0^{\mathsf{PKE}}, m_0) \\
                     & c_1 && \gets \Enc(\PKey_1^{\mathsf{PKE}}, m_0) \\
               & \pi_{t^*} && \gets \Prover(t^*, x, w) \end{alignedat}
\& 
\begin{alignedat}{3} & c_0 && \gets \Enc(\PKey_0^{\mathsf{PKE}}, m_0) \\
                     & c_1 && \gets \Enc(\PKey_1^{\mathsf{PKE}}, m_0) \\
               & \pi_{t^*} && \gets \Sim(t^*, x) \end{alignedat}
\\
\mathsf{sk}_{f, t} = iO(\text{PKey}[\mathsf{sk}_0^{\mathsf{PKE}}, t])
\&
\mathsf{sk}_{f, t} = iO(\text{PKey}[\mathsf{sk}_0^{\mathsf{PKE}}, t])
\& \text{too small} \& \text{to read}
\\};
\end{tikzpicture}
\end{center}
\end{frame}
\end{document}

输出

在此处输入图片描述 在此处输入图片描述

相关内容