我试图在宏中计算一些宽度,并将该宏用于scalebox
。然而,当我尝试将宏传递给 scalebox 时,我得到了大量错误。
最小示例:
\documentclass{article}
\usepackage{pgf}
\newcounter{Counter}
\setcounter{Counter}{1}
\newcommand{\testOk}{1}
\newcommand{\testFail}{
\theCounter
\stepcounter{Counter}
}
\setlength\parindent{0pt}
\begin{document}
\testFail %ok
\scalebox{\testFail}{a} %ok
\scalebox{\testFail}{a} %fails
\end{document}
更新
因为我想在新的环境中透明地使用 scalebox,所以我决定尝试 Steven B. Segletes 指出的方法。重新定义宏以首先执行宏扩展,然后使用该值调用底层宏。我试过:
\newenvironment{imageRow}{
\begingroup\imageRow@reset
\LetLtxMacro{\oldScalebox}{\scalebox}
\renewcommand{\scalebox}[2]{
\edef\tmpValue{##1}
\oldScalebox{\tmpValue}{##2}
}
}{
\imageRow@complete\endgroup
}
但是我不断收到“缺少 endcsname”错误。(并且随后出现洪水)。
如果这很重要的话,这是我当前尝试作为第一个参数传递的函数:
\newcommand{\getIt}{%
\stepcounter{imageRow@getCount}%
%
\expandafter\ifx\csname imageRow@scale@Image@\theimageRow@rowCount @\alph{imageRow@getCount}\endcsname\relax
1%
\PackageWarning{imageRow}{Return to get correct scaling factors.}%
\else
\csname imageRow@scale@Image@\theimageRow@rowCount @\alph{imageRow@getCount}\endcsname\relax
\fi
}
答案1
引入\tfscalebox
,以便计数器索引发生在\scalebox
参数之外。
\documentclass{article}
\usepackage{pgf}
\newcounter{Counter}
\setcounter{Counter}{1}
\newcommand{\testOk}{1}
\newcommand\tfscalebox[1]{\scalebox{\arabic{Counter}}{#1}\stepcounter{Counter}}
\setlength\parindent{0pt}
\begin{document}
\tfscalebox{a} %ok
\tfscalebox{a} %ok
\tfscalebox{a} %ok
\end{document}
\scalebox
如果您希望宏在决定输出或增加之前执行测试Counter
,那么您可以始终将第二个参数传递给要测试的宏。 下面,我将其作为可选参数[F]
来减少比例:
\documentclass{article}
\usepackage{pgf}
\newcounter{Counter}
\setcounter{Counter}{1}
\newcommand\tfscalebox[2][T]{\scalebox{\arabic{Counter}}{#2}%
\if#1F\addtocounter{Counter}{-1}\else\stepcounter{Counter}\fi%
\if0\arabic{Counter}\stepcounter{Counter}\fi}
\setlength\parindent{0pt}
\begin{document}
\tfscalebox{a} %ok
\tfscalebox{b} %ok
\tfscalebox{c} %ok
\tfscalebox[F]{d} %ok
\tfscalebox[F]{e} %ok
\tfscalebox{a} %ok
\tfscalebox[F]{e} %ok
\tfscalebox[F]{e} %ok
\tfscalebox[F]{e} %ok
\tfscalebox[F]{e} %ok
\end{document}