tikz 节点中的逐字

tikz 节点中的逐字

我正在尝试在紧邻其他节点的 tikz 节点中建立一个 verbatim 环境。

我努力了

\documentclass{article}

\usepackage{tikz}

\usetikzlibrary{positioning}

\begin{document}

\begin{tikzpicture}
\node (s1) {$a$};
\node (s2) [right=of s1] {$b$};
\node (s3) [above right=0cm and 1cm of s2] {$c$};
\node (s4) [below right=0cm and 1cm of s2] {$d$};

\node[right=6cm of s2] {%

   verbatim environment

};

\path (s1) edge (s2);
\path (s2) edge (s3);
\path (s2) edge (s4);
\end{tikzpicture}

\end{document}

产生

在此处输入图片描述

但如果我添加\begin{verbatim}...\end{verbatim},它就不再起作用了。

我想要的是在左侧有一些节点,在右侧有一些逐字格式的文本,并且从左侧的节点到右侧的文本有一个箭头。

答案1

verbbox一种方法是在输入之前保存一个或多个es tikz。然后根据需要调用它们。

\documentclass{article}

\usepackage{tikz,verbatimbox}

\usetikzlibrary{positioning}

\begin{document}
\begin{myverbbox}{\sTWO}
This i$ my \verbatim
  environment
\\##@
\end{myverbbox}

\begin{tikzpicture}
\node (s1) {$a$};
\node (s2) [right=of s1] {$b$};
\node (s3) [above right=0cm and 1cm of s2] {$c$};
\node (s4) [below right=0cm and 1cm of s2] {$d$};

\node[right=6cm of s2] {\sTWO};

\path (s1) edge (s2);
\path (s2) edge (s3);
\path (s2) edge (s4);
\end{tikzpicture}

\end{document}

在此处输入图片描述

下面是一个演示多个 es 的版本verbbox,第二个是彩色的\footnotesize

\documentclass{article}

\usepackage{tikz,verbatimbox}

\usetikzlibrary{positioning}

\begin{document}
\begin{myverbbox}{\sTWO}
This i$ my \verbatim
  environment
\\##@
\end{myverbbox}
{\color{red}
\begin{myverbbox}[\footnotesize]{\sTWELVE}
Another
 verbatim &$#^_ environment
\end{myverbbox}
}

\begin{tikzpicture}
\node (s1) {$a$};
\node (s2) [right=of s1] {$b$};
\node (s3) [above right=0cm and 1cm of s2] {$c$};
\node (s4) [below right=0cm and 1cm of s2] {$d$};

\node[right=6cm of s2] {\sTWO};

\path (s1) edge (s2);
\path (s2) edge (s3);
\path (s2) edge (s4);

\node (s11) [below=2cm of s1] {$e$};
\node (s12) [right=of s11] {$f$};
\node (s13) [above right=0cm and 1cm of s12] {$g$};
\node (s14) [below right=0cm and 1cm of s12] {$h$};

\node[right=6cm of s12] {\sTWELVE};

\path (s11) edge (s12);
\path (s12) edge (s13);
\path (s12) edge (s14);
\end{tikzpicture}

\end{document}

在此处输入图片描述

答案2

您实际上根本不需要节点内的逐字文本。如果您将其从 中取出tikzpicture,则可以将其放入minipage或类似的东西中以使其对齐。

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{positioning}
\begin{document}
\begin{tikzpicture}[baseline=(current bounding box.center)]
  \node (s1) {$a$};
  \node (s2) [right=of s1] {$b$};
  \node (s3) [above right=0cm and 1cm of s2] {$c$};
  \node (s4) [below right=0cm and 1cm of s2] {$d$};
  \draw (s1) -- (s2) edge (s3) -- (s4);
  \path [->] (s2 -| s4.east) edge ++(10mm,0);
\end{tikzpicture}
\begin{minipage}[c]{.5\linewidth}
\begin{verbatim}
  Some verbatim stuff
  in a
  minipage
\end{verbatim}
\end{minipage}
\end{document}

逐字逐句地记录在图表旁边

答案3

虽然 TikZ 节点支持\verb节点文本,但它们不支持verbatim环境(原因我不完全清楚)。

但是只是为了好玩,如何滚动您自己的逐字环境?

这是一个可以自动确定线宽的最小实现(使用选项auto)。或者,text width可以向节点提供选项,该选项将换行较长的线。否则,您将得到一条长线。

\documentclass[tikz,border=5]{standalone} 
\usetikzlibrary{positioning}
\makeatletter
\def\makeother#1{\catcode`#1=12\relax}
\def\makeactive#1{\catcode`#1=13\relax}
{
\catcode`\|=\catcode`\\
\catcode`\[=\catcode`\{
\catcode`\]=\catcode`\}
|makeother\\
|makeother|{
|makeother|}
|makeactive|^^M%
|long|gdef|docollect#1^^M\end{vrbtm}[|aftercollect[#1]]%
]
{
\makeactive\ %
\gdef\dospace{\makeactive\ \def {\spaceaction}}
}
{
\makeactive\^^M%
\gdef\doreturn{\makeactive\^^M\def^^M{\returnaction}}%
\gdef\beforecollect{\@ifnextchar^^M{\afterassignment\docollect\let\token=}%
  {\docollect}}%
}

\def\spaceaction{\hskip1ex}
\def\returnaction{\par\leavevmode}

\newbox\vrbbxa
\newbox\vrbbxb

\def\autobeforetypeset{%
  \let\returnaction=\autoline%
  \setbox\vrbbxa=\hbox\bgroup\ignorespaces}

\def\autoline{%
    \unskip%
  \egroup%
  \autoaddtobox%
  \setbox\vrbbxa=\hbox\bgroup\ignorespaces}

\def\autoaddtobox{%
  \ifdim\wd\vrbbxb<\wd\vrbbxa%
    \let\tmpbx=\vrbbxa%
  \else%
    \let\tmpbx=\vrbbxb%
  \fi%
  \setbox\vrbbxb=\vbox{\hsize=\wd\tmpbx%
    \ifvoid\vrbbxb\else\box\vrbbxb\fi\box\vrbbxa}%
}

\def\autoaftertypeset{%
   \unskip%
  \egroup%
  \autoaddtobox%
  \box\vrbbxb%
}

\def\beforetypeset{\noindent}
\long\def\typeset#1{#1}
\def\aftertypeset{\unskip}

\pgfkeys{vrbtm/.cd,
  auto/.code={%
    \let\beforetypeset=\autobeforetypeset
    \let\aftertypeset=\autoaftertypeset
  }
}
\def\vrbtm{\@ifnextchar[\vrbtmopts{\vrbtmopts[]}}
\def\vrbtmopts[#1]{%
  \begingroup%
    \pgfkeys{vrbtm/.cd,#1}%
    \let\do=\makeother%
    \dospecials%
    \dospace%
    \doreturn%
    \beforecollect}

\def\aftercollect#1{%
  \beforetypeset%
  \typeset{#1}%
  \aftertypeset%
  \endgroup%
  \end{vrbtm}%
}
\begin{document}

\begin{tikzpicture}[every node/.style={font=\ttfamily}]

\node[draw] (A) {%
\begin{vrbtm}[auto]
Here i$  $ome 
 verb&tim_text

with 
{automat~c} \line lengt# c%lcul%tion
\end{vrbtm}
};

\node[draw, below=of A, text width=4cm] (B) {%
\begin{vrbtm}
Here i$  $ome 
 verb&tim_text

with 
{te#t width} and word wrap
\end{vrbtm}
};

\node[draw, below=of B] (C) {%
\begin{vrbtm}
Here i$ $ome 
 verb&tim_text

 without
 {anything} \cle^er
\end{vrbtm}
};
\end{tikzpicture}
\end{document}

在此处输入图片描述

答案4

在 99% 的情况下,如果您不能在其他内容中使用逐字类似的东西,那是因为 catcode 问题。

然而在这种情况下,您可能会猜测情况并非如此,因为\verb效果很好。

反而,实际原因是verbatim环境在受限水平模式(即 内的模式)下不起作用\hbox

因此,任何解决方案TikZ 节点中的手动/自动换行和文本对齐可以工作(只要它们不干扰 catcode)

例如,使用text width属性:

\documentclass{article}

\usepackage{tikz}

\usetikzlibrary{positioning}

\begin{document}

\begin{tikzpicture}
\node (s1) {$a$};
\node (s2) [right=of s1] {$b$};
\node (s3) [above right=0cm and 1cm of s2] {$c$};
\node (s4) [below right=0cm and 1cm of s2] {$d$};

\node[right=6cm of s2, text width=4cm] {%

\begin{verbatim}
verbatim environment
\end{verbatim}

};

\path (s1) edge (s2);
\path (s2) edge (s3);
\path (s2) edge (s4);
\end{tikzpicture}

\end{document}

但是水平盒子太满了(6cm 太多了)

同样地,{minipage}环境也起作用。

但是,使用的解决方案tabular不起作用(技术细节,tabular使用\halign原始内容,在受限的水平模式下排版每个单元格内的内容)。

相关内容