
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 xkeyval
pacote, 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 DummyBoolKey
pertencente à família SomeKeys
como 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 xkeyval
documentação (versão 2.6b) diz na página 7 que está definida uma macro \ifKV@fam@key
como\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 \newif
comando instantaneamente com meu código 'wrapper' para fornecer o \ifKV
teste 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 \x
dentro de um grupo que é fechado quandousar \x
, e que força a expansão do nome sem expandir mais nada (daí muitos \noexpand
s).