![我应该使用什么命令来提前警告这次碰撞?](https://linux22.com/image/387879/%E6%88%91%E5%BA%94%E8%AF%A5%E4%BD%BF%E7%94%A8%E4%BB%80%E4%B9%88%E5%91%BD%E4%BB%A4%E6%9D%A5%E6%8F%90%E5%89%8D%E8%AD%A6%E5%91%8A%E8%BF%99%E6%AC%A1%E7%A2%B0%E6%92%9E%EF%BC%9F.png)
在搜索了几个子文件后,我把我认为是一个错误的范围缩小到了这个 MWE
\documentclass{article}
\usepackage{amsmath, amssymb}
\newcommand{\R}{\mathbb{R}}
\begin{document}
$\R$
\newdimen\R
\R=.4cm
$\R$
\end{document}
显然是用户错误。虽然这是我复制粘贴代码而没有仔细注意它们使用的变量时得到的。我应该使用什么命令来警告编译时出现这种冲突,而不是得到错误! Missing number...
并不得不搜索多个文件来查找可能是什么?
\def
我觉得这与……类似\newcommand
。
答案1
您应该使用 LaTeX 的\newlength
and\setlength
而不是\newdimen
and=
作业。
\documentclass{article}
\usepackage{amsmath, amssymb}
\newcommand{\R}{\mathbb{R}}
\begin{document}
$\R$
\newlength\R
\setlength\R{.4cm}
$\R$
\end{document}
答案2
是的,和 的问题一样\def
。
该\newdimen
宏来自纯 TeX,并且由于历史原因它存在于 LaTeX 中:为了简化从纯 TeX 的过渡,LaTeX 加载了纯 TeX 的副本,但保留了一些重复使用的命令(\line
例如)。
普通 TeX 和 LaTeX 之间的唯一区别\newdimen
是前者是\outer
而后者不是。
\outer\def\newdimen{\alloc@1\dimen\dimendef\insc@unt} %% <-- plain TeX
\def\newdimen{\alloc@1\dimen\dimendef\insc@unt} %% <--- LaTeX (up to 2015)
LaTeX 的定义在 2015 年略有改变,因为引入了一组不同的分配宏来应对 e-TeX 提供的扩展寄存器范围。
LaTeX 中的宏\alloc@
(及其当前变体)本质上与 plain 中的相同;\dimendef
原语(最终负责为\foo
in分配所需含义\newdimen\foo
)不检查控制序列的定义性。
执行定义和分配并记录在手册中的 LaTeX 命令都会进行检查。
知道的用户\newdimen
可以利用它,如果他们愿意的话,警告他们应该知道自己在做什么。更重要的是,他们不应该把充满\newdimen
和 的序言\def
交给他们的伙伴或同事,因为他们不是 TeX 专家,他们会被奇怪的错误消息弄得一头雾水,比如Missing $
当他们试图打印 *façon• 时(仅仅因为他们朋友的序言中有\def\c{\gamma}
,这实际上发生了)。
除了检查之外,\newdimen
和之间还有区别吗?是的,但区别很小:是纯 TeX 的包装器,因此它分配一个寄存器而不是一个。如果不使用 LaTeX 语法设置长度,即,则此差异可能会很明显。\newlength
\newlength
\newskip
\skip
\dimen
\setlength
答案3
您可以创建一个包装器,\newdimen
在这种情况下它会给出错误。
\documentclass{article}
\usepackage{etoolbox}
\usepackage{amsmath, amssymb}
\newcommand{\R}{\mathbb{R}}
\newcommand{\newdimension}[1]{%
\ifundef{#1}
{\newdimen#1}
{\errmessage{command \expandafter\string#1 already defined - can't create dimension}}}
\begin{document}
$\R$
\newdimension{\R}
\R=.4cm
$\R$
\newdimension{\mydim}
\mydim=.4cm
\showthe\mydim
\end{document}