我正在修改\@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
}