\def 和 \newlength 之间有什么区别?

\def 和 \newlength 之间有什么区别?

我编写了以下 LaTeX 文档。

\documentclass[11pt]{book}

\newlength{\mywidth}
\newlength{\myheight}
\setlength{\mywidth}{85mm}
\setlength{\myheight}{112mm}

\newcommand{\setpagesize}[2]{%
  \special{papersize=#1,#2}%
}

\setpagesize{\mywidth}{\myheight}

\begin{document}
The quick brown fox jumps over the lazy dog
\end{document}

我收到以下错误消息dvipdfmx并且失败了。

$ latex abc.tex
$ dvipdfmx abc.dvi 
abc.dvi -> abc.pdf

** WARNING ** Reading special command failed: "papersize=\mywidth ,\myheight "
[1
** WARNING ** Reading special command failed: "papersize=\mywidth ,\myheight "
]
4327 bytes written

当我使用\def代替\newlength和时\setlength,它起作用了。

\documentclass[11pt]{book}

\def\mywidth{85mm}
\def\myheight{112mm}

\newcommand{\setpagesize}[2]{%
  \special{papersize=#1,#2}%
}
% ...


$ latex abc.tex
$ dvipdfmx abc.dvi 
abc.dvi -> abc.pdf
[1]
4331 bytes written

为什么?

答案1

\newlength是一个 LaTeX 宏,它定义了新的长度登记,其长度为数字,可用于计算(例如使用\addtolength)。\def宏是的原始版本\(re)newcommand,只是将内容定义为字符串。

在你的情况下,你想将长度设置为细绳\special在写入 DVI 文件的里面。但是,如果您\mywidth直接使用长度寄存器,它不会将其值返回为字符串,而是等待一些操作,例如赋值。您需要写入\the\mywidth以获取长度寄存器的字符串表示。但是,使用定义的宏\def只是通过扩展,\special并且其字符串内容只是添加到 DVI。

答案2

\mywidth是长度寄存器,而不是值。在某些地方,它可以被当作值使用,但是如果你\mywidth在文本中间简单地使用,就会出错。你可以用 来获取长度寄存器的值\the。所以试试\setpagesize{\the\mywidth}{\the\myheight}

相关内容