\scalebox 是否保证完全展开它的前两个参数?

\scalebox 是否保证完全展开它的前两个参数?

这个答案,我一直比较保守,使用了下面的代码:

\expandafter\scalebox\expandafter{\my@scale}{\usebox{\my@box}}

确保不依赖于未记录的行为(?\scalebox图形包(如果您想知道,\my@scale已用 定义\pgfmathsetmacro)。但是,如以下示例所示,它似乎至少\scalebox完全扩展了它的第一个参数,因此我正在考虑是否应该通过删除两个\expandafter调用来简化上面的行。

\documentclass{article}
\usepackage{graphicx}
\usepackage{xfp}

\newcommand*{\scalea}{0.5}
\newcommand*{\scaleb}{\scalebaux}
\newcommand*{\scalebaux}{\fpeval{0.5^2}}

\newsavebox{\mybox}
\sbox{\mybox}{\includegraphics{example-image}} % any box would do

\begin{document}

\scalebox{1.0}{\usebox{\mybox}}\par
\scalebox{\scalea}{\usebox{\mybox}}\par
\scalebox{\scaleb}{\usebox{\mybox}}

\end{document}

截屏

问题

  1. 它是否被视为\scaleboxAPI 的一部分,它完全扩展了给出比例因子的两个参数,在下面的语法提醒中注意到〈h-scale〉和〈v-scale〉?

    \scalebox{〈h-scale〉}[〈v-scale〉]{〈text〉}
    
  2. 如果你回答“否”,那么是否有整数n> 0 至少n扩展步骤一定发生在相同的两个参数上吗?

  3. 使用时前面的答案是否也适用:

    \includegraphics{scale=...}{some-file}
    

谢谢!

答案1

这是由graphics(不是graphicx)定义的,包不会扩展这些参数,但扩展只是 TeX 处理的自然过程。所以不需要\expandafter

评论中提出的关于参数可能扩展为的语法是什么的次要问题更难回答。

比例因子有两个用途:

  1. 计算出盒子的尺寸(并考虑负比例因子等)。

    在这部分代码中,使用了 TeX dimen 算法,因此它必须是<factor>在 TeXBook 语法符号中。具体来说,诸如\ifdim#2\p@<\z@必须工作,其中#2是提供的比例因子之一。

  2. 比例因子被传递给后端代码来实际缩放排版输出,这里它使用\special\pdfliteral或任何可用的合适的内容。

    缩放的默认定义是:

    \providecommand\Gscale@start{\@latex@error{Scaling not supported}\@ehc
                \global\let\Gscale@start\relax}
    

    也就是说,它在第一次使用时会出现错误,除此之外什么也不做。

    即默认定义所有输入均无效。

    因此,在其他情况下发生的情况取决于驱动程序(并且在 1993-4 年撰写本文时,变化比现在多得多,并且使用了更多不同的 dvi 驱动程序。)

    即使现在dvips.def

    \Gscale@x\GPT@space \Gscale@y\GPT@space scale
    

    这意味着,<factor>参数必须扩展为合法的 PostScript 数字。

    pdftex做的事情稍微复杂一些,但最终结果是参数需要扩展为有效的 PDF 数字。

以下事物的示例<factor>但不要扩展为 PostScript 或 PDF 数字 \count@\value{section}"FF

相关内容