尝试让 Tikz 链示例运行

尝试让 Tikz 链示例运行

我找到了一个很好的例子此处绘制链条图并一直在尝试让它工作。我打开了一个新文档在 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}

您的代码至少存在两个问题。

  1. #在 beamer 框架中会使 beamer 解析混乱。相反,您可以将此\tikzset命令移出框架。

  2. 相同的代码片段包含一个@符号,因此需要成对地括起来\makeatletter / \makeatother

框架内容的限制在 beamer 手册中有如下描述

⟨环境内容⟩ 可以是普通的 LATEX 文本,但不能包含\verb命令或逐字环境或任何改变字符代码的环境,除非给出了脆弱选项。

由于它#不是普通的文本字符,因此被排除在标准框架内容之外。@Daniel 指出,您可以使用fragile框架上的选项来解决这个问题。@Daniel 进一步指出,尽管手册中有描述,但这仍然可用:

如果框架包含易碎文本,则使用不同的内部机制来排版框架,以确保框架内的字符代码可以重置。切换到另一种内部机制的代价是,您无法使用覆盖,或者需要写入和读回外部文件(这并不总是可取的)。

代码写入外部文件,导致编译速度略慢,但不会丢失任何覆盖功能。请参阅@Daniel 对另一个问题的回答了解更多信息。

相关内容