xkeyvalのブールキー値が失敗する

xkeyvalのブールキー値が失敗する

マクロに格納されたブールキー値を、次のようなコマンドに渡すことができます。

\edef\SomeKeyValue{true}%

\DummyCommand[DummyBooleanKey=\SomeKeyValue]%%% 

ここで、DummyBooleanKeyは次のように定義されるブールキーです。

\define@boolkey{SomeKeys}{DummyBooleanKey}[false]{%%%% etc.

しかし、MNWEに従ってコンパイルしようとすると失敗します。

\documentclass{minimal}
\usepackage{xkeyval}
\usepackage{etoolbox}

\makeatletter

\define@boolkey{SomeKeys}{DummyBoolKey}[false]{%
\ifKV@SomeKeys@DummyBoolKey%
\typeout{true}%
\else%
\typeout{false}%
\fi%
}%


% Key Family is called SomeKeys

% Use a fake command for testing purposes

\providecommand{\DummyCommand}[1][false]{%

\setkeys{SomeKeys}{#1}%

% Do something useful inside this command...

}%

\edef\SomeKeyValue{true}%

\begin{document}

% Works
\DummyCommand[DummyBoolKey=true]%

% Does not work!
\DummyCommand[DummyBoolKey={\SomeKeyValue}]%


\end{document}

リテラルtrueまたはfalse値をキー値パラメータとして使用するにはどうすればよいですか?newtoksこの機能を実現するには を使用する必要がありますか?

答え1

Keyvalは実装する非常に注意深い傾向があるない入力を「順序どおりに」展開しないため、あなたが見ている問題はxkeyval- 固有のものではありません。ブールキーを含む固定された選択肢のリストを取るキーの場合、この意図的な動作は、

\def\myvariable{some-valid-input}
\KeySettingCommand{valid-key-name=\myvariable}

動作しません。そのため、キーと値の両方を保存して事前に展開する必要があります。

\def\myvariable{valid-key-name=some-valid-input}
\expandafter\KeySettingCommand\expandafter{\myvariable}

または、keyval 構造全体を保存します。

\def\myvariable{\KeySettingCommand{valid-key-name=some-valid-input}}
\myvariable

\edefここで を使用することで違いは生じないことに注意する。 は、定義のポイント、 ない使用場所

答え2

\setkeysキーと値のペアを調べると、いいえ拡張; のようなもの

\begin{itemize}[label=\arabic*]

これを使用した場合、悲惨な失敗に終わります。したがって、2 番目のケースでは、 は\SomeKeyValue展開なしで の値として渡されますDummyBoolKeyが、これは不正です。このキーには または (または何も必要なく、定義によれば と同等) のいずれかが必要なtrueためfalseですfalse

やっている

\edef\SomeKeyValue{true}

は役に立ちません。\def\SomeKeyValue{true}のトークンはどれもtrue展開可能ではないため、これは と完全に同等です。

値にシンボリック トークン (実際には拡張可能なトークン) が含まれていない場合は、別の方法で定義できます\DummyCommand

\makeatletter
\newcommand{\DummyCommand}[1][false]{%
  \begingroup\protected@edef\x{\endgroup
    \noexpand\setkeys{SomeKeys}{#1}}\x
  % Do something useful inside this command...
}
\makeatother

ただし、オプションが例のような場合には、これは大きな問題になりますitemize

関連情報