我应该使用什么命令来提前警告这次碰撞?

我应该使用什么命令来提前警告这次碰撞?

在搜索了几个子文件后,我把我认为是一个错误的范围缩小到了这个 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 的\newlengthand\setlength而不是\newdimenand=作业。

\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原语(最终负责为\fooin分配所需含义\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}

相关内容