nameref 的大写变体

nameref 的大写变体

一些可以生成内联文本的软件包(例如词汇表、cleverref) 有命令让作者选择大写。特别是,词汇表似乎能够自动完成部分操作。

但是,nameref(该nameref包的)无法更改引用文本的大小写。正如nameref通常用于引用大写文本的章节标题一样,当大写字母保持在句子中间时,文本看起来会变得不正确。

虽然有一个答案这里解决了这个问题,它依赖于在每个需要调整大写字母的字母前面插入一个宏。

  1. 鉴于有修改大写的命令可用(\MakeUppercase\MakeLowercase\makefirstuc), 为什么提供nameref返回全部小写或除首字母小写外所有字母均小写的名称的命令如此困难?

  2. 是否有可能保护标题的各个部分不受大写字母变化的影响?(即\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}

相关内容