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*]

이것이 사용된다면 비극적으로 실패할 것입니다. 따라서 두 번째 경우에는 \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.

관련 정보