Жирный шрифт номеров подразделов с гиперссылкой

Жирный шрифт номеров подразделов с гиперссылкой

Когда я использую класс документа amsart и оставляю заголовок подраздела пустым, то номер подраздела выделяется жирным шрифтом. Минимальный рабочий пример:

\documentclass{amsart}
\begin{document}
\section{Test}
\subsection{} Text
\end{document}

Странно, но когда я включаю пакет hyperref, номера подразделов больше не выделяются жирным шрифтом. MWE:

\documentclass{amsart}
\usepackage{hyperref}
\begin{document}
\section{Test}
\subsection{} Text
\end{document}

Есть ли способ сделать так, чтобы номера подразделов отображались жирным шрифтом при использовании hyperref? Я боюсь нарушить часть функциональности hyperref, если переопределю команду \subsection после загрузки hyperref.

решение1

Класс amsartдействительно имеет такую ​​особенность: если аргумент to \subsectionпуст, то число выводится жирным шрифтом, в то время как обычно это средний ряд.

Мне лично эта функция вообще не нравится. Однако, что происходит, так это то, что код, \@sectкоторый делает эту работу, (номера строк относятся к amsart.cls)

1055     \@ifempty{#8}{%
1056       \ifnum #2=\tw@ \def\@secnumfont{\bfseries}\fi}{}%

но когда hyperrefзагружен, #8аргумент

\Sectionformat{<title>}{2}

так что с этой точки зрения он не пуст \@ifempty.

Вот патч для этого.

\documentclass{amsart}

\usepackage{xpatch}
\usepackage{hyperref}

\makeatletter
% we need to patch the saved version of \@sect
\providecommand{\H@old@sect}{} % so this doesn't choke if hyperref is removed
\xpatchcmd{\H@old@sect}
  {\@ifnotempty{#8}}
  {\checkempty@title{#8}{}}
  {}{}
\xpatchcmd{\H@old@sect}
  {\@ifempty{#8}}
  {\checkempty@title{#8}}
  {}{}
\xpatchcmd{\H@old@sect}
  {\@ifempty{#8}}
  {\checkempty@title{#8}}
  {}{}
\def\checkempty@title#1{\checkempty@title@aux#1}
\def\checkempty@title@aux#1#2#3{\@ifempty{#2}}
\makeatother

\begin{document}
\section{Test}
\subsection{} Text
\end{document}

введите описание изображения здесь

На самом деле, тамявляетсяошибка amsart: если у вас есть один подраздел с пустым заголовком, все последующие номера разделов набираются жирным шрифтом.

Для исправления этой ошибки необходимо установить еще пару патчей:

\documentclass{amsart}

\usepackage{xpatch}
\usepackage{hyperref}

\makeatletter
% we need to patch the saved version of \@sect
\providecommand{\H@old@sect}{} % so this doesn't choke if hyperref is removed
\xpatchcmd{\H@old@sect}
  {\@ifnotempty{#8}}
  {\checkempty@title{#8}{}}
  {}{}
\xpatchcmd{\H@old@sect}
  {\@ifempty{#8}}
  {\checkempty@title{#8}}
  {}{}
\xpatchcmd{\H@old@sect}
  {\@ifempty{#8}}
  {\checkempty@title{#8}}
  {}{}
\xpatchcmd{\H@old@sect}
  {\def\@secnumfont}
  {\gdef\@secnumfont}
  {}{}
\def\checkempty@title#1{\checkempty@title@aux#1}
\def\checkempty@title@aux#1#2#3{\@ifempty{#2}}
% patch the bug of amsart
\xapptocmd{\@seccntformat}
  {\noexpand\reset@secnumfont}
  {}{}
\AtBeginDocument{%
  \edef\reset@secnumfont{%
    \gdef\noexpand\@secnumfont{\expandafter\noexpand\@secnumfont}%
  }%
}
\makeatother

\begin{document}

\section{Test}
\subsection{} Text

\section{Test}

\end{document}

введите описание изображения здесь

решение2

Можно указать номера разделов, выделенные жирным шрифтом:

\documentclass{amsart}
\usepackage{hyperref}
\makeatletter
\def\@secnumfont{\bfseries}
\makeatletter

\begin{document}
\section{Test}

\subsection{} Text
\end{document}

Если указать пустой заголовок, то, к сожалению, к числу будет применен шрифт, указанный для текста заголовка. Однако не стоит полагаться на эту ошибку, так как ее можно исправить.


заголовок enpty не просто делает один заголовок жирным, он влияет на все заголовки на всех уровнях с этого момента, рассмотрите

\documentclass{amsart}
%\usepackage{hyperref}

\begin{document}
\section{Test}

\subsection{x} Text

\subsection{} Text

\subsection{} Text


\subsection{x} Text

\section{test2}

\end{document}

что делает

введите описание изображения здесь


это исправляет ошибку с пустым заголовком, изменяющим шрифт всех последующих заголовков, и получает правильные шрифты в hyperref, в случае hyperref все еще остается дополнительное горизонтальное пространство

\documentclass{amsart}
\usepackage{hyperref}

\makeatletter
%\def\@secnumfont{\bfseries}

\def\@sect#1#2#3#4#5#6[#7]#8{%
  \edef\@toclevel{\ifnum#2=\@m 0\else\number#2\fi}%
  \ifnum #2>\c@secnumdepth \let\@secnumber\@empty
  \else \@xp\let\@xp\@secnumber\csname the#1\endcsname\fi
  \@tempskipa #5\relax
  \ifnum #2>\c@secnumdepth
    \let\@svsec\@empty
  \else
    \refstepcounter{#1}%
    \edef\@secnumpunct{%
      \ifdim\@tempskipa>\z@ % not a run-in section heading
        \@ifnotempty{#8}{.\@nx\enspace}%
      \else
        \@ifempty{#8}{.}{.\@nx\enspace}%
      \fi
    }%
%%%%
    \def\zz{#8}%
    \def\tmp{\Sectionformat{}{2}}%
    \ifx\zz\tmp\def\zz{}\fi
    \let\zzz\@secnumfont
%%%%
    \expandafter\@ifempty\expandafter{\zz}{%
      \ifnum #2=\tw@ \def\@secnumfont{\bfseries}\fi}{}%
    \protected@edef\@svsec{%
      \ifnum#2<\@m
        \@ifundefined{#1name}{}{%
          \ignorespaces\csname #1name\endcsname\space
        }%
      \fi
      \@seccntformat{#1}%
    }%
     \let\@secnumfont\zzz
  \fi
  \ifdim \@tempskipa>\z@ % then this is not a run-in section heading
    \begingroup #6\relax
    \@hangfrom{\hskip #3\relax\@svsec}{\interlinepenalty\@M #8\par}%
    \endgroup
    \ifnum#2>\@m \else \@tocwrite{#1}{#8}\fi
  \else
  \def\@svsechd{#6\hskip #3\@svsec
    \expandafter\@ifnotempty\expandafter{\zz}{\ignorespaces#8\unskip
       \@addpunct.}%
    \ifnum#2>\@m \else \@tocwrite{#1}{#8}\fi
  }%
  \fi
  \global\@nobreaktrue
  \@xsect{#5}%
}

\def\@seccntformat#1{%
  \protect\textup{\@secnumfont
    \csname the#1\endcsname
    \protect\@secnumpunct
  }%
}

\makeatletter


\begin{document}
\section{Test}

\subsection{x} Text

\subsection{} Text

\subsection{} Text


\subsection{x} Text

\section{test2}

\end{document}

введите описание изображения здесь

Связанный контент