我计划将一些常见的交换图和短正合序列作为新命令放入我的 *.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}