在尝试为图书项目定制目录时,我想在目录中的两个项目之间添加一些垂直空间。
从阅读 OPmac 源代码来看,TOC 似乎是从 TeX 读取时的 .ref 文件生成的\input opmac
。因此,为了添加自定义 TOC 条目,需要在该\input opmac
行之前写入代码。
为此我写了这篇文章:
\def\Xspace#1{\addto\toclist{\par#1}}
\input opmac
.
.
.
\Xspace{{\vskip 20pt}}
.
.
.
\bye
我确实实现了在期望看到的位置插入 20pt 垂直空间的目标,但我对需要将东西放在 {{ }} 双括号中并不感到兴奋,也不确定如何解决这个问题。
我的问题是:OPmac 中是否有更惯用的方法来实现向目录添加任意内容的目标?
答案1
当然,如果您需要声明.ref
文件中使用的新命令(例如\Xspace
),那么您必须在之前定义它\input *.ref
,这在期间完成\input opmac
。
另一方面,可以将简单的命令写入文件.ref
而无需声明新的特殊宏。相反
\wref\Xspace{{\vskip 20pt}}
你可以写
\write\reffile{\string\addto\string\toclist{\vskip20pt}}
但是这种方法\addto\toclist
存在一个问题。\toclist
在两种不同情况下使用:生成目录时和\outlines
宏生成 PDF 轮廓时。在第二种情况下,\tocline
宏(包含在中\toclist
)被重新定义。
我的第一个想法略有不同。当排版设计师需要打印不同形状的目录时,他可以重新定义宏\tocline
。此宏有五个参数:
\tocline {level}{recommended font}{number}{text}{page}
其中\level=0
,为章节、\level=1
为节、为小节等。您可以复制来自\level=2
的定义并添加新行:\tocline
opmac.tex
\def\tocline#1#2#3#4#5{%
\ifnum#1=0 \vskip20pt \relax \fi % <<< this line is new, adds the desired \vskip
{\leftskip=#1\iindent \rightskip=2\iindent
\ifischap\advance\leftskip by\iindent\fi
\ifnum#1>1 \advance\leftskip by\iindent\fi
\toclinehook \noindent\llap{#2\toclink{#3}\enspace}%
{#2#4\unskip}\nobreak\tocdotfill\pglink{#5}\nobreak\hskip-2\iindent\null\par}}
我不太喜欢把东西放进去{{ }}
此双括号用于宏上下文中\wref
:
\wref\Xcommand{{first}{second}{third}}
\Xcommand
当具有多个参数时,这更有意义。