我希望有一個專門的命令來列印物理尺寸。就像是\phydimen{M2L-3T-1}
。這應該輸出與 相同$\textrm{M}^2\textrm{L}^{-3}\textrm{T}^{-1}$
。
我發現package\ce
指令mhchem
還是比較適合的。因此,我對其進行了破解\newcommand{\phydimen}[1]{\ce{#1}}
,然後發出命令\phydimen{ML^2T^{-2}}
來列印尺寸。但是我還是必須使用討厭的^
和{ }
.預設\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{}` 指令?,包括使用另一個命令的原因。