为了强制我自己和合作者只使用 AMS-Math 命令,我在序言中加载了这个包:
\usepackage[all,warning]{onlyamsmath}
但是,当将其与 结合使用时TikZ
,我在使用 TikZ 的 calc 库时会遇到麻烦,因为这涉及使用$
进行计算。我该如何解决这个冲突?
MWE:尝试取消注释onlyamsmath
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{tikz}
\usetikzlibrary{positioning,calc}
\usepackage[all,warning]{onlyamsmath}
\begin{document}
\begin{tikzpicture}
\node (node1) [] {Box 2 text};
\node (node2) [right=of node1] {Box 3 text};
\draw[->] (node2.north) -- ++(0,0.5) -| ($ (node1.east) + (0.25,0) $);
\end{tikzpicture}
\end{document}
答案1
TikZ 3.0.0 有一个babel
旨在与babel
包兼容的库,它修复了其中的 catcodes tikzpicture
,并且似乎也onlyamsmath
为我解决了兼容性问题。
注意:正如 cfr 指出的那样,这当然仍然会禁用onlyamsmath
TikZ 图片内的检查
\documentclass{article}
\usepackage[all,warning]{onlyamsmath}
\usepackage{tikz}
\usetikzlibrary{calc, babel}
\begin{document}
\begin{tikzpicture}
\draw (0,0) coordinate (A) node[below] {inline equation: $a^b$} --
(4,0) coordinate (B) node[below, text width=3cm] {
Checking does still occur within nodes, so this produces a warning:
$$a^b$$
} --
($ (A)!0.5!(B)!sin(60)*2!90:(B) $) node[above] {calculated point} -- cycle;
\end{tikzpicture}
\end{document}
来自 TikZ 手册:
12.2.3 处理 Catcodes 和 Babel 包
在 TikZ 图片中,大多数符号需要具有类别代码 12(普通文本),以确保解析器正常工作。当使用 babel 等软件包时,情况通常并非如此,因为这些软件包会积极更改类别代码。
为了解决这个问题,Tik Z 提供了一个小型库,也称为 babel(但是,它也可以与任何其他全局更改类别代码的包一起使用)。它的作用是在每个 {tikzpicture} 的开头重置类别代码,并在每个节点的开头恢复它们。在几乎所有情况下,这正是您所期望和需要的,因此我建议始终通过说 \usetikzlibrary{babel} 来加载此库。有关类别代码究竟发生了什么的详细信息,请参阅第 43 节。
答案2
这两个包确实不兼容,因为onlyamsmath变为$
活动字符,以检查是否$$...$$
被使用。
这与蒂克兹。但是,包裹检查的东西是
eqnarray
eqnarray*
displaymath
$$
所以这似乎不是必需的。但是,以下代码
\usepackage{etoolbox}
\preto\tikzpicture{\catcode`$=3 }
\preto\tikz{\catcode`$=3 }
加载 TiKZ 后插入可能会解决不兼容问题。
答案3
$
您可以按如下方式调整环境中的 catcode tikzpicture
:
\documentclass{article}
\usepackage[all,warning]{onlyamsmath}
\usepackage{tikz}
\usetikzlibrary{calc}
\makeatletter
\let\@@tikzpicture\tikzpicture
\def\tikzpicture{\catcode`\$=3 \@@tikzpicture}
\makeatother
\begin{document}
\begin{tikzpicture}
\draw [red,ultra thick] (0,0) -- ($(2,0)+(2,2)$);
\end{tikzpicture}
\end{document}
我已经使用您的 MWE 测试了这个解决方案(以及@egreg 的解决方案),并且这两个解决方案似乎都运行良好。
答案4
这种$$
保护措施onlyamsmath
会带来很多问题,不仅仅是tikz
(参见问题)。要禁用此不兼容的功能,但不禁用 的其他保护onlyamsmath
,请在您的序言中添加后加载中onlyamsmath
。
\AtBeginDocument{\catcode`\$=3}