ハイパーリファレンス付きの太字のサブセクション番号

ハイパーリファレンス付きの太字のサブセクション番号

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クラスには、引数\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: タイトルが空のサブセクションが 1 つある場合、後続のセクション番号はすべて太字で設定されます。

このバグを修正するには、さらにいくつかのパッチが必要です。

\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}

空の見出しを指定すると、残念ながら見出しテキストに指定されたフォントが数字に適用されますが、この誤った機能は修正できるため、これに頼るべきではありません。


空の見出しは、その見出しに太字の数字が付くだけでなく、その時点以降のすべてのレベルの見出しにも影響します。

\documentclass{amsart}
%\usepackage{hyperref}

\begin{document}
\section{Test}

\subsection{x} Text

\subsection{} Text

\subsection{} Text


\subsection{x} Text

\section{test2}

\end{document}

これにより

ここに画像の説明を入力してください


これにより、空の見出しによって後続のすべての見出しのフォントが変更されるバグが修正され、ハイパーリファレンスで適切なフォントが取得されますが、ハイパーリファレンスの場合は余分な水平スペースが残ります。

\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}

ここに画像の説明を入力してください

関連情報