运行以下命令:
\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
可能变成;
活跃角色的情况(例如法语),Ti钾z 为活动的;
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。