更新:\@startsection 有什么问题吗?

更新:\@startsection 有什么问题吗?

当前SIGCHI 模板确实包含一些防止孤行的说明(\clubpenalty\widowpenalty),但出于某种原因,这对我不起作用。我尝试增加惩罚,但这也没有阻止孤行。不加载包microtype可以解决我拥有的一个文档的问题,但不能解决其他文档的问题。我整理了一个简短的示例文件,它为我生成了一个孤行(“第 1 节”部分标题在第一页,其余部分在第二页):

    \documentclass{sigchi}

    \special{papersize=8.5in,11in}
    \setlength{\paperheight}{11in}
    \setlength{\paperwidth}{8.5in}
    \setlength{\pdfpageheight}{\paperheight}
    \setlength{\pdfpagewidth}{\paperwidth}

    \usepackage[english]{babel}
    \usepackage{times}
    \usepackage{lipsum}

    \begin{document}

    \title{The Title}
    \author{Anonymous}
    \maketitle

    \begin{abstract}
    \lipsum[1]
    \end{abstract}

    \section{Section 0}
    \lipsum[2-8]

    \section{Section 1}
    \lipsum[8-12]

    \end{document}

有人对该模板有经验吗?需要做哪些更改才能使其正常工作?

更新:\@startsection 有什么问题吗?

我四处搜寻了一下西格奇级提供了自己的版本\@startsection。删除它会将示例文档中孤立的部分名称推到下一页。但是,由于这可能是一个相当剧烈的变化,我很好奇这种行为的具体原因是什么。我不熟悉那里使用的大多数命令,但也许其他人可以帮忙。

LaTeX \@startsection:

    \def\@startsection#1#2#3#4#5#6{%
      \if@noskipsec \leavevmode \fi
      \par
      \@tempskipa #4\relax
      \@afterindenttrue
      \ifdim \@tempskipa <\z@
        \@tempskipa -\@tempskipa \@afterindentfalse
      \fi
      \if@nobreak
        \everypar{}%
      \else
        \addpenalty\@secpenalty\addvspace\@tempskipa
      \fi
      \@ifstar
        {\@ssect{#3}{#4}{#5}{#6}}%
        {\@dblarg{\@sect{#1}{#2}{#3}{#4}{#5}{#6}}}}

标记 \@startsection:

    \let\@period=.
    \def\@startsection#1#2#3#4#5#6{%
            \if@noskipsec  %gkmt, 11 aug 99
            \global\let\@period\@empty
            \leavevmode
            \global\let\@period.%
        \fi
        \par
        \@tempskipa #4\relax
        \@afterindenttrue
        \ifdim \@tempskipa <\z@
            \@tempskipa -\@tempskipa
            \@afterindentfalse
        \fi
        %\if@nobreak  11 Jan 00 gkmt
            %\everypar{}
        %\else
            \addpenalty\@secpenalty
            \addvspace\@tempskipa
        %\fi
        \parskip=0pt
        \@ifstar
            {\@ssect{#3}{#4}{#5}{#6}}
            {\@dblarg{\@sect{#1}{#2}{#3}{#4}{#5}{#6}}}%
    }

答案1

这个类文件可以追溯到 20 多年前,是为 LaTeX 2.09 编写的,后来进行了一些修补,以便在今天的 LaTeX 下运行。这是一个很好的例子

  • 现在什么事都不该做 :-)
  • LaTeX 仍然能够以某种方式处理非常旧的代码

如果有机会说服会议组织者让某人从头开始为他们重写该课程,我想这将是一件好事,因为里面有很多东西不应该按照现在的方式完成。

您的特定问题的原因确实在于\@startsection代码的重新定义,但不在于您上面展示的部分(尽管那部分也可能有问题),而在于\@ssect和的重新定义\@sect。在那里,您每次都会发现这一行

\vskip -6pt  % [jdf] less space between section as in the Word template

但是胶水默认会引入断点,所以一个立即的解决办法是在这些断点之前

\par\nobreak
\vskip -6pt  % [jdf] less space between section as in the Word template

但这确实应该以不同的方式进行清理。整个间距设置\parskip\baselineskip代码中的设置肯定不是应该做的,有更好的方法可以实现预期结果。即使这样做,也需要以不同的方式完成,如以下输入所示:

\section{Section 1} Plus something ...

这给你

! Missing number, treated as zero.
<to be read again> 
                   s
l.29     \section{Section 1} Plus s
                                   omething ...
? s

假设一个部分文本不太可能以字符开头Plus,或者Minus不能保证它不会以字符开头。原因是要\parskip完成的任务如下:

\@xsect{#3}\parskip=6pt} % [jdf] paragraph skip shorter

在宏重新定义的末尾。这里的问题是 TeX 将继续为 寻找额外的复数或减号组件\parskip。换句话说,\relax缺少 a(至少)。

相关内容