答案1
无需附加包的解决方案可以是一个新的\Section
命令,通过使用\section
大写文本的命令来改变两者。
\documentclass{article}
\newcommand{\Section}[2][]{%
\def\shortsec{#1}%
\ifx\shortsec\empty%
\section{\MakeUppercase{#2}}
\else%
\section[\MakeUppercase{#1}]{\MakeUppercase{#2}}
\fi}
\begin{document}
\tableofcontents
\Section[t]{title}
\end{document}
编辑:为了使其与hyperref
包一起工作,需要调整代码(\ifdefined
我修改了该行的行为,因此它可以与 hyperref 一起使用或不与 hyperref 一起使用):
\documentclass{article}
\usepackage{hyperref}
\ifdefined\texorpdfstring\else\newcommand{\texorpdfstring}[2]{#1}\fi
\newcommand{\Section}[2][]{%
\def\shortsec{#1}%
\ifx\shortsec\empty%
\section{\texorpdfstring{\MakeUppercase{#2}}{#2}}
\else%
\section[\texorpdfstring{\MakeUppercase{#1}}{#1}]{\texorpdfstring{\MakeUppercase{#2}}{#2}}
\fi}
\begin{document}
\tableofcontents
\Section{title}
\end{document}
可能使用 lua(la)tex 有一种更漂亮的方法,如果有人感兴趣的话我可以研究一下。
编辑2:要替换旧\section
命令,可以执行以下操作:
\documentclass{article}
\usepackage{hyperref}
\ifdefined\texorpdfstring\else\newcommand{\texorpdfstring}[2]{#1}\fi
\let\oldsection\section
\makeatletter
\renewcommand{\section}{\@ifstar{\@sSection}{\@Section}}
\newcommand{\@sSection}[2][]{%
\oldsection*{\texorpdfstring{\MakeUppercase{#2}}{#2}}}
\newcommand{\@Section}[2][]{%
\def\shortsec{#1}%
\ifx\shortsec\empty%
\oldsection{\texorpdfstring{\MakeUppercase{#2}}{#2}}
\else%
\oldsection[\texorpdfstring{\MakeUppercase{#1}}{#1}]{\texorpdfstring{\MakeUppercase{#2}}{#2}}
\fi}
\makeatother
\begin{document}
\tableofcontents
\section{title}
\end{document}
编辑3:如果你想保留旧的\section*
行为,例如保留旧的 toc 标题而不是大写版本,你可以替换
\renewcommand{\section}{\@ifstar{\@sSection}{\@Section}}
和
\renewcommand{\section}{\@ifstar{\oldsection*}{\@Section}}