如何向命令参数添加单位?

如何向命令参数添加单位?

目前我设置了一个给定长度#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测试(如果需要),并将请求的长度存储在 中。 盒子的构造由这两个长度完成,但在设置为 的组中,以便框架具有精确的请求尺寸。 在示例中,第一个和第二个盒子是相同的。#2cm\dimen#1\fboxsep\fboxrule

正如约瑟夫所建议的,这里是定义的“官方”LaTeX 内核方式\testforunit

\makeatletter
\newcommand{\testforunit}[2]{\@defaultunits\dimen#1=#2cm\relax\@nnil}
\makeatother

在此处输入图片描述

相关内容