我遇到了一个恼人的小问题。我用它fancyhdr
来自定义论文的标题,但根据软件包文档,它无法删除参考书目、索引等章节标题的“大写”,因为\MakeUppercase
这些软件包明确给出了独立说明。它建议重新定义\thebibliography
和搜索natbib.sty
我发现
\providecommand{\MakeUppercase}{\uppercase}
然后在\bibsection
重新定义中使用它。
我尝试了一段时间,试图\bibsection
在我的序言中重新定义,但最终只会弄乱参考书目的标题。
此外,这不仅仅与参考书目有关:其他未编号的章节(实际上是所有章节)都受到此问题的影响。
对于手头的问题,我想出了一个有点儿解决方案是重新定义 \MakeUppercase:
\renewcommand{\MakeUppercase}{}
这解决了我的即时问题。但我对此不太满意,因为我可能需要在本文档或任何其他文档中使用大写字母。由于我总是在标题中使用小写字母,所以这可能是一个问题。
有什么更好的解决方案吗?我是否需要实际重新定义与各个方面、参考书目、索引、目录等相关的命令?
答案1
该命令\MakeUppercase
是 LaTeX 的标准命令,在内核中定义,因此这里\providecommand
永远不会执行,因为命令已经存在。我不记得我们是否\MakeUppercase
在 1994 年首次发布 LaTeX2e 后添加了它;很有可能,如果是这样,这也许可以解释为什么曾经这样\providecommand
做是有意义的。
作为一个通用命令,禁用它并不是正确的选择(紧急情况除外),因为它意味着任何每个地方的大写字母都被禁用,这可能不仅会导致在运行标题中删除它的期望效果,而且还会导致在仍然需要大写字母的地方也出现这种情况。
因此,正如 Ulrike 所说,更好的解决方案是使用不执行大写操作或支持自定义的类。LaTeX\MakeUppercase
附带的类中硬性使用是不幸的,但出于兼容性原因,我们很久以前就决定(请参阅 ltnewsXX.pdf,不记得编号了),这些类不会因为设计有问题或缺少功能而更改。相反,应该提供更好、更灵活的类作为替代方案。这样的类是存在的,例如 KomaScript 类scrreprt.cls
和许多其他类。
如果您打算禁用,\Makeuppercase
那么您应该做些稍微不同的事:
\renewcommand\Makeuppercase[1]{#1}
使用参数的原因是,如果没有它,通常围绕其参数的参数括号将继续存在,并导致形成一个界定范围的组,并且可能(不太可能但可能)产生副作用。
答案2
在此答案中,我将给出重新定义命令(如\thebibliography
或)的步骤\tableofcontents
,以删除大写标题。如果您不想更改课程,我相信这是最好的解决方案。
这些命令是为每个类定义的。例如,在book.cls
基础包的文件中,命令的定义\tableofcontents
如下
\newcommand\tableofcontents{%
\if@twocolumn
\@restonecoltrue\onecolumn
\else
\@restonecolfalse
\fi
\chapter*{\contentsname
\@mkboth{%
\MakeUppercase\contentsname}{\MakeUppercase\contentsname}}%
\@starttoc{toc}%
\if@restonecol\twocolumn\fi
}
如果我想在标准书籍类的目录中使用小写标题,我只需要在书籍的序言中重新定义此命令,从\MakeUppercase
标记中删除:
\makeatletter
\renewcommand\tableofcontents{%
\if@twocolumn
\@restonecoltrue\onecolumn
\else
\@restonecolfalse
\fi
\chapter*{\contentsname
\@mkboth{%
\contentsname}{\contentsname}}%
\@starttoc{toc}%
\if@restonecol\twocolumn\fi
}
\makeatother
就是这样。我使用了目录,因为代码更短,但这也适用于其他类别和类似的未编号章节/部分,如参考书目、表格列表或图片列表。为了避免使序言杂乱,您可以将所有新定义放在.sty
.