
私は TeX/LaTeX の専門家ではありませんが、最近、文書の最後に表示されることを意図した「問題」と「解決策」に関するパッケージを作成しましたが、その目的に限定されるわけではありません。他の機能の中でも特に、その動作を実現するために、xkeyval
多くのキー マクロとブール キーも備えたパッケージを使用しました。
私はより良いバージョンを提供し、基本的に同じように見えるがいくつかのフラグを設定するだけの数十の重要なマクロ定義行とブールキー定義を取り除き、LaTeXコードの退屈な入力を次のような短いコマンドに置き換えたいと思っています。
\GenerateBoolKey[true]{SomeKeys}{DummyBoolKey}
これは、次のように記述した場合と同様に、DummyBoolKey
ファミリーに属するブールキーを定義します。SomeKeys
\define@boolkey{SomeKeys}{DummyBoolKey}[true]{%
\ifKV@SomeKeys@DummyBoolKey%
%Do something if true%
\else%
%Do something different if false%
\fi%
}%
ドキュメント(バージョン2.6b)の7ページには、次のようなxkeyval
マクロが定義されていると書かれています。\ifKV@fam@key
\newif
さて、私は上記のコマンドを書いて\ifKV
マクロを使うのに失敗しました。ここに、コンパイル中にエラーメッセージが表示されて失敗する最小限の(非)動作例があります。
! Too many }'s.
ここに簡単な例を挙げます
\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}
\newif
ブールテストを提供するために、「ラッパー」コードを使用してコマンドをオンザフライで提供するにはどうすればよいですか\ifKV
?
答え1
これは条件付きネストの問題のようです。ここでの最善のアプローチは、名前の拡張を「前もって」強制して、「手動で」得られる定義と同一の定義を得ることであると思われます。
\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}
これは\x
、閉じたグループ内で定義することで機能します。使用 \x
これにより、他の部分を展開せずに名前を展開するようになります (したがって、\noexpand
s が多くなります)。