本文已加入专栏文章目录,归入「进阶使用」文章系列。

本文介绍了为 beamer 文档类的目录条目添加页码的方法,该方法可用于一般情况下的 beamer 目录条目内容(不包含样式的定制)修改需求。


beamer 的目录,默认不显示各条目的页码。

下面我们尝试把页码加上。

先搜一搜

  • Beamer: tableofcontents with page numbers
  • Latex beamer: slide numbers for subsubsections

第二个链接里的改法很简单,试一试。

makeatletter
defbeamer@endinputifotherversion#1{}
defbeamer@sectionintoc#1#2#3#4#5{{huge #2 hfill page #3 par}}
defbeamer@subsectionintoc#1#2#3#4#5#6{{normalsize #3 hfill page #4 par}}
defbeamer@subsubsectionintoc#1#2#3#4#5#6#7{{tiny #4 hfill page #5 par}}
makeatother

有效果,但是很粗糙。根据第二个链接里的说法,信息在 toc 文件里都有。我们来看看 toc 文件,顺便再看一看命令 beamer@sectionintoc 的定义。

$ cat beamer-test.toc     #为了让下方内容正确高亮,此处加一个 $ 符号,下同
beamer@sectionintoc {1}{what}{2}{0}{1}
beamer@subsectionintoc {1}{1}{why}{3}{0}{1}
beamer@subsubsectionintoc {1}{1}{1}{blah}{4}{0}{1}
beamer@sectionintoc {2}{what2}{5}{0}{2}

$ latexdef -c beamer -s beamer@sectionintoc   #$
% beamerbasetoc.sty, line 108:
defbeamer@sectionintoc#1#2#3#4#5{%ifnumc@tocdepth>0%ifnum#4=beamer@showpartnumber%{beamer@saveanother%gdefbeamer@todo{}%beamer@slideinframe=#1relax%expandafteronlybeamer@tocsections{gdefbeamer@todo{%beamer@tempcount=#5relax%advancebeamer@tempcount bybeamer@sectionadjust%ifnumbeamer@tempcount>0edefinserttocsectionnumber{thebeamer@tempcount}%elsedefinserttocsectionnumber{}%fi%definserttocsection{hyperlink{Navigation#3}{#2}}%beamer@tocifnothide{ifnumc@section=#1beamer@toc@cselsebeamer@toc@osfi}%{%ifbeamer@pausesectionspausefi%ifxbeamer@toc@oossbeamer@hidetextvskip1.5emelsevfillfi{%hbox{vbox{%defbeamer@breakhere{}%beamer@tocact{ifnumc@section=#1beamer@toc@cselsebeamer@toc@osfi}{section in toc}}}%par%}%}%}%}%beamer@restoreanother%}beamer@todo%fifi%
}

仔细观察,发现关键在 beamer@sectionintoc 定义的

definserttocsection{hyperlink{Navigation#3}{#2}}%

这一行。原始定义很长,我们用 xpatch 的功能来完成重定义

% usepackage{xpatch}makeatletter
xpatchcmd{beamer@sectionintoc}{hyperlink{Navigation#3}{#2}}{hyperlink{Navigation#3}{#2hfill#3}}{}{ddt}xpatchcmd{beamer@subsectionintoc}{hyperlink{Navigation#4}{#3}}{hyperlink{Navigation#4}{#3hfill#4}}{}{ddt}xpatchcmd{beamer@subsubsectionintoc}{hyperlink{Navigation#5}{#4}}{hyperlink{Navigation#5}{#4hfill#5}}{}{ddt}
makeatother

看看效果,事情就这么成了。

再回过去看第一个链接里的,修改 beamer@section 定义的做法,发现它的关键在这一处修改

longdefbeamer@section[#1]#2{%
... ...
% before
% addtocontents{toc}{protectbeamer@sectionintoc{thec@section}{#2}{thec@page}{thec@part}%
% after
addtocontents{toc}{protectbeamer@sectionintoc{thec@section}{#2hfillthec@page}{thec@page}{thec@part}%
... ...
}

这样就能理解了,第一个链接里的做法是,使得往 toc 文件写入的是

beamer@sectionintoc {1}{whathfill2}{2}{0}{1}

这样,beamer@sectionintoc 接受的第二个参数,就直接包含了需要输出的所有内容(whathfill2)。从定制 beamer 样式的角度,这种改法更好。同样使用 xpatch,对应的修改是

makeatletter
xpatchcmd{beamer@section}{{#2}{thec@page}}{{#2hfillthec@page}{thec@page}}{}{ddt}xpatchcmd{beamer@subsection}{{#2}{thec@page}}{{#2hfillthec@page}{thec@page}}{}{ddt}xpatchcmd{beamer@subsubsection}{{#2}{thec@page}}{{#2hfillthec@page}{thec@page}}{}{ddt}
makeatother


最后附上用于生成本文配图的 LaTeX 源码

documentclass{beamer}
usepackage{xpatch}% 重定义
% ... ...begin{document}
begin{frame}tableofcontents
end{frame}section{what}
begin{frame} content end{frame}subsection{why}
begin{frame} content end{frame}subsubsection{blah}
begin{frame} content end{frame}section{what2}
begin{frame} content end{frame}
end{document}

idea在目录中前添加目录_[LaTeX Beamer] 为目录项添加页码相关推荐

  1. latex怎么给图片命名_[Latex] Beamer 入门

    Beamer 入门 使用 Texstudio 自带 的 beamer 模板完成第一项 beamer 任务,配合中文文字显示,使用Ctex宏集,documentclass[UTF8]{ctexbeame ...

  2. kvm上添加万兆网卡_烂泥:为KVM虚拟机添加网卡

    本文首发于烂泥行天下. 前几篇文章介绍了有关KVM安装虚拟机以及如何给虚拟机添加硬盘,今天我们再来介绍下有关如何给KVM虚拟机添加网卡. 给KVM虚拟机添加网卡,可以分为两种形式:图形界面的和virs ...

  3. c++ 添加按钮_使用 Visual Studio 2019 批量添加代码文件头

    应用场景介绍 在我们使用一些开源项目时,基本上都会在每个源代码文件的头部看到一段版权声明.一个项目或解决方案中源代码文件的个数少则几十,多则几千甚至更多,那么怎么才能给这么多文件方便地批量添加或者修改 ...

  4. 苹果手机怎么在照片上添加文字_给微信拍照的照片添加文字,调整后期效果,手机两步搞定!...

    给微信拍照的照片添加上文字,并调整后期效果非常的简单哦!添加文字一键搞定,添加滤镜.纹理以及调整图片的各种参数,也都是一键搞定哦,非常的方便的! 除了直接添加上后期效果和文字,还能够使用一些模版,增加 ...

  5. android添加工程依赖工程,将项目依赖项添加到Android studio中的另一个项目

    我有一个现有的项目说A,它依赖于几个项目.现在我想将这个项目A作为Project B的库项目.到目前为止,我所做的是在Project A的build.gradle中,我已将插件从"andro ...

  6. python导入同目录下的模块_如何从同一目录下的模块导入?

    我试图制作一个Python3.6包,但是在从包中导入时遇到了ModuleNotFound错误.包具有以下结构:project/ project/ cache/ default.py interface ...

  7. elementui表格添加滚动条_如何给PDF文档添加超链接?

    有时我们在编辑PDF文档时,需要给目录做快速跳转或给文中的某些内容跳转到其他网页,这就需要用到超链接的功能.下面就一起看看给PDF文档添加超链接的是如何操作的. https://www.zhihu.c ...

  8. java窗体中添加图片_在java窗体程序中添加图片的方法

    在java窗体程序中添加图片的方法 发布时间:2020-06-16 11:24:13 来源:亿速云 阅读:148 作者:Leah 这篇文章主要为大家详细介绍了在java窗体程序中添加图片的方法,图文详 ...

  9. 添加日志_第五章springboot2.0添加aop日志实现记录请求地址

    1. 添加spring-boot-starter-aop包 <dependency> <groupId>org.springframework.bootgroupId> ...

最新文章

  1. UVA11624 Fire!
  2. Myeclipse中weblogic配置
  3. navacat无法打开excel解决
  4. 2019年9月数据库流行度排行:MySQL 强劲增长完成深 V 反转
  5. python动力学仿真_python滑坡动力学
  6. 前言:设计模式六大原则
  7. 如何快速去除PDF的密码和限制:遇到PDF被加密,不能复制、编辑,怎么办?教大家一个又快又好用的方法、实用。
  8. n1进入recovery模式_OPPO N1如何进入recovery模式
  9. 2837xd 代码生成——补充(3)
  10. 利用VS2019对程序进行时间性能分析
  11. 2020.7.24 T3终章-剑之魂(jz暑假训练day9)
  12. Zeev Suraski、Andi Gutmans、Rasmus Lerdorf
  13. Node.js中的异步编程,个人理解及分化讲解
  14. 服务价值 100 万亿美元的行业,是时候收购市场领导者英伟达了
  15. 飞蛾群优化算法 (MSA)(Matlab代码实现)
  16. 机器学习中对数据集进行拆分及模型训练
  17. 阿里Java岗P5-P7成长笔记【3283页PDF文档免费领】
  18. DriverStudio 3.x 完全版 下载
  19. 服务器定时任务是通过什么样的方式实现的
  20. 致读者的一封信——付费专栏《数据科学技术与应用_中国大学MOOC_持续更新》用户调查【2021/1/22】

热门文章

  1. es根据字段长度过滤_Es 根据数组长度查询
  2. 如何查询一个表中除某几个字段外其他所有的字段_一个小故事告诉你:如何写好数据分析报告?...
  3. python3:module
  4. 编写一个简单的assert宏
  5. [转]全面了解setjmp与longjmp的使用
  6. javascript中的try finally
  7. OpenGL从入门到精通--你好三角形
  8. SpringBoot 页面跳转后css和js效果都无效了
  9. java-web hibernate中的懒加载问题
  10. 为eclipse在线安装svn