我找到了一个很好的例子此处绘制链条图并一直在尝试让它工作。我打开了一个新文档在 WriteLaTeX 上,这里,并放入链式绘图的最小前言,即
\documentclass{beamer}
\usepackage{tikz}
\usetikzlibrary{matrix,arrows,chains}
\begin{document}
\begin{frame}{Chains}
% http://texblog.net/latex-archive/maths/pgf-tikz-commutative-diagram/
\tikzset{join/.code=\tikzset{after node path={%
\ifx\tikzchainprevious\pgfutil@empty\else(\tikzchainprevious)%
edge[every join]#1(\tikzchaincurrent)\fi}}}
\tikzset{>=stealth',every on chain/.append style={join},every join/.style={->}}
\end{frame}
\end{document}
我收到一个错误,指出有一个非法参数数字在里面定义,\test
而我的意思是输入##
而不是#
,不是吗?
如果我删除这些tikzset
行,那么文档就可以编译。我在非beamer
文档中遇到了同样的问题。
我只是在使用 WriteLaTeX,没有任何工具可以让我深入调试以tikz
寻找答案;我只是一个新手用户tikz
,每次只使用一个工作示例并调整其中的一个,当它们出现问题时就放弃;tikz
我从网上挖掘的许多其他示例都很好用。但是这个我甚至无法启动。
编辑:把符号放在[fragile]
后面\begin{frame}
让我避开了错误。现在下面的绘图看起来不太好(箭头没有画出来;所有的箭头标签在开头都堆积在一起:
\begin{tikzpicture}[start chain] {
\node[on chain] {$0$};
\node[on chain] {$A$} ;
\node[on chain, join={node[above]
{$\scriptstyle\varphi$}}] {$B$};
\node[on chain, join={node[above]
{$\scriptstyle\psi$}}] {$C$};
\node[on chain] {$0$}; }
\end{tikzpicture}
合并两条tikzset
指令并删除stealth'
子指令对结果的外观没有影响。
答案1
以下是一份将要编译的文档:
\documentclass{beamer}
\usepackage{tikz}
\usetikzlibrary{matrix,arrows,chains}
\begin{document}
% http://texblog.net/latex-archive/maths/pgf-tikz-commutative-diagram/
\makeatletter
\tikzset{join/.code=\tikzset{after node path={%
\ifx\tikzchainprevious\pgfutil@empty\else(\tikzchainprevious)%
edge[every join]#1(\tikzchaincurrent)\fi}}}
\makeatother
\begin{frame}{Chains}
\tikzset{>=stealth',every on chain/.append style={join},
every join/.style={->}}
\begin{tikzpicture}[start chain] {
\node[on chain] {$X$};
\node[on chain, join={node[above] {$\scriptstyle f$}}] {$Y$};
}
\end{tikzpicture}
\end{frame}
\end{document}
您的代码至少存在两个问题。
#
在 beamer 框架中会使 beamer 解析混乱。相反,您可以将此\tikzset
命令移出框架。相同的代码片段包含一个
@
符号,因此需要成对地括起来\makeatletter / \makeatother
。
框架内容的限制在 beamer 手册中有如下描述
⟨环境内容⟩ 可以是普通的 LATEX 文本,但不能包含
\verb
命令或逐字环境或任何改变字符代码的环境,除非给出了脆弱选项。
由于它#
不是普通的文本字符,因此被排除在标准框架内容之外。@Daniel 指出,您可以使用fragile
框架上的选项来解决这个问题。@Daniel 进一步指出,尽管手册中有描述,但这仍然可用:
如果框架包含易碎文本,则使用不同的内部机制来排版框架,以确保框架内的字符代码可以重置。切换到另一种内部机制的代价是,您无法使用覆盖,或者需要写入和读回外部文件(这并不总是可取的)。
代码写入外部文件,导致编译速度略慢,但不会丢失任何覆盖功能。请参阅@Daniel 对另一个问题的回答了解更多信息。