物理次元のコマンドの構築 - 文字ごとに解析

物理次元のコマンドの構築 - 文字ごとに解析

物理的な寸法を印刷するための専用コマンドが必要です。 のようなものです\phydimen{M2L-3T-1}。 これは と同じ出力になります$\textrm{M}^2\textrm{L}^{-3}\textrm{T}^{-1}$

\ceパッケージのコマンドが非常に適していることがわかりましたmhchem。そのため、これをハックして、寸法を印刷する\newcommand{\phydimen}[1]{\ce{#1}}コマンドを発行します。ただし、厄介なと を使用する必要があります。デフォルトの動作では、数字を下付き文字としてプッシュします。\phydimen{ML^2T^{-2}}^{ }\ce

\phydimen引数に整数 (正または負) が含まれている場合は自動的に検出し、それを「累乗」します。また、M、L、T 以外の文字も受け入れられるようにする必要\phydimenがあります。また、小文字が指定されている場合は、自動的に大文字に変換する必要があります。

引数を文字ごとに解析し、文字なのか、正の整数なのか、負の整数なのかを判断するにはどうすればよいでしょうか。

MWE:

\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

ここでは、listofitems2 層解析を実行して、第 1 レベルで数字を検索し、negative第 2 レベルで符号を検索します。

\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{}` コマンドを使用するにはどうすればいいですか?代わりに別のコマンドを使用する理由も含みます。

関連情報