如果你这样做只是为了避免样式定义重复:

如果你这样做只是为了避免样式定义重复:

我正在编写的文档中充满了箭头图,因此我想创建一个新的命令 \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}

在此处输入图片描述

相关内容