建立物理維度命令 - 逐字符解析

建立物理維度命令 - 逐字符解析

我希望有一個專門的命令來列印物理尺寸。就像是\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{}` 指令?,包括使用另一個命令的原因。

相關內容