![tikz 节点中的逐字](https://linux22.com/image/346641/tikz%20%E8%8A%82%E7%82%B9%E4%B8%AD%E7%9A%84%E9%80%90%E5%AD%97.png)
我正在尝试在紧邻其他节点的 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
原始内容,在受限的水平模式下排版每个单元格内的内容)。