6

Running the following:

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

Gives me the diagram that I want with no problems. Trying to compile this whilst including the package breqn leads to TexMaker trying to compile the PDF forever. The problem appears to be caused by the semicolon in my tikz diagram. If I remove the semicolon, it compiles. If I don't use the package breqn, it compiles.

I am struggling to understand why breqn would cause this issue. I'm not actually using that package, now, but I think that I would rather keep it if possible. Is there a way to work around this?

I've tried setting up a new command for ";", and using that in place of the ";" in my code, but that caused the same issue. Similarly, Enclosing the ";" in curly braces or anything else does not seem to work.

Could anyone tell me why including the package breqn is causing this problem? I'm using texmaker, but this appears to also cause the same problem in overleaf.

  • 2
    Generally don't use breqn, it changes a lot of things that are not compatible with other packages and has several bugs. – daleif Nov 19 '18 at 13:40
7

In order to cope with babel that may make ; into an active character (with French, for instance), Tikz provides a definition for the active ; as \tikz@nonactivesemicolon which is just a standard category code 12 semicolon.

However, breqn changes the mathcode of ; to "8000 (hexadecimal, in decimal it is 32768), usually known as math active. This means that when TeX finds a semicolon in math mode it looks for its definition as an active character, which is \tikz@nonactivesemicolon that becomes ;, which is math active, so it is replaced by its definition, which is \tikz@nonactivesemicolon

Infinite loop.

Of course, breqn defines the active semicolon in a different way, but in a tikzpicture (or tikz-cd which internally is a tikzpicture) this meaning is overridden.

You could input the semicolon as

\mathchar\numexpr"6000+`;\relax

but it's simpler to not use 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}

Note how I input \ker and define an operator name for \Hom.

enter image description here

A more friendly solution:

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

Note that also colon, bar and exclamation mark might give a similar problem. A complete fix:

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

I agree with @daleif and @egreg that you shouldn't use breqn. Here is a way to use it, if you absolutely must, and do not have the egreg's knowledge about active characters, but want to add something that causes trouble. Just use a savebox.

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

enter image description here

But really you should just not use breqn.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.