Tex 编程中的宏

Tex 编程中的宏

我很困惑下面的宏是否用于部分或什么?如果是,有人能帮我解释一下这段代码吗

 \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

现在宏执行

  1. \bigbreak\par然后检查最后一个垂直空格;如果该空格小于\bigskipamount,TeX 将其删除并在其位置插入值为 -200 的惩罚和\bigskip,这是一个很好的分页点;

  2. \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如果页面需要填满。

  3. 计数器\secno增加 1;这应该包含节号;应该包含小节和子小节号的计数器\subno和被设置为 0。\subsubno

  4. \noindent开始一个段落;使用(要定义的字体选择命令)设置标题\SectionTitleFont,前面是章节编号和四倍空格;分组确保字体设置不会传播。

  5. \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
  }

相关内容