我编写了以下 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}