冲突:onlyamsmath 和 TikZ

冲突:onlyamsmath 和 TikZ

为了强制我自己和合作者只使用 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 指出的那样,这当然仍然会禁用onlyamsmathTikZ 图片内的检查

\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}

相关内容