使用 tikzpicture 声明新命令时出现问题

使用 tikzpicture 声明新命令时出现问题

我计划将一些常见的交换图和短正合序列作为新命令放入我的 *.sty 文件中。但是,将此代码放入我的 *.sty 文件中

\ProvidesPackage{myLayout}
\usepackage{ifthen,amsopn}
\newcommand{\SES}[3]{
\begin{center}
\begin{tikzpicture}[every node/.style={midway}]
\matrix[column sep={2em},
        row sep={0em}] at (0,0)
{ \node(A) {$0$} ;
& \node(B) {#1} ;
& \node(C) {#2} ;
& \node(D) {#3} ;
& \node(E) {$0$} ; \\};
\draw[->] (A) -- (B)  node[anchor=south] {};
\draw[->] (B) -- (C)  node[anchor=south] {};
\draw[->] (C) -- (D)  node[anchor=south] {};
\draw[->] (D) -- (E)  node[anchor=south] {};
\end{tikzpicture}
\end{center}
}

将整个内容复制粘贴到我的 *.tex 文档中(除 \newcommand 部分之外),并用 $A$、$B$ 和 $C$ 替换 #1、#2、#3,这样我就得到了一个精彩的精确序列图。

我想知道当我在 \newcommand 中粘贴完全相同的代码时出了什么问题。此外,我想知道是否有更有效的方法来“保存 tikzpicture 的布局”,这样我就不必每次都复制粘贴相同的代码(特别是如果我只是进行微小的调整)。

最终的目标是只写一行这样的

\SES{A}{B}{C}

得到一个短正合序列。

一个通用且有效的解决方案将会是一个非常好的优势。

任何帮助都将非常感激。

答案1

您可以使用ampersand replacement;但是,我不会使用center环境,以获得更好的灵活性(而是使用\[...\]命令)。您还可以使用简化代码matrix of math nodes

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{matrix}

\newcommand{\SES}[3]{%
  \begin{tikzpicture}[every node/.style={midway},ampersand replacement=\&]
  \matrix [matrix of math nodes,column sep=2em, row sep=0em] at (0,0) {
  \node(A) {0} ;
  \& \node(B) {#1} ;
  \& \node(C) {#2} ;
  \& \node(D) {#3} ;
  \& \node(E) {0} ; \\};
  \draw[->] (A) -- (B)  node[anchor=south] {};
  \draw[->] (B) -- (C)  node[anchor=south] {};
  \draw[->] (C) -- (D)  node[anchor=south] {};
  \draw[->] (D) -- (E)  node[anchor=south] {};
  \end{tikzpicture}%
}

\begin{document}

\[
\SES{A}{B}{C}
\]

\end{document}

在此处输入图片描述

不过,我建议使用tikz-cd

\documentclass{article}
\usepackage{tikz-cd}

\newcommand{\SES}[3]{%
  \begin{tikzcd}[ampersand replacement=\&]
  0 \arrow[r] \& #1 \arrow[r] \& #2 \arrow[r] \& #3 \arrow[r] \& 0
  \end{tikzcd}%
}

\begin{document}

\[
\SES{A}{B}{C}
\]

\end{document}

在此处输入图片描述

通过简化的语法,tikz-cd您可能会放弃使用宏定义几种类型的交换图。

答案2

问题在于 latex 在 tikz 解析 & 之前就转换了 &。请参阅第 1048 页上的示例。

\documentclass{article}
\usepackage{tikz}

\newcommand{\SES}[3]{%
\begin{center}
\begin{tikzpicture}[every node/.style={midway}]
\let\&=\pgfmatrixnextcell
\matrix[column sep={2em},
        row sep={0em}] at (0,0)
{ \node(A) {$0$} ;
\& \node(B) {#1} ;
\& \node(C) {#2} ;
\& \node(D) {#3} ;
\& \node(E) {$0$} ; \\};
\draw[->] (A) -- (B)  node[anchor=south] {};
\draw[->] (B) -- (C)  node[anchor=south] {};
\draw[->] (C) -- (D)  node[anchor=south] {};
\draw[->] (D) -- (E)  node[anchor=south] {};
\end{tikzpicture}
\end{center}
}

\begin{document}

\SES{$A$}{$B$}{$C$}

\end{document}

& 符号替换

相关内容