为什么使用 babel 时 tikz-cd 会缺少 \endcsname?

为什么使用 babel 时 tikz-cd 会缺少 \endcsname?

为什么我在第 15 行收到错误Missing \endcsname inserted

\documentclass{article}

%\usepackage[strict]{csquotes}
%\usepackage[autostyle=true]{csquotes}
\usepackage[T2A,T1]{fontenc}
\usepackage[russian,main=english]{babel}

\usepackage{tikz-cd}

\begin{document}

\begin{tikzcd}
  f \arrow[d, "\partial"] \\
  g
\end{tikzcd}

\end{document}

russian如果我使用以下选项,则会再次收到错误:

\usepackage[T1]{fontenc}
\usepackage[german,main=english]{babel}

正如注释掉的序言行所示,我尝试csquotes以两种不同的方式调用包来避免这个问题,但也失败了。

我愿意不是babel但是使用选项时会出现错误french,例如:

\usepackage[T1]{fontenc}
\usepackage[french,main=english]{babel}

答案1

这很可能是由于一个活动字符造成的。如果您在 后"添加 ,它应该会起作用。\usetikzlibrary{babel}\usepackage{tikz-cd}

使用 时babel,当所选语言为 时french1字符"不活动,但是它当您选择germanrussian时。 活动字符在解析时经常会导致问题(尤其是对某些人或特定条件有效,但在其他条件下无效的字符)。 这当然解释了您在三种语言之间看到的差异。

babel使用 激活的 Z 库\usetikzlibrary{babel}可以在大多数情况下避免这些问题。引自Z 和 PGF 手册(部分处理 Catcodes 和 Babel 包):

在 Ti 内部Z 图片,大多数符号需要有类别代码 12(普通文本)才能确保解析器正常工作。当babel使用像 这样的软件包时,情况通常并非如此,这些软件包会积极更改类别代码。

为了解决这个问题,TiZ 提供了一个小型库,也称为babel(但是,它也可以与任何其他全局更改类别代码的包一起使用)。它的作用是在每个节点的开头重置类别代码,{tikzpicture}并在每个节点的开头恢复它们。在几乎所有情况下,这正是您所期望和需要的,因此我建议始终通过以下方式加载此库\usetikzlibrary{babel}

您可以轻松确定角色何时处于活动状态。只需在要进行测试的位置"添加即可。如果角色处于非活动状态,TeX 将打印类似以下内容的内容:\show"

> the character ".
l.16 \show"

另一方面,如果它处于活动状态,您应该会看到更类似于以下内容的内容:

> "=macro:
->\active@prefix "\active@char" .
l.16 \show"

是的,活动字符是一个宏。TeX 会像使用以下方式定义的其他宏一样对其进行扩展\def(实际上,使用\def 这是对活动字符进行定义的正常 TeX 方式)。

对于某些人来说是活动的,而对于其他人来说不是活动的字符在解析输入时会导致问题,因为对于 TeX 来说,活动的"(即,"catcode 为 13 的字符标记)与“普通标记”(catcode 为 12 的字符标记)是不同的标记"。解析器必须进行特殊处理,以使 TeX 在给定上下文中以相同的方式处理它们(例如使用\scantokens)。


脚注

  1. babel未加载时,或者已加载但所选语言为 时english"在正常情况下也不会处于活动状态。

相关内容