宏可自动输入 SI 和 US 长度测量值

宏可自动输入 SI 和 US 长度测量值

我如何编写一个宏,给定输入\length(100)将输入值解释为长度(mm)并输出类似的内容\SI{100}{\mm}/4'',换句话说,我需要在后台进行毫米到英寸的转换($1'' \approx 25mm$)并将其插入到我的输出中。

答案1

仅使用siunitx(v3)和底层expl3支持:

\documentclass{article}
\usepackage{siunitx}
\NewDocumentCommand\length{O{}m}{%
  \begingroup
    \sisetup{#1}%
    \qty{#2}{\milli\metre}%
    \ensuremath{/}%
    \qty[
      expression = ##1/2.54,
      evaluate-expression,
      round-mode = figures,
      round-precision = 3,
      quantity-product = 
      ]%
        {#2}{''}%
  \endgroup
}
\begin{document}
\length{100}, \length{101.6}, $\length{103.5}$
\end{document}

如果你想覆盖 v2,你需要稍微不同的设置:适用于两个版本的演示

\documentclass{article}
\usepackage{siunitx}
\ifx\qty\undefined
  \usepackage{xfp}
  \NewDocumentCommand\length{O{}m}{%
    \begingroup
      \sisetup{#1}%
      \SI{#2}{\milli\metre}%
      \ensuremath{/}%
      \edef\x{%
        \SI[
          number-unit-product = ,
          round-mode = figures,
          round-precision = 3,
        ]
          {\fpeval{#2/25.4}}{''}%
      }\x
    \endgroup
  }
\else
  \NewDocumentCommand\length{O{}m}{%
    \begingroup
      \sisetup{#1}%
      \qty{#2}{\milli\metre}%
      \ensuremath{/}%
      \qty[
        expression = ##1/25.4,
        evaluate-expression,
        round-mode = figures,
        round-precision = 3,
        quantity-product = 
        ]%
          {#2}{''}%
    \endgroup
  }
\fi
\begin{document}
\length{100}, \length{101.6}, $\length{103.5}$
\end{document}

答案2

如果您愿意并且能够使用 LuaLaTeX 编译您的文档,那么以下解决方案可能会引起您的兴趣。

  • 如果以毫米为单位的长度能整除以整数为单位的英寸长度,则不显示小数部分。您可以通过修改字符串来控制显示的小数位数"\%.3g"

  • \length设置为允许在分隔两个长度项的“斜线”字符后换行。如果您不想允许换行,只需更改\\slash/

在此处输入图片描述

\documentclass{article}
\usepackage{siunitx} % for '\qty' macro (formerly '\SI')
\usepackage{luacode} % for '\luaexec' macro

%% Lua-side code
\luaexec{
function length ( len_mm ) 
   len_in = string.format ( "\%.3g" , len_mm / 25.4 )
   tex.sprint ( "\\qty{"..len_mm.."}{\\milli\\meter}\\slash"..len_in.."\\mbox{''}" )
end 
}

%% LaTeX-side code
\newcommand\length[1]{\directlua{length(#1)}}

\begin{document}
\length{100}, \length{101.6}, $\length{103.5}$
\end{document}

相关内容