
Когда я использую класс документа 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}