为什么我在第 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
,当所选语言为 时french
,1字符"
不活动,但是它是当您选择german
或russian
时。 活动字符在解析时经常会导致问题(尤其是对某些人或特定条件有效,但在其他条件下无效的字符)。 这当然解释了您在三种语言之间看到的差异。
钛babel
钾使用 激活的 Z 库\usetikzlibrary{babel}
可以在大多数情况下避免这些问题。引自钛钾Z 和 PGF 手册(部分处理 Catcodes 和 Babel 包):
在 Ti 内部钾Z 图片,大多数符号需要有类别代码 12(普通文本)才能确保解析器正常工作。当
babel
使用像 这样的软件包时,情况通常并非如此,这些软件包会积极更改类别代码。为了解决这个问题,Ti钾Z 提供了一个小型库,也称为
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
)。
脚注
- 当
babel
未加载时,或者已加载但所选语言为 时english
,"
在正常情况下也不会处于活动状态。