为什么在运行的文本中使用 \mark 时,普通 TeX 标准插入例程会被破坏?

为什么在运行的文本中使用 \mark 时,普通 TeX 标准插入例程会被破坏?

我使用 Edmac 中的纯 XeTeX 排版学术版,第一次遇到了一个可能难以解决的问题。有问题的文本的章节编号经常变化,这些编号可能出现在段落开头或段落正文中。这些编号以粗体数字给出,理想情况下应该通过 a \mark(或更确切地说是\marks)命令拾取,以便它们可以与其他变化元素一起出现在连续标题中。

问题在于,在 Edmac 行号标注的文本中,所有普通 TeX 的标准插入例程都失效了。\mark在运行的文本中间插入一个 会导致行断裂,因此仅有的正确的东西是标题 - 其他一切都乱七八糟。关于如何克服这个问题有什么建议吗?我模糊地想到了\write,但我认为它不能用来做必要的事情 - 即在左标题中放置该页面第一行中正在运行的部分编号,在右标题中放置该页面最后一行中正在运行的部分编号。我思考分页稳定后,我必须手动执行这些操作。或者还有其他解决方案吗?

答案1

这个答案并不完整,特别是因为您没有提供任何 MWE。

问题不是由输出例程的修改引起的,而是由于 edmac(及其派生程序 ledmac、eledmac 和 reledmac)使用 \vsplit 将每个 \pstart...\pstart 的内容拆分为单独的行,以便添加行号和管理关键注释等,还添加了一些附加内容。我不知道具体在哪里。

解决方案确实是使用 \write。更准确地说

  1. 不要直接调用 ,而是 \mark{content}将其写入带编号的辅助文件中,并包装在您自己的命令中。在您的带编号的辅助文件中,您应该得到类似这样的内容

    \@l \@insidethislinehook{\mark{content}} \@l 您可以使用它\unexpanded来帮助您解决扩展问题。\@l每行都由 edtex 编写,并且在第二次运行时增加行计数器。

  2. 读取 .1 文件时,\@insidethislinehook会将其参数存储在名称包含行号的宏中(\absline@num,要定义这样的宏,请使用\csname
  3. \do@line必须重新定义才能调用步骤 2 中在其中一个 hbox 中定义的命令。我不太了解 edmac,因为我开始使用 ledmac,但我认为它应该位于此 hbox 的开头\hbox to \hsize{\affixline@num{

这是我为 reledmac 使用的方法,参见 https://github.com/maieul/ledmac/commit/14aaca05ff72c9adf1ab35923df36fdb2173b6bb

当然,这段代码的内容你不感兴趣,因为它是 reledmac 特有的。但请参阅 l. 9063(步骤 1);l. 9075(步骤 2)和 8919(步骤 3)。

相关内容