目前我设置了一个给定长度#1
和宽度的盒子#2
,如下所示:
\newcommand{\mybox}[2]{
This is a box of #1 by #2 centimeters:
\framebox{\hbox to #1cm {\vbox to #2cm}}
}
% Usage:
\mybox{5}{8]
然而,这会导致错误,因为不允许将其附加cm
到参数#1
和#2
。
有没有办法将单位附加到命令参数?不幸的是,无法将单位作为参数传递,因为我还使用原始形式的参数。
答案1
您的第二个框没有内容,并且缺少所需的括号组:
\documentclass{article}
\newcommand{\mybox}[2]{%
This is a box of #1 by #2 centimeters:
\framebox{\hbox to #1cm {\vbox to #2cm{}}}%
}
\begin{document}
% Usage:
\mybox{5}{8}
\end{document}
答案2
这是一种实现此目的的方法,另外还有一种不使用\hbox
或\vbox
而是使用零宽度规则的替代方法:
\documentclass{article}
\newcommand{\mybox}[2]{%
This is a box of~#1 by~#2 centimeters:
\framebox{\hbox to \dimexpr#1 cm\relax {\vbox to \dimexpr#2 cm\relax{}}}%
}
\newcommand{\myboxx}[2]{%
This is a box of~#1 by~#2 centimeters:
\fbox{\rule{\dimexpr#1cm\relax}{0pt}\rule{0pt}{\dimexpr#2cm\relax}}%
}
\begin{document}
\mybox{5}{8} \par
\myboxx{2}{2}
\end{document}
将参数从数字修改为维度的关键是使用\dimexpr
。此外,与使用 类似,您也\hbox to .. {...}
需要用括号括起来。\vbox to .. {...}
答案3
为参数添加默认度量单位的一种简单方法是
\sbox0{\dimen0=#1cm}
(而不是cm
可以使用任何合法的计量单位)。如果#1
是没有附加单位的数字,则分配将不会在框中留下任何要排版的内容,框的宽度为零。否则cm
将被排版。
所以这里有一种方法:
\documentclass{article}
\newcommand\testforunit[2]{%
\sbox0{\dimen#1=#2cm}%
\ifdim\wd0=0pt
\dimen#1=#2cm
\else
\dimen#1=#2\relax
\fi}
\newcommand{\mybox}[2]{%
This is a box of #1 by #2 (default unit centimeters):\hfill
\begingroup\fboxsep=-\fboxrule
\testforunit{0}{#1}\testforunit{2}{#2}%
\framebox[\dimen0]{\rule{0pt}{\dimen2}}%
\endgroup\par}
\begin{document}
\mybox{2}{3}
\mybox{2cm}{3cm}
\mybox{1in}{2in}
\end{document}
我们使用 执行添加\testforunit
测试(如果需要),并将请求的长度存储在 中。 盒子的构造由这两个长度完成,但在设置为 的组中,以便框架具有精确的请求尺寸。 在示例中,第一个和第二个盒子是相同的。#2
cm
\dimen#1
\fboxsep
\fboxrule
正如约瑟夫所建议的,这里是定义的“官方”LaTeX 内核方式\testforunit
:
\makeatletter
\newcommand{\testforunit}[2]{\@defaultunits\dimen#1=#2cm\relax\@nnil}
\makeatother