4

パラメータの新しい値をテストするための「ヘルパー」マクロを作成することに時間を費やしました。それ以外の場合は、既存の値を使用します。すべてのパラメータ位置にデフォルト値が存在します。

私は書くことができるようにしたかった:

\foo{left}{nil}{}{20pt}

2 番目のパラメーターは現在の値を使用しますが、3 番目の値は値の空の文字列になります。私は表記法を使いたかった:

\edef\pA{\isnil{#1}{\pA){#1}} % one for each parameter

\isnil を次のように定義しました。

\def\nil{nil}
\def\isnil#1#2#3{%
  \edef\nilTest{#1}%
  \ifx\nilTest\nil#2\else#3\fi
}

しかし、実行しようとすると、TeX は \nilTest が未定義の制御シーケンスであると不平を言いました。もちろんそれは本当ですが、 \pA に値のレシピではなく値を保持させたいので、 \edef でなければなりません。これは、すべてのマクロ テストが展開されることを意味しますが、 \edef は \ を保護しません。 nilTest -- これは \noexpand を使用する場所ですか -- 私にはうまくいきませんでした。

編集: \cs 名に数字はありません (ええ、私はそれを知っていました。)

4

1 に答える 1

3

なぜあなたのソリューションは機能しないのですか?\edef\pA{\isnil{#1}{\pA){#1}}展開\isnilして取得し\edef\nilTest{...ます。現在\edefは展開できず、最初の要素として\pAのシーケンスに分類されます。次のマクロを展開しようとすると\nilTest失敗します。

\setpar次のコードから使用して、パラメーターを変更します。

\def\nil{nil}
\def\setpar#1#2{%
  \edef\nilTest{#2}%  
  \ifx\nilTest\nil\else\let#1\nilTest\fi}

\def\first{old first}
\def\second{old second}
\setpar \first{nil}
\setpar \second{new}

first = ``\first'', second = ``\second''

PSマクロで数字を使用しないでください。

于 2009-12-08T16:27:30.527 に答える