Gere chaves booleanas xkeyval 'on the fly'

Gere chaves booleanas xkeyval 'on the fly'

Não sou especialista em TeX/LaTeX, recentemente escrevi um pacote sobre 'problemas' e 'soluções' que pretende ser exibido no final do documento, porém não se restringe a esse propósito. Para conseguir esse comportamento, entre outros recursos, usei o xkeyvalpacote, com muitas macros-chave e chaves booleanas também.

Eu quero fornecer uma versão melhor e me livrar de dezenas de linhas de definição de macro chave e definições de chave booleanas basicamente parecidas, mas apenas configurando alguns sinalizadores, substituindo a tediosa entrada de código LaTeX por alguns comandos curtos como

\GenerateBoolKey[true]{SomeKeys}{DummyBoolKey}

Isto deve definir a chave booleana DummyBoolKeypertencente à família SomeKeyscomo se alguém tivesse escrito

\define@boolkey{SomeKeys}{DummyBoolKey}[true]{%
\ifKV@SomeKeys@DummyBoolKey%
%Do something if true%
\else%
%Do something different if false%
\fi%
}%

A xkeyvaldocumentação (versão 2.6b) diz na página 7 que está definida uma macro \ifKV@fam@keycomo\newif

Bem, falhei ao escrever o comando acima e usar a \ifKV macro, aqui está um exemplo mínimo (não) funcional, que falha durante a compilação com mensagem de erro

     ! Too many }'s.

Aqui está um exemplo mínimo

\documentclass{minimal}
\usepackage{xkeyval}

\makeatletter

\providecommand{\GenerateBoolKey}[3][false]{%
\define@boolkey{#2}{#3}[#1]{%
\csname ifKV@#2@#3 \endcsname%
\typeout{true}%  % Do something if true
\else%
\typeout{false}%   % Do something different if false
\fi%
}% End of  \define@boolkey
}% End of \providecommand

\makeatother

% 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...

}%

\begin{document}

\GenerateBoolKey{SomeKeys}{DummyBoolKey}%
\DummyCommand[DummyBoolKey=true]%

\end{document}

Como posso fornecer o \newifcomando instantaneamente com meu código 'wrapper' para fornecer o \ifKVteste booleano?

Responder1

Isso parece um problema com o aninhamento condicional. A melhor abordagem aqui me parece ser forçar a expansão do nome “antecipadamente”, para que você tenha uma definição idêntica à que obteria “manualmente”.

\documentclass{article}
\usepackage{xkeyval}

\makeatletter

\providecommand{\GenerateBoolKey}[3][false]{%
  \begingroup
  \edef\x{\endgroup
    \noexpand\define@boolkey{#2}{#3}[#1]{%
      \expandafter\noexpand\csname ifKV@#2@#3\endcsname%
        \noexpand\typeout{true}%  % Do something if true
      \noexpand\else%
        \noexpand\typeout{false}%   % Do something different if false
      \noexpand\fi%
    }% End of  \define@boolkey
  }% End of defintion of \x
  \x
}% End of \providecommand

\makeatother

% 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...

}%

\begin{document}

\GenerateBoolKey{SomeKeys}{DummyBoolKey}%
\DummyCommand[DummyBoolKey=true]%

\end{document}

Isso funciona definindo \xdentro de um grupo que é fechado quandousar \x, e que força a expansão do nome sem expandir mais nada (daí muitos \noexpands).

informação relacionada