类似结构化的宏

类似结构化的宏

我目前正在使用宏,

\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}

现在来看第二个例子。它不仅会创建一个名为的宏\<(与之前的宏名重复,但现在需要不同的输入语法),还要求您ifelse输入文件。相反,我建议使用第二个宏定义,以避免混淆,使用更标准的输入语法。

\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}

在此处输入图片描述

相关内容