我正在创建一个类,如果某个包可用,它应该定义一个命令:
\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}