定义崩溃

定义崩溃
\documentclass[twoside,12pt,a4paper]{mwrep} 

\usepackage[inner=4cm,outer=2cm]{geometry}  
\usepackage[utf8]{inputenc}                 
\usepackage{polski}
\usepackage[polish]{babel}
\usepackage{graphicx}                       
\usepackage{siunitx}                        
\usepackage{amsmath}                        

\def\m3h{\: \frac{\SI{m^3}}{\SI{\hour}}}
\def\metrh{\: \frac{m^3}{h}}
\def\metre{\: \si{\metre}}


\begin{document}

$\m3h$
$\metreh$
$\metre$

\end{document}

这三个中,\metreh一个在\metre工作,另一个\m3h在不工作。日志显示:

! siunitx error: "invalid-token-in-number"
!
! Invalid token 'm' in numerical input.

答案1

该宏\m在 的参数内部使用\SI\si作为 的缩写\metre

\def\m3h{...}正在重新定义\m。是的,这是 TeX 的规则,即宏名称只能由单个非字母字符或一个或多个字母(a-zA-Z)字符组成。

您的\def定义\m和要求它始终跟随标记3h

请尝试

\def\m3h{foo}
\def\m4a{baz}

\m3h

并享受错误。

\SI此外,参数。如果您只想打印一个单位,请使用\si{<unit>}

答案2

宏名称中不能使用数字\newcommand,只有使用 和 的旁路解决方案\@namedef,但这\@nameuse实际上没有任何优势。

我也不推荐\def\foo100{...}用法。

不要使用它;-)

siunitx等命令的使用也存在错误。\si\SI

\si如果您想单独使用单位,即不使用数字,则使用1,45 m

我也不推荐诸如`\frac{\si...}{\si...} 之类的东西。

\documentclass[twoside,12pt,a4paper]{mwrep} 

\usepackage[inner=4cm,outer=2cm]{geometry}  
\usepackage[utf8]{inputenc}                 
\usepackage{polski}
\usepackage[polish]{babel}
\usepackage{graphicx}                       
\usepackage{siunitx}                        
\usepackage{amsmath}                        

%\def\m3h{\: \frac{\SI{m^3}}{\SI{\hour}}}
%\def\metrh{\: \frac{m^3}{h}}
%\def\metre{\: \si{\metre}}

\makeatletter
\@namedef{m3h}{\: \frac{\si{\meter\cubed}}{\si{\hour}}}
\makeatother
\begin{document}

Use  \si{\meter\cubed}
\makeatletter
$\@nameuse{m3h}$
\makeatother



\end{document}

相关内容