从这答案,我稍微调整了一下,重新定义\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}
}
关于上述内容,有几点说明:
这一切都没有经过测试。这是我在教授创建 LaTeX 风格的课程时养成的老习惯,我完全凭着想象在白板上手写所有内容。
我使用了内部
\@ssect
命令,该命令带有从文章类传递给它的参数,用于加星号的版本,\section
因此您不需要更改\tableofcontents
。我将
\stepcounter
其改为\refstepcounter
,因此对章节编号的引用仍然有效。我改为
\arabic{section}
。除非有令人信服的理由不这么做,否则\thesection
您应该始终选择\theCOUNTER
。\arabic{COUNTER}
我添加了对页眉和目录的支持。您可能不使用前者,但您肯定会使用后者。代码改编自 LaTeX 核心。