물리적 차원에 대한 명령 구성 - 문자별로 문자 구문 분석

물리적 차원에 대한 명령 구성 - 문자별로 문자 구문 분석

물리적 치수를 인쇄하는 전용 명령을 갖고 싶습니다. . \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인수에 (양수 또는 음수) 정수가 있을 때 자동으로 감지하고 이를 "전원"으로 푸시하고 싶습니다 . 또한 \phydimenM,L,T보다 더 많은 문자를 허용할 수 있어야 합니다. 또한 소문자를 입력하면 자동으로 대문자로 변환됩니다.

인수를 문자별로 구문 분석하고 문자인지 양의 정수인지 음의 정수인지 어떻게 결정합니까?

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

listofitems여기서는 2계층 구문 분석을 수행하여 첫 번째 수준에서 숫자를 찾고 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{}` 명령을 사용하는 방법은 무엇입니까?, 대신 다른 명령을 사용하는 이유도 포함됩니다.

관련 정보