
私は現在マクロを使用していますが、
\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つ仕事。しかし、ここにあります。の使用は\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
たとえば、マクロの 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番目の例を見てみましょう。これは、\<
(前のマクロ名と重複していますが、異なる入力構文を必要とする)という名前のマクロを作成するだけでなく、次のような単語を使用する必要がありますif
。else
入力ファイル。代わりに、混乱を避けるために、より標準的な入力構文を使用した 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}