我真的希望你们能帮我。我有一张 tikz 图片,使用以下包/库在标准文章模式下运行良好:
\usepackage{tikz}
\usetikzlibrary{matrix,chains,positioning,decorations.pathreplacing,arrows}
但是当我尝试将这些文件传输到投影仪文档时,由于未知原因我无法进行编译。
这是无法使用上述包/库在 beamer 中运行的图像之一的代码。
\begin{tikzpicture}[
plain/.style={
draw=none,
fill=none,
},
dot/.style={draw,shape=circle,minimum size=3pt,inner sep=0,fill=black
},
net/.style={
matrix of nodes,
nodes={
draw,
circle,
inner sep=8.5pt
},
nodes in empty cells,
column sep=0.6cm,
row sep=-11pt
},
>=latex
]
\matrix[net] (mat)
{
|[plain]| \parbox{1cm}{\centering Input\\layer}
& |[plain]| \parbox{1cm}{\centering Hidden\\layer}
& |[plain]| \parbox{1cm}{\centering Output\\layer} \\
& |[plain]| \\
|[plain]| & & |[plain]| \\
|[plain]| & |[plain]| & |[plain]| \\
|[plain]| & |[dot]| \\
|[plain]| & |[plain]| & |[plain]| \\
& |[dot]| & \\
|[plain]| & |[plain]| & |[plain]| \\
|[plain]| & |[dot]| & |[plain]| \\
|[plain]| & |[plain]| & |[plain]| \\
|[plain]| & & |[plain]| \\
& |[plain]| \\
};
\draw[<-o] (mat-2-1) -- node[above] {Open price $x_1$} +(-3cm,0);
\draw[<-o] (mat-7-1) -- node[above] {High price $x_2$} +(-3cm,0);
\draw[<-o] (mat-12-1) -- node[above] {Low price $x_3$} +(-3cm,0);
\foreach \i in {2,7,12}
{ \draw[->] (mat-\i-1) -- (mat-3-2);
\draw[->] (mat-\i-1) -- (mat-11-2);
}
\foreach \ai in {3,11}
{ \draw[->] (mat-\ai-2) -- (mat-7-3);
}
\draw[->] (mat-7-3) -- node[above] {Closing price $y_t$} +(3cm,0) ;
\end{tikzpicture}
我最初的猜测是存在以下问题:
\usetikzlibrary{decorations.pathreplacing}
对我来说奇怪的是它在投影机之外工作。
提前谢谢您!如能尽快回复,我们将不胜感激!
答案1
原因是&
在 TikZ 中重新定义了。分别matrix
考虑和 TikZ 手册中的这些引述:beamer
对于包含任何“脆弱”文本的框架,您还必须使用该
[fragile]
选项,这些文本是“未按照 TEX 通常解释文本的方式进行解释”的任何文本。例如,如果您使用(本地)重新定义字符 含义的包&
,则必须使用此选项。
(beamer
手册,第 12.9 节逐字和脆弱的文本)
尽管 TikZ 似乎使用 & 来分隔单元格,但
pgf
实际上使用不同的命令来分隔单元格,即命令\pgfmatrixnextcell
,使用普通&
字符通常会失败。 发生的情况是,TikZ 会创建&
一个活动字符,然后将该字符定义为等于\pgfmatrixnextcell
。 在大多数情况下,这会很好地工作,但有时&
无法激活;[...]
(pgfmanual.pdf
,第 20.5 节关于活跃角色的注意事项)
换句话说,为了使现有的代码正常运行,您必须向环境fragile
中添加选项frame
,即\begin{frame}[fragile]
。
另一个选项是matrix
使用ampersand replacement
键定义分隔单元格的不同方法。添加例如
ampersand replacement=\&,
风格net
,并使用\&
代替&
。
在下面的代码中,我还将箭头语法从旧的和已弃用的arrows
库转换为新库提供的语法arrows.meta
。(参见第 40 章箭头库pgfmanual
)您可以通过为第一行设置特定样式来减少代码量(参见代码)。最后,与其将样式添加到plain
几乎所有单元格,为什么不将其作为默认样式,而只|[draw]|
在需要的几个单元格中添加样式呢?
\documentclass{beamer}
\usepackage{tikz}
\usetikzlibrary{matrix,arrows.meta}
\begin{document}
\begin{frame}
\begin{tikzpicture}[
dot/.style={draw,shape=circle,minimum size=3pt,inner sep=0,fill=black
},
net/.style={
matrix of nodes,
ampersand replacement=\&,
nodes={
circle,
inner sep=8.5pt,
},
nodes in empty cells,
column sep=0.6cm,
row sep=-11pt,
row 1/.style={nodes={text width=1cm,align=center}}
},
>=Latex
]
\matrix[net] (mat)
{
{Input\\ layer} \& {Hidden\\layer} \& {Output\\layer} \\ % braces are needed around content to not start new row in matrix
|[draw]| \& \\
\& |[draw]| \& \\
\& \& \\
\& |[dot]| \\
\& \& \\
|[draw]| \& |[dot]| \& |[draw]| \\
\& \& \\
\& |[dot]| \& \\
\& \& \\
\& |[draw]| \& \\
|[draw]| \& \\
};
\draw[<-{Circle[open]}] (mat-2-1) -- node[above] {Open price $x_1$} +(-3cm,0);
\draw[<-{Circle[open]}] (mat-7-1) -- node[above] {High price $x_2$} +(-3cm,0);
\draw[<-{Circle[open]}] (mat-12-1) -- node[above] {Low price $x_3$} +(-3cm,0);
\foreach \i in {2,7,12}
{
\draw[->] (mat-\i-1) -- (mat-3-2);
\draw[->] (mat-\i-1) -- (mat-11-2);
}
\foreach \ai in {3,11}
\draw[->] (mat-\ai-2) -- (mat-7-3);
\draw[->] (mat-7-3) -- node[above] {Closing price $y_t$} +(3cm,0) ;
\end{tikzpicture}
\end{frame}
\end{document}