類似構造マクロ

類似構造マクロ

私は現在マクロを使用していますが、

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

しかし、後者は前者と衝突します。どちらか一方しか選択できないようです。この件に関してご助力いただければ幸いです。

ありがとう!

PS. 複数の deletmiter や、そのような構造を持つマクロについてはあまり詳しくありません。これについてさらに学ぶための助言や指示があれば、大歓迎です。

答え1

恥辱を求めているのなら、マクロで十分だ1つ仕事。しかし、ここにあります。の使用は\numexprConTeXtで許可されるはずですが、おそらく使用するためにフォントを設定する必要はありません\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たとえば、マクロの 2 番目の引数が の場合は 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}

2番目の例を見てみましょう。これは、\<(前のマクロ名と重複していますが、異なる入力構文を必要とする)という名前のマクロを作成するだけでなく、次のような単語を使用する必要がありますifelse入力ファイル。代わりに、混乱を避けるために、より標準的な入力構文を使用した 2 番目のマクロ定義を提案します。

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

ここに画像の説明を入力してください

関連情報