我正在编写的文档中充满了箭头图,因此我想创建一个新的命令 \diagram,这样就不必每次都输入 tikzpictures 的设置。我把
\newcommand{\diagram}[2]{
\begin{tikzpicture} [baseline=(current bounding box.center),
grade/.style={sloped,fill=white,inner sep=1pt,font=\tiny},
equal/.style={-,double distance=3pt}]
\matrix (m) [matrix of math nodes,
row sep=2em, column sep=2em,
text height=1.5ex, text depth=0.25ex]
{ #1 };
#2
\end{tikzpicture}
}
所以在代码中我只需写
\diagram{%matrix_of_nodes}{%paths}
。
例如
\diagram{A & B \\
C & D \\}
{\path[->,font=\scriptsize]
(m-1-1) edge (m-2-2);}
但是当我编译文件时(我使用 TexMaker),它返回错误
“!包 pgfbasematrix 错误:单个 & 符号与错误的 catcode 一起使用。”
并且它突出显示了定义边缘的线。如果我编写整个脚本,则不会发生此问题,因此我不明白问题可能出在哪里。
有谁能够帮助我?
答案1
&
问题源于参数中的使用,这是有问题的,因为它们是特殊字符,而 PGF 希望以特殊方式处理它们。
一种解决方案可能是使用环境(无论如何我发现它更好)和一个避免需要参数的技巧:
\documentclass[tikz,border=10pt]{standalone}
\usepackage{tikz}
\usetikzlibrary{matrix}
\newenvironment{diagram}{
\begin{tikzpicture} [baseline=(current bounding box.center),
grade/.style={sloped,fill=white,inner sep=1pt,font=\tiny},
equal/.style={-,double distance=3pt}]
\matrix (m) [matrix of math nodes,
row sep=2em, column sep=2em,
text height=1.5ex, text depth=0.25ex]
}{
\end{tikzpicture}
}
\begin{document}
\begin{diagram}{A & B \\ C & D \\};
\path[->,font=\scriptsize]
(m-1-1) edge (m-2-2);
\end{diagram}
\end{document}
如果需要,您还可以使用以下命令更改用于分隔列的字符ampersand replacement
:
\documentclass[tikz,border=10pt]{standalone}
\usepackage{tikz}
\usetikzlibrary{matrix}
\newenvironment{diagram}[1]{
\begin{tikzpicture} [ampersand replacement=\&,baseline=(current bounding box.center),
grade/.style={sloped,fill=white,inner sep=1pt,font=\tiny},
equal/.style={-,double distance=3pt}]
\matrix (m) [matrix of math nodes,
row sep=2em, column sep=2em,
text height=1.5ex, text depth=0.25ex]{#1};
}{
\end{tikzpicture}
}
\begin{document}
\begin{diagram}{A \& B \\ C \& D \\}
\path[->,font=\scriptsize]
(m-1-1) edge (m-2-2);
\end{diagram}
\end{document}
请注意,参数后面没有“” ,而是;
使用“ ” 。\&
&
通过这个技巧,您还可以按照最初的意图定义宏:
\documentclass[tikz,border=10pt]{standalone}
\usepackage{tikz}
\usetikzlibrary{matrix}
\newcommand{\diagram}[2]{
\begin{tikzpicture} [ampersand replacement=\&,baseline=(current bounding box.center),
grade/.style={sloped,fill=white,inner sep=1pt,font=\tiny},
equal/.style={-,double distance=3pt}]
\matrix (m) [matrix of math nodes,
row sep=2em, column sep=2em,
text height=1.5ex, text depth=0.25ex]{#1};
#2
\end{tikzpicture}
}
\begin{document}
\diagram{A \& B \\ C \& D \\}{\path[->,font=\scriptsize] (m-1-1) edge (m-2-2);}
\end{document}
但我仍然会使用环境,它感觉更自然,并且可以避免#2
其中有特殊字符时出现的麻烦。
如果你这样做只是为了避免样式定义重复:
您还可以使用样式来减少冗余:
\documentclass[tikz,border=10pt]{standalone}
\usepackage{tikz}
\usetikzlibrary{matrix}
\tikzset{
diagram/.style = {
baseline=(current bounding box.center),
grade/.style={sloped,fill=white,inner sep=1pt,font=\tiny},
equal/.style={-,double distance=3pt},
every matrix/.style={
matrix of math nodes,
row sep=2em, column sep=2em,
text height=1.5ex, text depth=0.25ex
}
}
}
\begin{document}
\begin{tikzpicture}[diagram]
\matrix (m) {A & B \\ C & D \\};
\path[->,font=\scriptsize] (m-1-1) edge (m-2-2);
\end{tikzpicture}
\end{document}
现在每个图表的重复次数很少,并且您拥有更大的灵活性。
答案2
使用ampersand replacement=\&
似乎是最好的策略;不过,我建议您尝试tikz-cd
一下:
\documentclass[tikz,border=10pt]{standalone}
\usepackage{tikz-cd}
\begin{document}
\begin{tikzcd}[row sep=2em,column sep=2em]
A \arrow[dr] & B \\
C & D
\end{tikzcd}
\end{document}