\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-z
和A-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}