在 scrlayer-notecolumn 的 makenote 中使用数学重音符号时出错

在 scrlayer-notecolumn 的 makenote 中使用数学重音符号时出错

考虑以下 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}}

我已经测试过这个解决方案,它确实有效。

相关内容