我有一个宏,用来在数学或文本模式下编写单位(以便我可以轻松地编写指数)。
我想只在这个宏中更改\mu
in的定义\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
脆弱的命令,例如\renewcommand
have to be \protect
ed,在用于移动参数时,例如\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}