我在我的序言中定义the \quan
macro to consistently typeset quantities(在下面复制),它工作正常......除了图标题,pdflatex抱怨我有一个未定义的控制序列并崩溃。
如何修改宏以使其在字幕环境中有效?
谢谢!
\let\unitsep=\, % Inserted at spaces in second arg, separates units (A s)
\let\numunitsep=\; % Separator between number and unit (12.3 V)
\makeatletter
\def\quan#1{\ifmmode \let\@shiftmath=\relax \else \let\@shiftmath=$\fi
\@shiftmath \uppercase{\def\@quanarg{#1}}%
\expandafter\@quannum\@quanarg E\@noexp\@end \futurelet\@nextchar\@quanunit}
\def\@quannum#1E#2\@end{\@quanmant#1\@end \ifx\@noexp#2 \else \@quanexp#2\fi}
\def\@quanmant#1{\ifx#1\@end \let\@next=\relax \else
\if,#1\mathord,\else #1\fi \let\@next=\@quanmant \fi \@next}
\def\@quanexp#1E\@noexp{\times 10^{#1}}
\def\@quanunit{\if[\@nextchar
\def\@next[##1]{\numunitsep\mathrm{##1}\endgroup\@shiftmath}%
\begingroup\@quanspace \else \let\@next=\@shiftmath \fi \@next}
{\catcode`\ =\active\gdef\@quanspace{\catcode`\ =\active\let =\unitsep}}
\makeatother
答案 0 :(得分:1)
这是一个非答案,但为此目的使用siunitx
可能会有用。
至于为什么字幕中的内容可能出错,请回想一下字幕会写入.lof
或.lot
文件,因此您必须担心宏的脆弱性或其他问题。这个问题的根源是宏在被写出之前被扩展,这意味着当他们最终 执行时 - 当他们在下次运行时从文件中读入时 - 他们不会不一定表现得像人们预期的那样(我之前被这个混淆了)。 (我不是说这肯定是你的问题,但是你在提出一个动态论证中提到失败意味着这是我首先看到的地方。)