有条件地使用 package 和 define 命令

有条件地使用 package 和 define 命令

我正在创建一个类,如果某个包可用,它应该定义一个命令:

\IfFileExists{eforms.sty}{
   \usepackage[xetex]{eforms}
   \everyTextField{\textFont{GaramondNo8}\textSize{12}}
   \newcommand{\dsaTextInput}[3][12]{\raisebox{-0.35ex}{\textField[\textSize{#1}]{#2}{#3}{1em}}}
}{}

但是,如果我尝试编译它,我会得到:

! Illegal parameter number in definition of \reserved@a.
<to be read again>
                   1
l.7 }{}

l.7是我展示的代码的最后一行。如果我删除条件,它会按预期工作。我做错了什么?

答案1

您只需将#符号加倍:

\IfFileExists{eforms.sty}{
   \usepackage[xetex]{eforms}
   \everyTextField{\textFont{GaramondNo8}\textSize{12}}
   \newcommand{\dsaTextInput}[3][12]{\raisebox{-0.35ex}{\textField[\textSize{##1}]{##2}{##3}{1em}}}
}{}

为什么要加倍?因为“真”和“假”分支被传递给\def\reserved@a{<true>}\def\reserved@b{<false>},所以适用通常的规则。

参数中的双井号(数字符号,哈希字符)##1 是什么意思?了解更多信息

答案2

类似于这样的答案\InputIfFileExists 或 \IfFileExists 的可扩展版本

\documentclass{article}
\IfFileExists{eforms.sty}{\def\x{T}}{\def\x{F}}
\if T\x%
   \usepackage{eforms}
   \everyTextField{\textFont{GaramondNo8}\textSize{12}}
   \newcommand{\dsaTextInput}[3][12]{\raisebox{-0.35ex}{\textField[\textSize{#1}]{#2}{#3}{1em}}}
\else
  \newcommand{\dsaTextInput}[3]{dsaTextInput Not Defined}
\fi
\begin{document}
\x
\dsaTextInput{10pt}{12pt}{Text}
\end{document}

相关内容