![构建物理维度命令 - 逐个字符解析](https://linux22.com/image/370607/%E6%9E%84%E5%BB%BA%E7%89%A9%E7%90%86%E7%BB%B4%E5%BA%A6%E5%91%BD%E4%BB%A4%20-%20%E9%80%90%E4%B8%AA%E5%AD%97%E7%AC%A6%E8%A7%A3%E6%9E%90.png)
我希望有一个专门用于打印物理尺寸的命令。类似于\phydimen{M2L-3T-1}
。这应该输出与相同的内容$\textrm{M}^2\textrm{L}^{-3}\textrm{T}^{-1}$
。
我发现包\ce
的命令mhchem
非常合适。所以我将其破解为 do \newcommand{\phydimen}[1]{\ce{#1}}
,然后发出命令\phydimen{ML^2T^{-2}}
来打印尺寸。但是我仍然必须使用讨厌的^
and { }
。默认\ce
行为是将数字推送为下标。
我想\phydimen
自动检测参数中是否有(正或负)整数并将其推至“幂”。还\phydimen
应该能够接受比 M、L、T 更多的字符。此外,如果提供的是小写字母,它应该自动将其转换为大写字母。
如何逐个字符地解析参数并判断它是字母、正整数还是负整数?
梅威瑟:
\documentclass{article}
\usepackage{mhchem}
\newcommand{\phydimen}[1]{\ce{#1}}
\begin{document}
$\textrm{M}^2\textrm{L}^{-3}\textrm{T}^{-1}$
\phydimen{ML^2T^{-2}} % instead I want \phydimen{ML2T-2}
\end{document}
答案1
您可以使用正则表达式:
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\phydimen}{m}
{
\tl_set:Nn \l_tmpa_tl { #1 }
\regex_replace_all:nnN { (\-?\d+) } { \cU\^\cB\{\1\cE\} } \l_tmpa_tl
\ensuremath { \mathrm { \tl_use:N \l_tmpa_tl } }
}
\ExplSyntaxOff
\begin{document}
\phydimen{ML2T-2}
\end{document}
搜索表达式匹配一个可能有符号的整数,替换表达式指定“上标字符、左括号、匹配、右括号”。
答案2
这里我使用listofitems
来进行两层解析,在第一层查找数字,negative
在第二层查找符号。
\documentclass{article}
\usepackage{listofitems}
\newcommand\phydimen[1]{%
\setsepchar{0||1||2||3||4||5||6||7||8||9/-}%
\greadlist\Dim{#1}%
\foreachitem\i\in\Dim{%
\textrm{\Dim[\icnt,1]}\ensuremath{^{\Dimsep[\icnt,1]\Dimsep[\icnt]}}}%
}
\begin{document}
\phydimen{ML2T-2}
\end{document}
答案3
在 LaTeX 中逐字母解析是一件复杂的事情。您可以打开 mhchem.sty 看看这是如何完成的。或者看看解析基础知识或者我怎样才能逐个标记地解析标记流中的第一个单词?。
我不建议\ce
在命令中使用。它的功能远不止更改字体。它会对输入进行双重解析,我认为这不会很高效。
您要创建的命令已存在于 MathJax 的 mhchem 中。为什么它不存在于 LaTeX 中,请参阅问题如何在 LaTex 中使用“MathJax mhchem \pu{}”命令?,包括使用其他命令的原因。