母语:

母语:

我正在修改\@ssect命令以编辑\section*外观。首先,我将另一个参数传递给\@ssect

\def\@ssect#1#2#3#4#5#6{%...

然后我修改了 中的依赖项,\@startsection修改为\@ssect{#3}{#4}{#5}{#6}\@ssect{#3}{#4}{#5}{#6}{#2}因为我想传递到\@ssect分段级别,这样我就可以有条件地使用它来设置不同的样式。当我尝试将类似

\ifnum#5<2
    %...
\else
    %...
\fi

使用条件表达式,该表达式使用现在由#5(in \@ssect#1#2#3#4#5#6) 给出的级别值,通过打印它可以轻松看到。我尝试了不同的if条件,例如\ifdim,我总是在第一次出现相同的错误 \section*

Package hyperref Warning: old toc file detected, not used; run LaTeX again.

./MYFILE.tex:12: Missing number, treated as zero.
<to be read again> 
                   \protect 
l.12    \section*{NAME}

?

例如,如果我使用#1已经是长度的参数(实际上是\z@),\ifdim命令不会报错。然后我尝试使用向参数添加度量单位\ifdim #5 pt < 2pt,但出现了相同的错误。这是怎么回事?

母语:

\documentclass{article}

\makeatletter
    \def\doublerfill{\hrule width \hsize \kern .5mm \hrule width \hsize height 1.3pt }
    \def\@seccntformat#1{\csname the#1\endcsname\quad}
    \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}{#2}}%
            {\@dblarg{\@sect{#1}{#2}{#3}{#4}{#5}{#6}}}}
    \def\@ssect#1#2#3#4#5#6{%
        \@tempskipa #3\relax
        \ifdim \@tempskipa>\z@
            \begingroup
                #4{%
                    \@hangfrom{\hskip #1}%
                        \interlinepenalty \@M #6\@@par}%
            \endgroup
            \ifnum#5<2
                foo1
            \else
                foo2
            \fi
        \else
            \def\@svsechd{#4{\hskip #1\relax #6}}%
        \fi
        \@xsect{#3}}
\makeatother
%
    \usepackage{hyperref}
%
\begin{document}
    \tableofcontents
    \section*{Foo}
\end{document}

答案1

hyperref需要修补部分命令以添加链接锚点,它重新定义\@sect为再次具有 5 个参数,这意味着基本上代码在这种情况下不会做任何合理的事情。它可能避免在没有添加 ifnum 的情况下给出错误,但它不能按预期工作。

如果你想这样做,你需要在 hyperref 版本中进行相应的更改

\let\H@old@ssect\@ssect
\def\@ssect#1#2#3#4#5{%
  \Hy@MakeCurrentHrefAuto{section*}%
  \setlength{\Hy@SectionHShift}{#1}%
  \begingroup
    \toks@{\H@old@ssect{#1}{#2}{#3}{#4}}%
    \toks\tw@\expandafter{%
      \expandafter\Hy@SectionAnchorHref\expandafter{\@currentHref}%
      #5%
    }%
  \edef\x{\endgroup
    \the\toks@{\the\toks\tw@}%
  }\x
}

相关内容