
我不是 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
,並且強制擴展名稱而不擴展任何其他內容(因此有很多\noexpand
s)。