有一些包允许我们很好地引用章节/图表/等,而不必真正指定我们引用的内容,例如hyperref
's\autoref
或cleverref
's \cref
。这对于章节来说特别好,因为它可以避免我们在更改文档层次结构时出错。
我的问题是为什么没有一个包能正确地识别名称是否应该以大写字母开头。例如,以下第一个引用应该使用小写字母,而第二个引用应该使用大写字母:
\documentclass{article}
\begin{document}
\section{Foo}
\label{foo}
Correctly lowercased reference \magicref{foo}. % section 1.
\magicref{foo} should start with an upper case letter. % Section 1
\end{document}
Hyperref 总是使用小写,而 cleverref 允许作者指定正确的大小写。但是,如果不使用一些启发式方法来正确识别应该使用哪种大小写,会有什么问题呢?
它看起来非常有用,所以我猜一定是存在一些技术问题,使得它比看起来更难。或者它存在,只是我还没找到?
答案1
首先,就像现在有异常值一样,自动化使用时也可能存在异常值。此外,这将取决于引用方案的实现。例如,以下*适用于hyperref
的\autoref
:
\documentclass{article}
\usepackage{hyperref}
\renewcommand{\sectionautorefname}{\ifnum\spacefactor>1000 Section\else section\fi}
\begin{document}
\section{Foo}
\label{foo}
Correctly lowercased reference \autoref{foo}. % section 1.
\autoref{foo} should start with an upper case letter. % Section 1
\end{document}
在上面的例子中,我们检查是否\spacefactor
大于 1000 - 通常与句末标点符号相关,如TeX 按主题分类(部分20.5. 更多关于空间因素,第 188 页):
在纯文本格式中,定义了两个宏,用于在统一的单词间距和标点符号后的额外空格之间切换。宏
\frenchspacing
将所有标点符号的间距因子代码设置为 1000;宏\nonfrenchspacing
将其设置为大于 1000 的值。以下是实际的定义
plain.tex
:\def\frenchspacing{\sfcode‘\.\@m \sfcode‘\?\@m \sfcode‘\!\@m \sfcode‘\:\@m \sfcode‘\;\@m \sfcode‘\,\@m} \def\nonfrenchspacing{\sfcode‘\.3000 \sfcode‘\?3000 \sfcode‘\!3000 \sfcode‘\:2000 \sfcode‘\;1500 \sfcode‘\,1250 }
在哪里
\mathchardef\@m=1000
以纯文本格式给出。
然而,在使用时,这并不像使用cleveref
(例如)。如上所述,这可能是由于实施所致。
也许一般的原因是:如果有人\spacefactor
在文档中为 定义了不同的值会怎么样?参考包作者不可能知道这一点。而且,即使他们知道,也必须以某种方式纳入其中,还允许用户覆盖这种自动调整,因为每个人都是不同的,需要不同的用例。当手动覆盖已经以和 之类的形式存在时,考虑这些似乎太多\cref
了\Cref
。
为了应对这种自动化,我通常采用以下方法。您写一个以引用开头的句子,因此您使用引用的大写版本。如果由于文档中此处附近插入内容而突然更改,请在编辑时将其更改为其他格式……真的就是这么简单。