
매크로에 저장된 부울 키 값을 다음과 같은 명령에 넘겨줄 수 있습니다.
\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
.