当我将包含 TikZ 矩阵的代码传递给 TeX 宏时,它会打印以下错误消息:! Package pgfbasematrix Error: Single ampersand used with wrong catcode.
\documentclass{article}
\usepackage{tikz}
\def\identity#1{#1}
\begin{document}
\begin{tikzpicture}
\identity{
\matrix {
\node {1}; & \node{2};\\
\node {3}; & \node{4};\\
};
}
\end{tikzpicture}
\end{document}
为什么会发生这种情况? 有什么方法可以解决这个问题吗?
理由:
我使用此类宏为我的学生创建练习表。我喜欢将答案嵌入源代码中,但自然不希望它们显示在练习表上。因此,我用宏标记我的代码,例如\problem{}
和\answer{}
,然后根据我是否要编译练习表或参考解决方案在文档标题中适当定义这些宏。
可能最好的方法(我猜)是将我的标记宏替换为使用\iftrue
或\iffalse
包含或跳过文档部分内容的环境,但目前我还没有准备好转换所有文件。这就是为什么我正在寻找该问题的短期解决方案(这一点我很好奇)。
答案1
来自 pgf 手册:
17.5 关于主动角色的考虑
尽管
TikZ
似乎使用&
来分隔单元格,但pgf
实际上使用不同的命令来分隔单元格,即命令\pgfmatrixnextcell
,而使用普通&
字符通常会失败。发生的事情是,TikZ
创建&
一个活动字符,然后将该字符定义为等于\pgfmatrixnextcell
。在大多数情况下,这会很好地工作,但有时&
无法激活;例如,因为矩阵用于某些宏的参数或矩阵包含包含正常tabular
环境的节点。在这种情况下,您可以使用以下选项来避免每次都必须输入\pgfmatrixnextcell
:
/tikz/ampersand replacement= <macro name or empty>
因此,解决方案是使用\pgfmatrixnextcell
而不是通常的&
或使用ampersand replacement
:
\documentclass{article}
\usepackage{tikz}
\def\identity#1{#1}
\begin{document}
\begin{tikzpicture}
\identity{
\matrix[ampersand replacement=\&] {
\node {1}; \& \node{2};\\
\node {3}; \& \node{4};\\
};
}
\end{tikzpicture}
\end{document}