“即時”產生 xkeyval 布林鍵

“即時”產生 xkeyval 布林鍵

我不是 TeX/LaTeX 專家,最近我寫了一個關於「問題」和「解決方案」的包,旨在顯示在文件的末尾,但它不限於此目的。為了實現這種行為,除其他功能外,我使用了該xkeyval包,其中還包含許多關鍵巨集和布林鍵。

我想提供一個更好的版本,並擺脫數十個關鍵的巨集定義行和布林鍵定義,它們基本上看起來很相似,但只是設定一些標誌,用一些簡短的命令代替繁瑣的LaTeX 程式碼輸入,例如

\GenerateBoolKey[true]{SomeKeys}{DummyBoolKey}

DummyBoolKey這應該定義屬於 family 的布林鍵SomeKeys,就像人們會寫一樣

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

文件xkeyval(版本 2.6b)在第 7 頁上說,定義了一個巨集\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,並且強制擴展名稱而不擴展任何其他內容(因此有很多\noexpands)。

相關內容