在 LaTeX 中更新 `\tableofcontents`

在 LaTeX 中更新 `\tableofcontents`

答案,我稍微调整了一下,重新定义\section如下:

\let\oldsection\section
\renewcommand{\section}[1]%
{
\begin{tcolorbox}
             [
              colback=gray!50!white,% background
              colframe=gray!50!white,% frame colour
              coltext=black, % text color
              width=\linewidth,%
              height=0.7cm,
              halign=left,
              valign=center,
              fontupper=\large\bfseries,
              arc=0mm, auto outer arc,
             ]
    {\stepcounter{section}\arabic{section}$\,|\quad$ #1}
\end{tcolorbox}
}

然而,当我使用时\tableofcontents,它并没有按预期工作(article顺便说一下,我正在使用一个类。)

然后,通过扫描article.cls,的定义\tableofcontents如下:

\newcommand\tableofcontents{%
    \section*{\contentsname
        \@mkboth{%
           \MakeUppercase\contentsname}{\MakeUppercase\contentsname}}%
    \@starttoc{toc}%
    }

我尝试\section用替换\oldsection,但不起作用。有人能帮忙吗?


編輯:MWE

\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{sample}

\RequirePackage{letltxmacro, tcolorbox}
\LetLtxMacro{\oldsection}{\section}
\renewcommand{\section}[1]%
{
\begin{tcolorbox}
             [
              colback=gray!50!white,% background
              colframe=gray!50!white,% frame colour
              coltext=black, % text color
              width=\linewidth,%
              height=0.7cm,
              halign=left,
              valign=center,
              fontupper=\large\bfseries,
              arc=0mm, auto outer arc,
             ]
    {\stepcounter{section}\arabic{section}$\,|\quad$ #1}
\end{tcolorbox}
}

\renewcommand\tableofcontents{%
    \oldsection*{\contentsname
        \@mkboth{%
           \MakeUppercase\contentsname}{\MakeUppercase\contentsname}}%
    \@starttoc{toc}%
    }
\endinput
\documentclass[letterpaper, 10pt]{article}
\usepackage{sample}

\begin{document}
     \tableofcontents
     
     \section{I}
          \subsection{1}
          \subsection{2}
     \section{II}
          \subsection{1}
          \subsection{2}
\end{document}

编辑:用来\LetLtxMacro代替\let

答案1

这里的挑战是,它\section实际上不采用单一参数。相反,它可以采用三种形式:

\section{...}
\section[...]{...}
\section*{...}

您只考虑了其中之一,并且正如您所发现的,\tableofcontents使用了最后一种形式。

实现您想要的方法之一是使用xparse包来重新定义\section

\RequirePackage{xparse}

\RenewDocumentCommand{\section}{s o m}{%
   \IfBooleanTF {#1}
     {\@ssect{\z@}{-3.5ex \@plus -1ex \@minus -.2ex}{2.3ex \@plus.2ex}{\normalfont\Large\bfseries}{#3}}
     {%
   \IfNoValueTF{#2}
     {\@mysection{#3}{#3}}
     {\@mysection{#2}{#3}}
}

\NewDocumentCommand{\@mysection}{m m }{
      \begin{tcolorbox}
             [
              colback=gray!50!white,% background
              colframe=gray!50!white,% frame colour
              coltext=black, % text color
              width=\linewidth,%
              height=0.7cm,
              halign=left,
              valign=center,
              fontupper=\large\bfseries,
              arc=0mm, auto outer arc,
             ]
    {\refstepcounter{section}\thesection $\,|\quad$ #2}
  \end{tcolorbox}
  \sectionmark{#1}
  \addcontentsline{toc}{section}{%
    \ifnum 1>\c@secnumdepth\else
      \protect\numberline{\thesection}%
    \fi
    #1}
  }

关于上述内容,有几点说明:

  1. 这一切都没有经过测试。这是我在教授创建 LaTeX 风格的课程时养成的老习惯,我完全凭着想象在白板上手写所有内容。

  2. 我使用了内部\@ssect命令,该命令带有从文章类传递给它的参数,用于加星号的版本,\section因此您不需要更改\tableofcontents

  3. 我将\stepcounter其改为\refstepcounter,因此对章节编号的引用仍然有效。

  4. 我改为\arabic{section}。除非有令人信服的理由不这么做,否则\thesection您应该始终选择\theCOUNTER\arabic{COUNTER}

  5. 我添加了对页眉和目录的支持。您可能不使用前者,但您肯定会使用后者。代码改编自 LaTeX 核心。

相关内容