我习惯重新定义 section 命令(如果重要的话,在 beamer 文档中),如下所示:
\let\oldsection\section
\renewcommand{\section}[1]{
\oldsection{#1}
% some code that generates a pretty frame with title section and all
}
这样做时,呼叫\oldsection
处理不可见的东西,而我只集中精力于我想要给我的框架带来的良好外观。
最近我想为我的目录使用短标题选项,因此我决定调整该代码:
\let\oldsection\section
\renewcommand{\section}[2][]{
\oldsection[#1]{#2}
% some code that generates a pretty frame with title section and all
}
令人惊讶的是(对我来说),它不起作用。目录仍然使用完整标题。这里发生了什么?我该如何调整代码以实现我想要的行为?
答案1
我不会弄乱 beamer 中的部分定义,只需使用内置机制即可自动插入部分页面。如果您不喜欢部分页面的默认布局,可以使用以下命令进行修改\setbeamertemplate{section page}{some code that generates a pretty frame with title section and all}
\documentclass{beamer}
\AtBeginSection[]{
\begin{frame}[plain]
\usebeamertemplate{section page}
\end{frame}
}
\begin{document}
\section{section name}
\begin{frame}
content...
\end{frame}
\end{document}
答案2
免责声明:尽可能使用特定于类的内容(因此beamer
在本例中由 @samcarter 提供的代码)。以下答案只是关于如何进行此类重新定义以保留宏的所有可能性的快速说明\section
。
对于通常采用可选参数的宏,您应该使用包\LetLtxMacro
中的选项。对于宏,这似乎没有必要(至少对于类而言),因为它没有使用类似 之类的东西进行定义。letltxmacro
\section
article
\newcommand
不过,您仍必须确保测试可选星号和可选参数。可选参数不应按原样传递,因为使用默认空参数,您只会在 ToC 中获得空条目。以下使用宏对星号进行测试。\@ifstar
它还使用&
可选参数的默认内容来测试它是否被使用过。可以使用 以不同的方式执行此操作\@ifnextchar[
,但这里的方法更容易编码。
\documentclass[]{article}
\let\oldsection\section
\makeatletter
\renewcommand\section
{%
\@ifstar
{\sectionauxB}
{\sectionauxA}%
}
\newcommand\sectionauxA[2][&]
{%
\ifx%
\oldsection{#2}%
\else
\oldsection[#1]{#2}%
\fi
}
\newcommand\sectionauxB[1]
{%
\oldsection*{#1}%
}
\makeatother
\begin{document}
\tableofcontents
\section{Test}
\section[Tes]{Test}
\end{document}
或者使用\@ifnextchar
:
\documentclass[]{article}
\let\oldsection\section
\makeatletter
\renewcommand\section
{%
\@ifstar
{\sectionauxD}
{\sectionauxA}%
}
\newcommand\sectionauxA
{%
\@ifnextchar[
{\sectionauxB}
{\sectionauxC}%
}
\@ifdefinable\sectionauxB
{%
\long\def\sectionauxB[#1]#2{\oldsection[#1]{#2}}%
}
\newcommand\sectionauxC[1]
{%
\oldsection{#1}%
}
\newcommand\sectionauxD[1]
{%
\oldsection*{#1}%
}
\makeatother
\begin{document}
\tableofcontents
\section{Test}
\section[Tes]{Test}
\end{document}