一些可以生成内联文本的软件包(例如词汇表、cleverref) 有命令让作者选择大写。特别是,词汇表似乎能够自动完成部分操作。
但是,nameref
(该nameref
包的)无法更改引用文本的大小写。正如nameref
通常用于引用大写文本的章节标题一样,当大写字母保持在句子中间时,文本看起来会变得不正确。
虽然有一个答案这里解决了这个问题,它依赖于在每个需要调整大写字母的字母前面插入一个宏。
鉴于有修改大写的命令可用(
\MakeUppercase
,\MakeLowercase
,\makefirstuc
), 为什么提供nameref
返回全部小写或除首字母小写外所有字母均小写的名称的命令如此困难?是否有可能保护标题的各个部分不受大写字母变化的影响?(即
\MakeUppercase{so\MakeLowercase{WhAT}}
返回SOwhat
(详情请参阅 Texbook 第 42 页))
IE:
\section{This is about \MakeUppercase{PCI}e on Mainboards}
\nameref -> This is about PCIe on Mainboards normal
\lcnameref -> this is about PCIe on mainboards LowerCase
\ucnameref -> This Is About PCIe On Mainboards UpperCase
\fucnameref -> This is about PCIe on mainboards FirstUpperCase
我尝试nameref
通过复制的定义\nameref
并包装所有出现的来扩展\@thirdoffive{#1}
,\MakeLowercase
但结果却相当出乎意料:对于This Is a Section
我得到的输入11This Is a Sectionsection.1
。
我实际上必须复制 .sty 文件,因为在新的定义的序言中使用\makeatletter
/会导致有关未定义宏的警告。\makeatother
答案1
超引用/名称引用大量使用 -hook \AtBeginDocument
。
如果你想重新定义一些内部名称引用-package,您也需要使用\AtBeginDocument
-hook。
否则,你在序言中所做的更改将被覆盖,当超引用/名称引用的\AtBeginDocument
事情已经进行了。
下面的示例提供了三个宏\fucnameref
、\ucnameref
和\lcnameref
。
对于大小写转换宏尼古拉·塔尔博特 姆菲斯特克-package 被使用。
因此,在分段命令的参数中,你可以使用手动的那个包裹。
我强烈建议你读一下手动的因为它还解释了该软件包的许多缺陷。
使用该包,您可以使用前面的空组{}
来阻止命令的评估。例如,您可以使用{}\MakeUppercase
和{}\MakeLowercase
来确保大写字母/小写字母。
\documentclass{article}
\usepackage{hyperref}[2018/02/06 v6.86b Hypertext links for LaTeX]
\usepackage{mfirstuc}[2017/11/14 v2.06 (NLCT)]
\makeatletter
\AtBeginDocument{%
\newcommand\My@Macro[1]{#1}%
\newcommand\My@Thirdoffive[5]{\My@Macro{#3}}%
\renewcommand*\@namerefstar[1]{%
\HyRef@StarSetRef{#1}\My@Thirdoffive
}%
\renewcommand*\T@nameref[1]{%
\begingroup
\let\label\@gobble
\NR@setref{#1}\My@Thirdoffive{#1}%
\endgroup
}%
\DeclareRobustCommand\fucnameref{%
\@ifstar\fucnameref@star\fucnameref@nostar
}%
\newcommand\callemakefirstuc[1]{%
\MakeLowercase{\emakefirstuc{#1}}%
}%
\newcommand\fucnameref@star[1]{%
\begingroup
\let\My@Macro=\callemakefirstuc
\nameref*{#1}%
\endgroup
}%
\newcommand\fucnameref@nostar[1]{%
\begingroup
\let\My@Macro=\callemakefirstuc
\nameref{#1}%
\endgroup
}%
\DeclareRobustCommand\ucnameref{%
\@ifstar\ucnameref@star\ucnameref@nostar
}%
\newcommand\ucnameref@star[1]{%
\begingroup
\MFUhyphentrue
\let\My@Macro=\ecapitalisefmtwords
\nameref*{#1}%
\endgroup
}%
\newcommand\ucnameref@nostar[1]{%
\begingroup
\MFUhyphentrue
\let\My@Macro=\ecapitalisefmtwords
\nameref{#1}%
\endgroup
}%
\DeclareRobustCommand\lcnameref{%
\@ifstar\lcnameref@star\lcnameref@nostar
}%
\newcommand\lcnameref@star[1]{%
\begingroup
\let\My@Macro=\MakeLowercase
\nameref*{#1}%
\endgroup
}%
\newcommand\lcnameref@nostar[1]{%
\begingroup
\let\My@Macro=\MakeLowercase
\nameref{#1}%
\endgroup
}%
}%
\makeatother
\newcommand\SomeSectionTitle{%
Some very Nice section Title with
{}\texorpdfstring{{}\MakeUppercase{pci}}{PCI} and
{}\texorpdfstring{{}\MakeLowercase{PCI}}{{}pci}%
}
\begin{document}
\parindent=0ex
\parskip=\baselineskip
\begin{verbatim}
\newcommand\SomeSectionTitle{%
Some very Nice section Title with
{}\texorpdfstring{{}\MakeUppercase{pci}}{PCI} and
{}\texorpdfstring{{}\MakeLowercase{PCI}}{{}pci}%
}
\section{\SomeSectionTitle}\label{NiceLabel}
\end{verbatim}
yields:
\section{\SomeSectionTitle}\label{NiceLabel}
\verb|\nameref{NiceLabel}| yields:\\ \nameref{NiceLabel}
\verb|\fucnameref{NiceLabel}| yields:\\ \fucnameref{NiceLabel}
\verb|\ucnameref{NiceLabel}| yields:\\ \ucnameref{NiceLabel}
\verb|\lcnameref{NiceLabel}| yields:\\ \lcnameref{NiceLabel}
\verb|\nameref*{NiceLabel}| yields:\\ \nameref*{NiceLabel}
\verb|\fucnameref*{NiceLabel}| yields:\\ \fucnameref*{NiceLabel}
\verb|\ucnameref*{NiceLabel}| yields:\\ \ucnameref*{NiceLabel}
\verb|\lcnameref*{NiceLabel}| yields:\\ \lcnameref*{NiceLabel}
\end{document}
2018 年 9 月 7 日星期五编辑:
请不要尝试嵌套调用\fucnameref
或\ucnameref
或\lcnameref
——例如,不要尝试类似
\section{Some Nice Section}\label{NiceSection}
...
\section{annotations to \lcnameref*{NiceSection}}\label{Annotations}
...
\fucnameref{Annotations}