我如何编写一个宏,给定输入\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}