我正在编写一个包,其中除其他外,还提供缩写\mathbb
,如下所示:
\newcommand{\A}{\mathbb A}
\def\B{\mathbb B}
\def\C{\mathbb C}
\newcommand{\D}{\mathbb D}
\newcommand{\E}{\mathbb E}
\newcommand{\F}{\mathbb F}
\def\G{\mathbb G}
\def\H{\mathbb H}
\newcommand{\I}{\mathbb I}
\newcommand{\J}{\mathbb J}
\newcommand{\K}{\mathbb K}
\def\L{\mathbb L}
\def\M{\mathbb M}
\newcommand{\N}{\mathbb N}
\def\O{\mathbb O}
\def\P{\mathbb P}
\newcommand{\Q}{\mathbb Q}
\newcommand{\R}{\mathbb R}
\def\S{\mathbb S}
\def\T{\mathbb T}
\def\U{\mathbb U}
\newcommand{\V}{\mathbb V}
\newcommand{\W}{\mathbb W}
\newcommand{\X}{\mathbb X}
\newcommand{\Y}{\mathbb Y}
\newcommand{\Z}{\mathbb Z}
\DeclareSymbolFont{bbold}{U}{bbold}{m}{n}
\DeclareSymbolFontAlphabet{\bb}{bbold}
\def
-振荡的原因\newcommand
是,我看到其中一些命令并不总是定义的,因此选择\newcommand
在某些情况下会出现问题,而\renewcommand
在其他情况下会出现问题,而 while 则\def
通过不检查命令是否定义来绕过这个问题。这个问题的奇怪之处在于,从 s 中删除括号\def
(例如,\def\B{\mathbb B}
删除 周围的括号\mathbb B
,以及从所有其他\def
命令中删除括号)似乎会导致问题。例如,删除除 和 之外的所有括号\B
会\C
导致:
./mworks.sty:844: LaTeX Error: \mathbb allowed only in math mode.
See LaTeX manual or LaTeX Companion for explanation.
Type G <return> for immediate help.
...
1.844 \newcommand{\I}{\mathbb
I}
?
为什么会发生这种情况?
答案1
您可能已经发现了为什么强烈不建议使用 重新定义内核命令\def
。
例如,\H
被定义为给出“匈牙利变音符号”重音;因此,如果您在文档中谈论 Erdős,您将得到一个令人费解的错误,即使您似乎没有使用\H
。实际上,当\usepackage[utf8]{inputenc}
生效时,LaTeX 会将其转换Erdős
为Erd\H{o}s
。您能看出问题所在吗?
不要重新定义内核命令除非你确切地知道你在做什么。如果\newcommand
不能使用,你必须检查命令的含义,如果它是排版重音或类似命令,不重新定义它。
将这些命令添加到包中也是特别糟糕的,即使它是供个人使用的。如果你把它传给你的朋友,他们会开始使用它,甚至可能把它包含在他们提交到其他地方的东西中。正如 Barbara Beeton 在评论中观察到的那样,
如果将这样的文件包与手稿一起提交给出版商,则修改的成本可能会非常高,并且可能会导致手稿被拒绝。
我应该补充一点,她是一位伟大的专家(这我是 AMS 期刊和书籍文字编辑方面的专家。
你可以尝试说
\def\box#1{\fbox{#1}}
看看会发生什么。
当然,语法
\def{\A}{\mathbb A}
是无效的:虽然\newcommand{\A}{...}
是好的,无支架可以遵循\def
。无可挽回的错误也是
\def\B \mathbb B
这确实毫无意义。顺便说一句,首选语法是\mathbb{B}
使用括号来明确界定\mathbb
应用的内容。
答案2
由于发布的代码不会生成显示的错误,因此我将对其进行修改。
这完全的文档演示了该错误。
\RequirePackage{amsfonts}
\newcommand{\A}{\mathbb A}
\def\B{\mathbb B}
\def\C{\mathbb C}
\newcommand{\D}{\mathbb D}
\newcommand{\E}{\mathbb E}
\newcommand{\F}{\mathbb F}
\def\G{\mathbb G}
\def\H \mathbb H
\newcommand{\I}{\mathbb I}
\stop
它产生
$ pdflatex er11
This is pdfTeX, Version 3.1415926-2.5-1.40.14 (TeX Live 2013)
restricted \write18 enabled.
entering extended mode
(./er11.tex
LaTeX2e <2011/06/27>
Babel <3.9j> and hyphenation patterns for 54 languages loaded.
(/usr/local/texlive/2013/texmf-dist/tex/latex/amsfonts/amsfonts.sty)
! LaTeX Error: \mathbb allowed only in math mode.
See the LaTeX manual or LaTeX Companion for explanation.
Type H <return> for immediate help.
...
l.10 \newcommand{\I}{\mathbb
I}
?
立即的解决方法是使其像问题中发布的代码一样,或者正如 egreg 指出的那样,最好不要使用单字母命令并覆盖 LaTeX 内部结构。