\renewcommand 具有完全相同的定义导致奇怪的错误

\renewcommand 具有完全相同的定义导致奇怪的错误

我正在使用该dramatist软件包排版戏剧剧本。使用 -command 创建角色\GCharacter。我想自定义该命令,使其\NewPerson对每个新创建的角色执行。

为此,我查找了dramatist.sty系统上安装的并将的定义复制\GCharacter到我的序言中,如下所示:

\renewcommand\GCharacter[3]{
    \stepcounter{g\Roman{character}}
    \global\@namedef{#3}{{\namefont #2}\xspace}
    \global\n@me@ppend@nddef{#3}{\@ppendname}{%
        \if@drverse
            {\speakstab\speaksfont #2\speaksdel\par\nobreak\addvspace{-\parskip}}
        \else
            \item[#2\speaksdel]
        \fi}
    \global\n@me@ppend@nddef{gpersona@\Roman{character}}{%
        @\Roman{g\Roman{character}}}{\castfont #1}
}

这是来自 -file 的确切定义dramatist.sty。但是,LaTeX 抱怨:! You can't use \spacefactor in vertical mode.在第一行我使用了\GCharacterin。这怎么可能呢,因为与原始定义相比,我没有做任何更改?

在以下 MWE 中,错误发生在第 19 行:

\documentclass[a4paper]{scrartcl}
\usepackage{dramatist}
\usepackage{lipsum}

\renewcommand\GCharacter[3]{
    \stepcounter{g\Roman{character}}
    \global\@namedef{#3}{{\namefont #2}\xspace}
    \global\n@me@ppend@nddef{#3}{\@ppendname}{%
        \if@drverse
            {\speakstab\speaksfont #2\speaksdel\par\nobreak\addvspace{-\parskip}}
        \else
            \item[#2\speaksdel]
        \fi}
    \global\n@me@ppend@nddef{gpersona@\Roman{character}}{%
        @\Roman{g\Roman{character}}}{\castfont #1}
    %\NewPerson
}

\begin{CharacterGroup}{TeX.SX}
\GCharacter{A Character}{A Character}{character}
\end{CharacterGroup}

\begin{document}
\DramPer

\lipsum[1] % Compilation fails with only \DramPer in document
\end{document}

没有\renewcommand,一切正常:我的MWE

关于如何修复该错误有什么线索吗?

答案1

它应该是:

\documentclass[a4paper]{scrartcl}
\usepackage{dramatist}
\usepackage{lipsum}

\makeatletter % here
\renewcommand\GCharacter[3]{
    \stepcounter{g\Roman{character}}
    \global\@namedef{#3}{{\namefont #2}\xspace}
    \global\n@me@ppend@nddef{#3}{\@ppendname}{%
        \if@drverse
            {\speakstab\speaksfont #2\speaksdel\par\nobreak\addvspace{-\parskip}}
        \else
            \item[#2\speaksdel]
        \fi}
    \global\n@me@ppend@nddef{gpersona@\Roman{character}}{%
        @\Roman{g\Roman{character}}}{\castfont #1}
    %\NewPerson
}
\makeatother

\begin{CharacterGroup}{TeX.SX}
\GCharacter{A Character}{A Character}{character}
\end{CharacterGroup}

\begin{document}
\DramPer

\lipsum[1] % Compilation fails with only \DramPer in document
\end{document}

在 *.sty 文件中@,是字母,而在普通的 *.tex 文件中则不是,因此其含义在本地切换。

相关内容