如何在 LaTeX 环境中转换单位?

如何在 LaTeX 环境中转换单位?

例子:

\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)}

相关内容