
マクロに格納されたブールキー値を、次のようなコマンドに渡すことができます。
\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
。