如何在 newcommand 中使用 renewcommand

如何在 newcommand 中使用 renewcommand

我有一个宏,用来在数学或文本模式下编写单位(以便我可以轻松地编写指数)。

我想只在这个宏中更改\muin的定义\upmu(来自upgreek包)(不适用于标准数学)。这是我写的:

\newcommand{\U}[1]{%
    \renewcommand{\mu}{\upmu}
    \ensuremath{\mathrm{~#1}}%
}

它可以工作,但是在编译时出现错误:

ERROR: Argument of \@caption has an extra }.

--- TeX said ---
<inserted text> 
                \par 
l.117 ... bla 30\U{\mu K} bla bla}

--- HELP ---
From the .log file...

I've run across a `}' that doesn't seem to match anything.
For example, `\def\a#1{...}' and `\a}' would produce
this error. If you simply proceed now, the `\par' that
I've just inserted will cause me to report a runaway
argument that might be the root of the problem. But if
your `}' was spurious, just type `2' and it will go away.

对于有问题的代码:

\caption{bla bla 30\U{\mu K} bla bla}

答案1

脆弱的命令,例如\renewcommandhave to be \protected,在用于移动参数时,例如\caption(见脆弱命令和坚固命令之间有什么区别?了解更多信息)。

%此外,当你不想插入额外空格时,你必须添加尾随空格(参见行末百分号(%)有什么用?)。

所以你应该将你的定义改为

\newcommand{\U}[1]{%
    \protect\renewcommand{\mu}{\upmu}%
    \ensuremath{\mathrm{~#1}}%
}

答案2

你想使用

\DeclareRobustCommand{\U}[1]{%
   \ensuremath{\let\mu\upmu\,#1}%
}

这样就不必担心 的扩展不合时宜\U。请注意,正确的间距是\,而不是。您可以使用~来代替,但效率较低。\let\mu\upmu\renewcommand{\mu}{\upmu}

然而这仍然是错误的:应该K是直立的,假设它指的是开尔文单位。

你应该这样做:

\documentclass{article}
\usepackage{amsmath}
\usepackage{siunitx}
\usepackage{textgreek}
\sisetup{
  text-micro=\textmu,
  math-micro=\text{\textmu},
}

\begin{document}
\listoffigures
\begin{figure}[htp]
\caption{bla bla \SI{30}{\micro\kelvin} bla bla}
\end{figure}

\end{document}

在此处输入图片描述

答案3

我认为你想要的是

\newcommand{\U}[1]{\bgroup\renewcommand{\mu}{\upmu}%%
   \ensuremath{\mathrm{~#1}}\egroup}

当你从内部调用它时\caption,写

\caption{bla bla 30\protect\U{\mu K} bla bla}

相关内容