我正在修改一个较旧的大学模板,该模板要求在文本中将所有表格标题设置为大写,但在表格列表中不需要这样做。为了自动化该过程,我修补了模板的相应部分以\MakeTextUppercase
在标题宏中使用。这有效,直到选项final
传递给底层书籍类并hyperref
与 发生冲突\MakeTextUppercase
。这是一个 MWE:
\documentclass[final]{book}
\usepackage{hyperref}
\usepackage{textcase}
\makeatletter
\renewenvironment{table}{%
\let\@makecaption\@maketablecaption
\@float{table}}{\end@float}
\long\def\@maketablecaption#1#2{
\begin{center}
\makebox[\linewidth]{
\parbox{\linewidth}{
\centering
\MakeTextUppercase{#1}\\
\MakeTextUppercase{#2}%\par
}%
}%
\end{center}
}
\makeatother
\begin{document}
\listoftables
\chapter{One}
\begin{table}
\caption{A Caption}
\end{table}
\end{document}
\MakeTextuppercase
如果删除,则错误消息会消失:
! Undefined control sequence.
\@hyper@@anchor ...r@spot {#2#3}\let \put@me@back
\@empty \ifx \relax #2\rel...
l.30 \caption{A Caption}
我不希望表格列表有大写的表格标题,标题在运行文本中只能是大写的。 是否有一个简单的修改上述示例来实现这一点? 如何\MakeTextUppercase
仅应用于文本标题部分而不应用于表格列表中的标题部分? 我不想包含其他包,因为这都是更大模板的一部分……
答案1
的第二个参数\@makecaption
(或者在这种情况下\@maketablecaption
不仅仅是的参数的输入,\caption
而是很多不同的指令。\MakeTextUppercase
无法应对这个问题。
使用该caption
包执行此类任务更加容易(而且在我看来也是一个更清洁的解决方案)。
\documentclass[final]{book}
\usepackage{caption}
\usepackage{textcase}
\DeclareCaptionLabelFormat{uppercase}{\MakeTextUppercase{#1~#2}}
\DeclareCaptionTextFormat{uppercase}{\MakeTextUppercase{#1}}
\captionsetup{
labelsep = newline ,
justification = centering ,
labelformat = uppercase ,
textformat = uppercase
}
\usepackage{hyperref}
\begin{document}
\listoftables
\chapter{One}
\begin{table}
\caption{A Caption}
\end{table}
\end{document}
上述代码格式全部标题。如果你只想将其应用于表格,那么使用
\captionsetup[table]{
..
}