我目前正在使用宏,
\def\<#1: #2: #3\>{\langle #1\;:\if#2\empty\else\;#2\;\fi:\;#3\rangle}
取自:http://ctan.org/pkg/tex-ewd。
我还想制作另一个类似的宏,
\def\<#1 if #2 else #3\>{ \langle #1\; \lhd #2\; \rhd \;#3\rangle }
但后者与前者相冲突。看来我只能选择其中之一。如能就此事提供帮助,我将不胜感激!
谢谢你!
附言:我对多重删除器或具有此类结构的宏不太了解。任何帮助或有关进一步了解此内容的指导都将非常受欢迎!
答案1
你自找麻烦。宏应该可以一工作。不过,这里是。\numexpr
应该允许使用 ConTeXt,但可能不需要设置字体来使用\lhd
和\rhd
\def\<#1\>{\moseslookforif#1if\moseslookforif}
\def\moseslookforif#1if#2\moseslookforif{%
\ifx\hfuzz#2\hfuzz
% no if in the argument
\mosescolon#1\mosescolon
\else
\mosesifelse#1if#2\mosesifelse
\fi
}
\def\mosescolon#1: #2: #3\mosescolon{%
\langle #1:\ifx\hfuzz#2\hfuzz\else#2\fi:#3\rangle
}
\def\mosesifelse#1 if #2 else #3if\mosesifelse{%
\langle #1 \lhd #2 \rhd #3\rangle
}
%%% Code possibly to be omitted, if \lhd and \rhd are already available
\font\tenlasy=lasy10
\font\sevenlasy=lasy7
\font\fivelasy=lasy5
\newfam\lasyfam
\textfont\lasyfam=\tenlasy
\scriptfont\lasyfam=\sevenlasy
\scriptscriptfont\lasyfam=\fivelasy
\mathchardef\lhd=\numexpr2*"1000+\lasyfam*"100+"01\relax
\mathchardef\rhd=\numexpr2*"1000+\lasyfam*"100+"03\relax
%%% end of code to possibly omit
% the example
$\<a : b : c\>$
$\<x if y else z\>$
\bye
请注意,测试\if#2\empty
是错误的yy
例如,如果宏的第二个参数是,它将返回 true ,而这当然是我们不希望看到的。
\;
我删除了原始宏中引入的多余空格。
答案2
你承认自己是初学者,所以我们先分析一下你提出的方案。当你说
\def\<#1: #2: #3\>{\langle #1\;:\if#2\empty\else\;#2\;\fi:\;#3\rangle}
您正在定义一个名为 的宏\<
,这意味着您的 .tex 文件必须包含此标记才能调用该宏。此外,您定义的语法表明您的 .tex 输入必须使用以下(非常严格的语法)调用该宏:\<FIRSTARG:SPACE SECONDARG:SPACE THIRDARG\>
。如果您省略空格,编译将失败并出现错误。如果任何参数本身包含空格或冒号,那么同样会产生错误(或列出错误的参数定义)。
因此当你能以这种方式定义宏,似乎使用起来不方便。更可能的情况是,您希望输出看起来有某种样子,而不是要求输入输入以某种方式出现。在 LaTex 中,为 3 个参数输入定义此类宏的正常方式是 \newcommand\macroname[3]{...macros to produce the desired output using inputs #1, #2, and #3...}
。调用形式则是\macroname{FIRSTARG}{SECONDARG}{THIRDARG}
。这样,括号将输入分隔开来,现在可以包含冒号和空格而不会产生歧义,
因此,如果我定义了\newcommand\colonangle[3]{\langle #1\;:\if#2\empty\else\;#2\;\fi:\;#3\rangle}
,那么我就可以使用以下语法获得所需的第一个宏输出,例如\colonangle{x}{y}{z}
。
现在来看第二个例子。它不仅会创建一个名为的宏\<
(与之前的宏名重复,但现在需要不同的输入语法),还要求您if
在else
输入文件。相反,我建议使用第二个宏定义,以避免混淆,使用更标准的输入语法。
\documentclass{article}
\usepackage{amssymb}
\newcommand\colonangle[3]{\langle #1\;:\if#2\empty\else\;#2\;\fi:\;#3\rangle}
\newcommand\arrowangle[3]{ \langle #1\; \lhd #2\; \rhd \;#3\rangle }
\begin{document}
$\colonangle{A}{B}{C} \ne \arrowangle{A}{B}{C}$
\end{document}