例子:
\usepackage{siunitx}
\newcommand{\temperature}[1]{\SI{#1}{\celsius}}
\temperature{100}
输出:100℃
我想要这样的东西:
\newcommand{\temperature}[1]{\SI{#1+273}{\kelvin} (\SI{#1}{\celsius})}
\temperature{100}
输出:373K(100℃)
是否可以?
答案1
您可以使用l3fp
以下模块expl3
:
\documentclass{article}
\usepackage{siunitx} % already loads xparse
\ExplSyntaxOn
\NewDocumentCommand{\temperature}{ O{0} m }
{
\bryebex_temperature:nn { #1 } { #2 }
}
\cs_new_protected:Npn \bryebex_temperature:nn #1 #2
{
\SI{ \fp_to_decimal:n { round ( #2+273.15, #1 ) } } { \kelvin }
\nobreakspace ( \SI { #2 } { \celsius } )
}
\ExplSyntaxOff
\begin{document}
\temperature{100}
\temperature[2]{100}
\end{document}
可选参数指定四舍五入的小数位数。
答案2
#1+273
您可以在外面计算表达式\SI
并使用它。要计算,您可以使用您喜欢的方法。我选择了pgf
。
\documentclass{article}
\usepackage{siunitx,pgf}
\newcommand*{\temperature}[1]{\pgfmathtruncatemacro{\temp}{#1+273}\SI{\temp}{\kelvin} (\SI{#1}{\celsius})}
%no truncation
\newcommand*{\temperatur}[1]{\pgfmathparse{#1+273}\SI{\pgfmathresult}{\kelvin} (\SI{#1}{\celsius})}
%
\begin{document}
\temperatur{100.23} and \temperature{123}
\end{document}
答案3
每个人都有自己最喜欢的数学引擎......
更新:使用\xinttheexpr...\relax
中缀符号。但似乎不会\SI
立即进行完全扩展,它首先显然会解析(
和)
等。所以我不得不对 做一个小技巧\firstofone
。
\documentclass{article}
\usepackage{siunitx,xintexpr}
\providecommand\firstofone [1]{#1}
% We use this \firstofone trick to hide ( and ) from the \SI parser.
% Braces can not be used inside \xinttheexpr...\relax for this purpose
\newcommand*{\celsiusfromkelvin}[2][2]
{\SI{\firstofone {\xinttheexpr round(#2-273.15,#1)\relax}}{\celsius}}
\newcommand*{\celsiusfromfahrenheit}[2][2]
{\SI{\firstofone {\xinttheexpr round((#2-32)*5/9,#1)\relax}}{\celsius}}
\newcommand*{\fahrenheitfromkelvin}[2][2]
{\SI{\firstofone {\xinttheexpr round(1.8*#2-459.67,#1)\relax}}{\fahrenheit}}
\newcommand*{\fahrenheitfromcelsius}[2][2]
{\SI{\firstofone {\xinttheexpr round(1.8*#2+32,#1)\relax}}{\fahrenheit}}
\newcommand*{\kelvinfromcelsius}[2][2]
{\SI{\firstofone {\xinttheexpr round(#2+273.15,#1)\relax}}{\kelvin}}
\newcommand*{\kelvinfromfahrenheit}[2][2]
{\SI{\firstofone {\xinttheexpr round((#2+459.67)*5/9,#1)\relax}}{\kelvin}}
\DeclareSIUnit[number-unit-product=\,]
\fahrenheit{\SIUnitSymbolDegree F}
\begin{document}
\celsiusfromkelvin {300} (\SI{300}{\kelvin})
\fahrenheitfromkelvin {300} (\SI{300}{\kelvin})
\celsiusfromfahrenheit {80.33} (\SI{80.33}{\fahrenheit})
\fahrenheitfromcelsius {26.85} (\SI{26.85}{\celsius})
\kelvinfromcelsius {26.85} (\SI{26.85}{\celsius})
\kelvinfromfahrenheit {80.33} (\SI{80.33}{\fahrenheit})
\celsiusfromfahrenheit [4] {80} (\SI{80}{\fahrenheit})
\fahrenheitfromcelsius [4] {26.6667} (\SI{26.6667}{\celsius})
\fahrenheitfromcelsius [4] {26.66667} (\SI{26.66667}{\celsius})
\end{document}
早期方法,不使用中缀符号
\documentclass{article}
\usepackage{siunitx,xintfrac}
\newcommand*{\celsiusfromkelvin}[2][2]
{\SI{\xintRound{#1}{\xintSub{#2}{273.15}}}{\celsius}}
\newcommand*{\celsiusfromfahrenheit}[2][2]
{\SI{\xintRound{#1}{\xintMul{\xintSub{#2}{32}}{5/9}}}{\celsius}}
\newcommand*{\fahrenheitfromkelvin}[2][2]
{\SI{\xintRound{#1}{\xintSub{\xintMul{#2}{1.8}}{459.67}}}{\fahrenheit}}
\newcommand*{\fahrenheitfromcelsius}[2][2]
{\SI{\xintRound{#1}{\xintAdd{\xintMul{#2}{1.8}}{32}}}{\fahrenheit}}
\newcommand*{\kelvinfromcelsius}[2][2]
{\SI{\xintRound{#1}{\xintAdd{#2}{273.15}}}{\kelvin}}
\newcommand*{\kelvinfromfahrenheit}[2][2]
{\SI{\xintRound{#1}{\xintMul{\xintAdd{#2}{459.67}}{5/9}}}{\kelvin}}
\DeclareSIUnit[number-unit-product=\,]
\fahrenheit{\SIUnitSymbolDegree F}
\begin{document}
\celsiusfromkelvin {300} (\SI{300}{\kelvin})
\fahrenheitfromkelvin {300} (\SI{300}{\kelvin})
\celsiusfromfahrenheit {80.33} (\SI{80.33}{\fahrenheit})
\fahrenheitfromcelsius {26.85} (\SI{26.85}{\celsius})
\kelvinfromcelsius {26.85} (\SI{26.85}{\celsius})
\kelvinfromfahrenheit {80.33} (\SI{80.33}{\fahrenheit})
\celsiusfromfahrenheit [4] {80} (\SI{80}{\fahrenheit})
\fahrenheitfromcelsius [4] {26.6667} (\SI{26.6667}{\celsius})
\fahrenheitfromcelsius [4] {26.66667} (\SI{26.66667}{\celsius})
\end{document}
答案4
我的第一个想法是:使用 luaLaTeX 应该很容易。
这里是:
\documentclass{scrartcl}
\usepackage{siunitx}
\newcommand{\temperature}[1]{\SI{\directlua{tex.sprint(#1+273.15)}}{\kelvin} (\SI{#1}{\celsius})}
\begin{document}
\temperature{100}
\end{document}
我用 替换了你#1+273
的\directlua{tex.sprint(#1+273.15)}
。