我创建了一些宏来简化论文中证明和定理的排版。
%the proof builder, takes 1 argument, should be a sequence of \psteps, definined next
\newcommand{\prf}[1]
{
\begin{proof}
\begin{align}
#1
\end{align}
\end{proof}
}
% \pstep is designed for use inside the align block of a proof. takes 2 arguments {step::wff}{reference::label}
\newcommand{\pstep}[2]
{
& #1 & \text{[#2]}
}
%the theorem builder. takes 5 arguments
%{thm type::thm type str}{thm name::text}{reference::label}{thm statement::mathmode}{proofsteps::pstep block}
\newcommand{\theorem}[5]
{
\begin{#1}[#2]#3
\begin{equation*}
#4
\end{equation*}
\prf{#5}
\end{#1}
}
这些宏按预期工作。但是,当我使用上面的定理宏时,第 4 个参数包含一些只在数学模式下出现的字符,而 Overleafs 语法检查器发出警告,指出这些字符不在数学模式下。
\theorem{prop}{generalized modus ponens}{\label{pred:prop:gmp}}
{
\vdash_1\phi\vdash_1(\forall x\phi\implies\psi)\tfs\vdash_1\psi
}
{
\pstep{\phi}{hypothesis 1}\\
\pstep{\forall x\phi}{\ref{pred:ax:gen}}\\
\pstep{\forall x\phi\implies\psi}{hypothesis 2}\\
\pstep{\psi}{\ref{prop:ax:mp}}
}
有趣的是,它不会对 \pstep 参数中的数学模式字符发出相同的警告。有人能解释一下这是为什么吗?有没有办法指定宏参数中允许使用哪种字符,以便语法检查器知道数学模式字符会起作用?同样,宏可以按预期工作,但我不想查看这些不相关的错误消息,尤其是当它们只是杂乱的实际错误时。
答案1
好吧,我找到了一个解决方案,我只是改用 xparse 包来创建我的自定义命令。这是新代码。
% \pstep is designed for use inside the align block of a proof. takes 2 arguments {step::wff}{reference::label}
\newcommand{\pstep}[2]
{
& #1 & \text{[#2]}
}
%the theorem builder. takes 6 arguments {thm type::thm type str(default thm)}{thm name::text}{reference::label}{href::href}{thm statement::mathmode}{proofsteps::pstep block}
\NewDocumentCommand\theorem{O{thm} m m O{} m m}%
{
\begin{#1}[#2]#3#4
\begin{equation*}
#5
\end{equation*}
\begin{proof}
\begin{align}
#6
\end{align}
\end{proof}
\end{#1}
}
这不会给语法检查器带来错误,并且我可以更好地控制参数选项。