为什么使用ledpar会导致文档失败?

时间:2009-06-15 20:33:23

标签: latex

这是我最小的LaTeX文档:

\documentclass{article}

\usepackage[polutonikogreek,english]{babel}
\newcommand{\Gk}[1]{\selectlanguage{polutonikogreek}#1\selectlanguage{english}}

\usepackage{ledmac}
\newcommand{\cn}[1]{\Afootnote{#1}}

\usepackage{ledpar}

\begin{document}
\beginnumbering
\pstart
\edtext{apostle}{\cn{\Gk{apostoloc}}}
\pend
\endnumbering
\end{document}

执行latex test.tex会产生以下错误:

...
Section 1 (./test.1)
! Missing control sequence inserted.
<inserted text> 
                \inaccessible 
l.15 \pend

?

一些注意事项:

  1. 尽管出现错误,但生成的DVI看起来还不错。

  2. 评论\usepackage{ledpar}可以解决问题。

  3. 不使用\Gk命令也可以解决问题。 (但有点挫败了脚注的目的。)

  4. 这里发生了什么以及如何解决错误消息?

1 个答案:

答案 0 :(得分:1)

根据FAQ

  

有时,LaTeX会保存稍后会重读的数据。这些数据通常是某些命令的论据;他们就是所谓的动人论点。 ('移动',因为数据被移动。)候选者是可以进入目录,数字列表等的所有参数;即,写入辅助文件并稍后读取的数据。其他地方是那些可能出现在头部或边线的数据。章节标题和人物标题是最突出的例子; Lamport的书中有一份完整的清单(参见TeX相关书籍)。

     

幕后真的发生了什么?移动参数中的命令通常在保存过程中扩展为其内部结构。有时,此扩展会导致无效的TeX代码,该代码在扩展期间或再次处理代码时显示。使用“\ protect \ cmd”保护命令告诉LaTeX将\ cmd保存为\ cmd,而根本不扩展它。

所以\Gk命令在TeXing文件的过程中过早地扩展并导致非法代码。最简单的解决方案是声明命令robust:

\usepackage{makerobust}
\DeclareRobustCommand{\Gk}[1]{\selectlanguage{polutonikogreek}#1\selectlanguage{english}}

至于为什么使用ledpar包产生错误,我不太确定。为了便于并行文本左侧和右侧的注释,ledpar包需要重新定义ledmac包提供的几乎所有命令。虽然我没有找到令人讨厌的区别,但是一个或多个重新定义必须导致脆弱的命令过早扩展。