假设我们处于数学模式,我想使用命令 \E 并产生以下行为。如果命令后面有一个或两个素数,即 \E' 或 \E'',那么我希望在这些情况下有某些表达式,比如 A 或 B。在所有其他情况下,我希望仅拥有 E,而不管 \E 之前或之后是什么。以下是测试
$any \E' some$
-> 任意 A 一些$any \E'' some$
-> 任何 B 一些$any \E some$
-> 任何 E 一些
我不想使用较长形式的命令,\E{arg1}{arg2}
而只想使用 \E'
,\E''
形式。例如,
\def\E#1#2{my code}
然后使用类似的东西时就会出现问题
$$
x \E' \sin x
$$
或者
$$
A \E b
$$
因为在后一种情况下,“b”不应被视为的参数,\E
并且前一种情况下在正弦前面加斜线的原因相同。
答案1
您可能会喜欢一个通用接口,用于定义任意数量的相同类型的命令:
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\declareprimedcommand} { m m m m }
{% #1 = command to define
% #2 = text for no prime
% #3 = text for one prime
% #4 = text for two primes
\maximav_primedcommand:Nnnn #1 { #2 } { #3 } { #4 }
}
\cs_new_protected:Npn \maximav_primedcommand:Nnnn #1 #2 #3 #4
{
\cs_new_protected:Npn #1
{
\peek_charcode_remove:NTF '
{ \peek_charcode_remove:NTF ' { #4 } { #3 } }
{ #2 }
}
}
\ExplSyntaxOff
\declareprimedcommand{\E}{x}{y}{z}
\begin{document}
$a \E b$
$a \E' b$
$a \E'' b$
\end{document}
答案2
这里有一种方法:
\documentclass{article}
\makeatletter
\def\@ifprime#1{\@ifnextchar'{\@firstoftwo{#1}}}
\newcommand\E{\@ifprime\E@i\E@}
\def\E@i{\@ifprime{B}{A}}
\def\E@{E}
\makeatother
\begin{document}
\[ x \E' \sin x \]
\[ x \E'' \sin x \]
\[ x \E \sin x \]
\end{document}