考虑以下 LaTeX 代码:
\documentclass{scrartcl}
\usepackage{scrlayer-scrpage,scrlayer-notecolumn}
% The rest of the preamble is taken from
% https://tex.stackexchange.com/a/421866/21685
\usepackage{amsmath,accents}
\newcommand{\genericmathaccent}[2]{%
\vbox{\offinterlineskip\ialign{%
##\cr
\hidewidth$\scriptstyle#1$\hidewidth\cr
\noalign{\kern-.5ex}
$#2$\cr}%
}%
}
\newcommand{\genericmathaccenti}[2]{%
\genericmathaccent{#1{}}{#2}%
}
\newcommand{\gravedot}[1]{\genericmathaccenti{\grave}{#1}}
\begin{document}
$\gravedot{a}$%
\makenote{$\grave{a}$}
%\makenote{$\gravedot{a}$}
\end{document}
它编译成功(我使用 LuaLaTeX),并产生以下排版输出:
但是,当我将最后一个%
符号移动到它前面的行时:
%\makenote{$\grave{a}$}
\makenote{$\gravedot{a}$}
编译失败,日志文件中出现以下错误信息:
! Illegal parameter number in definition of \reserved@a.
<to be read again>
\cr
l.21 \makenote{$\gravedot{a}$}
?
! Emergency stop.
<to be read again>
\cr
l.21 \makenote{$\gravedot{a}$}
End of file on the terminal!
是什么原因导致了错误?如何修复?
答案1
Per egreg 的评论\gravedot
,可以通过使用\DeclareRobustCommand
而不是使用来定义命令来解决该问题\newcommand
:
\newcommand{\genericmathaccent}[2]{%
\vbox{\offinterlineskip\ialign{%
##\cr
\hidewidth$\scriptstyle#1$\hidewidth\cr
\noalign{\kern-.5ex}
$#2$\cr}%
}%
}
\newcommand{\genericmathaccenti}[2]{%
\genericmathaccent{#1{}}{#2}%
}
\DeclareRobustCommand{\gravedot}[1]{\genericmathaccenti{\grave}{#1}}
我已经测试过这个解决方案,它确实有效。