Я пытаюсь определить макрос для набора комплексной степени Эйлера с минусом в аргументе или без него. Я хотел бы, чтобы макрос автоматически определял, начинается ли его аргумент с -
. У меня есть следующий MWE, который использует и необязательный аргумент:
\documentclass[a4paper,12pt,fleqn]{article}
\def\imaginaryunit{j} % the imaginary unit, i for mathematician and theoretical physicist, j for the rest of the world.
\def\imunit{\mathrm{\imaginaryunit}} % ... in upright math
\def\ce{\mathrm{e}} % the constant e, upright of course
\makeatletter
\def\epowim{\@ifnextchar[{\epowimi}{\epowimi[]}} % e to-the-power-of imaginary unit
\def\epowimi[#1]#2{\ce^{#1\if\imaginaryunit j\relax\,\fi\imunit#2}} % e to-the-power-of imaginary unit
\makeatother
\begin{document}
\begin{equation}
\epowim{\alpha}\qquad \epowim[-]{\alpha} \qquad \ce^{-\imunit\alpha}
\end{equation}
\end{document}
Поэтому мне нужен макрос, который определяет, начинается ли его аргумент с -
:
\epowim{-\alpha}
следует обнаружить -
и поместить его перед мнимой единицей, а не после нее.
Поэтому вопрос в том, можно ли это сделать и как.
решение1
Что-то вроде этого?
\documentclass[a4paper,12pt,fleqn]{article}
\def\imaginaryunit{j} % the imaginary unit, i for mathematician and theoretical physicist, j for the rest of the world.
\def\imunit{\mathrm{\imaginaryunit}} % ... in upright math
\def\ce{\mathrm{e}} % the constant e, upright of course
\newcommand\epowim[1]{\ce^{\epowimaux#1\relax\endep}}
\def\epowimaux#1#2\endep{\ifx-#1\relax-\imunit\else%
\if j\imaginaryunit\relax\,\fi\imunit#1\fi#2}
\begin{document}
\[
\epowim{\alpha}\qquad \epowim{-\alpha} \qquad \ce^{-\imunit\alpha}
\]
\[
\epowim{x+t}\quad\epowim{-x+t}\quad\epowim{-}\quad\epowim{}
\]
\def\imaginaryunit{i}
\[
\epowim{\alpha}\qquad \epowim{-\alpha} \qquad \ce^{-\imunit\alpha}
\]
\[
\epowim{x+t}\quad\epowim{-x+t}\quad\epowim{-}\quad\epowim{}
\]
\end{document}
решение2
Избегайте этого \def
, ваша жизнь станет легче.
Поскольку вы, кажется, знаете о \@ifnextchar
:
\documentclass[a4paper,12pt,fleqn]{article}
% the imaginary unit, j for engineers and i for the rest of the world
\newcommand\imaginaryunit{j}
% in upright type as engineers do; also Euler's constant
\newcommand\imunit{\mathrm{\imaginaryunit}}
\newcommand\ce{\mathrm{e}}
\newcommand{\fiximunit}{\if\imaginaryunit j\,\fi}
\makeatletter
\newcommand{\epowim}[1]{\ce^{\epowim@#1}}
\newcommand{\epowim@}{\@ifnextchar-{\epowim@@}{\epowim@@{\fiximunit}}}
\newcommand{\epowim@@}[1]{#1\imunit}
\makeatother
\begin{document}
\begin{equation}
\epowim{\alpha}\qquad \epowim{-\alpha} \qquad \ce^{-\imunit\alpha}
\qquad \epowim{} \qquad \epowim{-}
\end{equation}
\end{document}
Объяснение: \@ifnextchar-
использует следующий аргумент, если -
найден, в противном случае — последующий, нобезудаление -
. Так что если -
вызывается, то результатом будет
\epowim@@-\alpha
который передается -
как аргумент в \epowim@@
. В противном случае \epowim@@
вызывается с \fiximunit
как аргумент.
Это не помешало бы при \epowim{}
наборе \epowim{-}
e j и e −j соответственно.
Возможно, более простая реализация с xparse
:
\documentclass[a4paper,12pt,fleqn]{article}
\usepackage{xparse}
% the imaginary unit, j for engineers and i for the rest of the world
\newcommand\imaginaryunit{j}
% in upright type as engineers do; also Euler's constant
\newcommand\imunit{\mathrm{\imaginaryunit}}
\newcommand\ce{\mathrm{e}}
\newcommand{\fiximunit}{\if\imaginaryunit j\,\fi}
\NewDocumentCommand{\epowim}{m}{\ce^{\powim#1}}
\NewDocumentCommand{\powim}{t-}{\IfBooleanTF{#1}{-\imunit}{\fiximunit\imunit}}
\begin{document}
\begin{equation}
\epowim{\alpha}\qquad \epowim{-\alpha} \qquad \ce^{-\imunit\alpha}
\qquad \epowim{} \qquad \epowim{-}
\end{equation}
\end{document}