![为什么在运行的文本中使用 \mark 时,普通 TeX 标准插入例程会被破坏?](https://linux22.com/image/382764/%E4%B8%BA%E4%BB%80%E4%B9%88%E5%9C%A8%E8%BF%90%E8%A1%8C%E7%9A%84%E6%96%87%E6%9C%AC%E4%B8%AD%E4%BD%BF%E7%94%A8%20%5Cmark%20%E6%97%B6%EF%BC%8C%E6%99%AE%E9%80%9A%20TeX%20%E6%A0%87%E5%87%86%E6%8F%92%E5%85%A5%E4%BE%8B%E7%A8%8B%E4%BC%9A%E8%A2%AB%E7%A0%B4%E5%9D%8F%EF%BC%9F.png)
我使用 Edmac 中的纯 XeTeX 排版学术版,第一次遇到了一个可能难以解决的问题。有问题的文本的章节编号经常变化,这些编号可能出现在段落开头或段落正文中。这些编号以粗体数字给出,理想情况下应该通过 a \mark
(或更确切地说是\mark
s)命令拾取,以便它们可以与其他变化元素一起出现在连续标题中。
问题在于,在 Edmac 行号标注的文本中,所有普通 TeX 的标准插入例程都失效了。\mark
在运行的文本中间插入一个 会导致行断裂,因此仅有的正确的东西是标题 - 其他一切都乱七八糟。关于如何克服这个问题有什么建议吗?我模糊地想到了\write
,但我认为它不能用来做必要的事情 - 即在左标题中放置该页面第一行中正在运行的部分编号,在右标题中放置该页面最后一行中正在运行的部分编号。我思考分页稳定后,我必须手动执行这些操作。或者还有其他解决方案吗?
答案1
这个答案并不完整,特别是因为您没有提供任何 MWE。
问题不是由输出例程的修改引起的,而是由于 edmac(及其派生程序 ledmac、eledmac 和 reledmac)使用 \vsplit 将每个 \pstart...\pstart 的内容拆分为单独的行,以便添加行号和管理关键注释等,还添加了一些附加内容。我不知道具体在哪里。
解决方案确实是使用 \write。更准确地说
不要直接调用 ,而是
\mark{content}
将其写入带编号的辅助文件中,并包装在您自己的命令中。在您的带编号的辅助文件中,您应该得到类似这样的内容\@l \@insidethislinehook{\mark{content}} \@l
您可以使用它\unexpanded
来帮助您解决扩展问题。\@l
每行都由 edtex 编写,并且在第二次运行时增加行计数器。- 读取 .1 文件时,
\@insidethislinehook
会将其参数存储在名称包含行号的宏中(\absline@num
,要定义这样的宏,请使用\csname
) \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)。