![Tex 编程中的宏](https://linux22.com/image/303269/Tex%20%E7%BC%96%E7%A8%8B%E4%B8%AD%E7%9A%84%E5%AE%8F.png)
我很困惑下面的宏是否用于部分或什么?如果是,有人能帮我解释一下这段代码吗
\def\Section #1 \par
{
\bigbreak\vskip\parskip
\need 1.5 in
\global\advance\secno by 1
\subno=0\subsubno=0
\noindent
{\SectionTitleFont \the\secno.\hskip 1em #1}
\par
}
答案1
该宏\Section
有一个由空格和\par
标记分隔的参数,因此应该这样调用
\Section Whatever title I want
The text of the section following the title.
请注意章节标题结束后的空白行。
该宏将存储Whatever title I want
(当然是实际标题)并丢弃行尾产生的空格#1
。
现在宏执行
\bigbreak
,\par
然后检查最后一个垂直空格;如果该空格小于\bigskipamount
,TeX 将其删除并在其位置插入值为 -200 的惩罚和\bigskip
,这是一个很好的分页点;\need 1.5in
这在 Plain TeX 中没有定义,但似乎旨在研究和的当前值\pagegoal
;\pagetotal
如果前者和后者之间的差异小于 1.5 英寸,则\vfill\eject
可能发出命令;可能的定义\def\need{\afterassignment\checkneed\dimen0 } \def\checkneed{\advance\dimen0 by \pagetotal \ifdim\dimen0>\pagegoal \vfill\eject\fi}
或者只是
\eject
如果页面需要填满。计数器
\secno
增加 1;这应该包含节号;应该包含小节和子小节号的计数器\subno
和被设置为 0。\subsubno
\noindent
开始一个段落;使用(要定义的字体选择命令)设置标题\SectionTitleFont
,前面是章节编号和四倍空格;分组确保字体设置不会传播。\par
创建一个新段落。
请注意,1.5 英寸应该可以确保章节标题、行间跳跃和后续段落的至少两行适合。
正如 wipet 在评论中正确指出的那样,这个宏存在一些缺陷。
如果标题是
Good programming in \TeX
,则会出现一个难以理解的错误Runaway argument? Good programming in \TeX ! Paragraph ended before \Section was complete. <to be read again> \par
没有必要使用它作为分隔符,因为只要我们删除替换文本中的空格,尾随空格就会被替换文本中的
<space>\par
最后删除。\par
类似这样的标题可能会出现更难以理解的错误
Plusvalence
:! Missing number, treated as zero. <to be read again> v <argument> Plusv alence
因为 TeX 会将其视为
\hskip 1em Plusvalence
并解释Plus
为关键字。
固定代码:
\def\Section #1\par
{%
\bigbreak\vskip\parskip
\need 1.5 in
\global\advance\secno by 1
\subno=0\subsubno=0
\noindent
{\SectionTitleFont \the\secno.\hskip 1em\relax #1}\par
}