使用 breqn 包时 Tikz-cd 出现问题

使用 breqn 包时 Tikz-cd 出现问题

运行以下命令:

\documentclass[11pt,a4paper]{article} \usepackage{tikz-cd}
\usepackage{tikz-cd}
\begin{document}

\begin{tikzcd}  0 \arrow{r} & ker{h} \arrow{r} & H(C;G)  \arrow{r} & Hom{(H_n(C),G)} \arrow{r} & 0 \\ \end{tikzcd}

\end{document}

毫无问题地给出了我想要的图表。尝试在包含包 breqn 的同时编译它会导致 TexMaker 永远尝试编译 PDF。问题似乎是由我的 tikz 图表中的分号引起的。如果我删除分号,它就会编译。如果我不使用包 breqn,它就会编译。

我很困惑为什么 breqn 会导致这个问题。我现在实际上没有使用该软件包,但我认为如果可能的话我宁愿保留它。有没有办法解决这个问题?

我尝试为“;”设置一个新命令,并用它来代替代码中的“;”,但这导致了同样的问题。同样,用花括号或其他任何方式将“;”括起来似乎不起作用。

有人能告诉我为什么包含 breqn 包会导致这个问题吗?我正在使用 texmaker,但这似乎也在 overleaf 中导致了同样的问题。

答案1

为了应对babel可能变成;活跃角色的情况(例如法语),Tiz 为活动的;as提供了一个定义\tikz@nonactivesemicolon,它只是一个标准类别代码 12 分号。

但是,将breqn的数学代码更改;"8000(十六进制,十进制为 32768),通常称为数学活跃。这意味着当 TeX 在数学模式下发现分号时,它会将其定义视为活动字符,也就是\tikz@nonactivesemicolon变成;,它是数学活动字符,因此它会被其定义替换,也就是\tikz@nonactivesemicolon……

无限循环。

当然,breqn以不同的方式定义活动分号,但在tikzpicture(或tikz-cd内部为tikzpicture)中,此含义被覆盖。

您可以输入分号

\mathchar\numexpr"6000+`;\relax

但不使用会更简单breqn

\documentclass[11pt,a4paper]{article}
\usepackage{amsmath}
\usepackage{tikz-cd}
\usepackage{breqn}

\DeclareMathOperator{\Hom}{Hom}

\begin{document}

\begin{tikzcd}
0 \arrow[r] & \ker h \arrow[r] &
H(C\mathchar\numexpr"6000+`;\relax G) \arrow[r] & \Hom(H_n(C),G) \arrow[r] & 0
\end{tikzcd}

\end{document}

请注意我如何输入\ker和定义操作员名称\Hom

在此处输入图片描述

更友好的解决方案:

\documentclass[11pt,a4paper]{article}
\usepackage{amsmath}
\usepackage{tikz-cd}

\makeatletter
\protected\edef\tikz@nonactivesemicolon{%
  \noexpand\ifmmode
    \mathchar\the\mathcode`;
  \noexpand\else
    ;%
  \noexpand\fi
}
\makeatother

\usepackage{breqn}

\DeclareMathOperator{\Hom}{Hom}

\begin{document}

\begin{tikzcd}
0 \arrow[r] & \ker h \arrow[r] &
H(C;G) \arrow[r] & \Hom(H_n(C),G) \arrow[r] & 0
\end{tikzcd}

\end{document}

请注意,冒号、竖线和感叹号也可能会出现类似的问题。完整的修复方法:

\documentclass[11pt,a4paper]{article}
\usepackage{amsmath}
\usepackage{tikz-cd}

\makeatletter
\def\fixtikzforbreqn#1#2{%
  \protected\edef#1{\noexpand\ifmmode\mathchar\the\mathcode`#2 \noexpand\else#2\noexpand\fi}%
}
\fixtikzforbreqn\tikz@nonactivesemicolon;
\fixtikzforbreqn\tikz@nonactivecolon:
\fixtikzforbreqn\tikz@nonactivebar|
\fixtikzforbreqn\tikz@nonactiveexlmark!
\makeatother

\usepackage{breqn}

\DeclareMathOperator{\Hom}{Hom}

\begin{document}

\begin{tikzcd}
0 \arrow[r] & \ker h \arrow[r] &
H(C;G) \arrow[r] & \Hom(H_n(C),G) \arrow[r] & 0:!|
\end{tikzcd}

\end{document}

答案2

我同意 @daleif 和 @egreg 的观点,你不应该使用 breqn。如果你绝对必须这样做,并且不了解 egreg 对活动字符的了解,但又想添加一些会造成麻烦的东西,这里有一种使用它的方法。只需使用保存箱即可。

\documentclass[11pt,a4paper]{article} 
\usepackage{tikz-cd}
\usepackage{breqn}
% \usepackage{amsmath}
% \DeclareMathOperator{\Hom}{Hom}
% \DeclareMathOperator{\ker}{ker}
\newsavebox\DontUseBreqn
\begin{document}
\savebox\DontUseBreqn{$H(C; G)$}
\begin{tikzcd}  
0 \arrow{r} & \mathrm{ker} h \arrow{r} & \usebox\DontUseBreqn   \arrow{r} &
\mathrm{Hom}(H_n(C),G) \arrow{r} & 0 \\ 
\end{tikzcd}
\end{document}

在此处输入图片描述

但实际上你不应该使用 breqn。

相关内容