我尝试将 \autoref 从子节重命名为节。但似乎 [english]{babel} 以某种方式阻止了它。有趣的是,它适用于子节(但我不使用它们)。
\documentclass[11pt,numbers=noenddot,bibliography=totocnumbered,twoside]{scrreprt}
\usepackage[english]{babel}
% \let\subsectionautorefname\sectionautorefname
\def\subsectionautorefname{section}
\def\subsubsectionautorefname{section} %define subsection as section and subsub to section
\usepackage[unicode]{hyperref} %Hyperlinks in text as reference unicode to use in references
\begin{document}
\chapter{Chapter}
\section{Section}
\label{sec}
\subsection{Foo}
\label{ssec:foo}
This is the overview.
\subsubsection{Bar}
\label{sssec:bar}
This is the small part.
Later in the text, we refer to \autoref{sec}, \autoref{ssec:foo} and \autoref{sssec:bar}.
\end{document}
我也尝试过这里进行测试。另外 \let\subsectionautorefname\sectionautorefname 也不要更改它。
有没有其他方法,无需更改文档类别或进行其他重大更改?
诚挚的问候,DeepWater
答案1
您scrreprt
可以使用 KOMA-Script 命令\defcaptionname
:
\defcaptionname*{english}{\subsectionautorefname}{section}
\defcaptionname*{english}{\subsubsectionautorefname}{section}
如果要引用子小节的编号(使用\autoref or
\ref`),则必须对该子小节进行编号。因此,您必须添加:
\setcounter{secnumdepth}{\subsubsectionnumdepth}
你的序言。
例子:
\documentclass[11pt,numbers=noenddot,bibliography=totocnumbered,twoside]{scrreprt}
\usepackage[english]{babel}
\defcaptionname*{english}{\subsectionautorefname}{section}
\defcaptionname*{english}{\subsubsectionautorefname}{section}
\usepackage[unicode]{hyperref}
\setcounter{secnumdepth}{\subsubsectionnumdepth}% subsubsections should be numbered
\begin{document}
\chapter{Chapter}
\section{Section}\label{sec}
\subsection{Foo}\label{ssec:foo}
This is the overview.
\subsubsection{Bar}\label{sssec:bar}
This is the small part.
Later in the text, we refer to \autoref{sec}, \autoref{ssec:foo} and \autoref{sssec:bar}.
\end{document}
答案2
谢谢 daleif 和 Bernard,
提前加载 hyperref 不会改变任何内容,但将定义放在 \begin{document} 之后可以解决这个问题。
在您建议的顺序之后,还会进行更多测试
\usepackage[unicode]{hyperref}
\usepackage[english]{babel}
而且,无论定义在哪里,都是独立的。
多谢。
答案3
hyperref 具有语言支持,当它检测到 babel 时,它会将 autoref 定义添加到 \extrasenglish。要覆盖定义,您也应该在那里添加更改(在 hyperref 更改之后)。正如 Mico 所写,为了使 \subsubsection 的行为正确(关于文本和计数器),您应该设置secnumdepth
。
\documentclass[11pt,numbers=noenddot,bibliography=totocnumbered,twoside]{scrreprt}
\usepackage[english]{babel}
\usepackage[unicode]{hyperref}
\addto\extrasenglish{%
\def\subsectionautorefname{section}%
\def\subsubsectionautorefname{section}%
}
\setcounter{secnumdepth}{3}
\begin{document}
\chapter{Chapter}
\section{Section}
\label{sec}
\subsection{Foo}
\label{ssec:foo}
This is the overview.
\subsubsection{Bar}
\label{sssec:bar}
This is the small part.
Later in the text, we refer to \autoref{sec}, \autoref{ssec:foo} and \autoref{sssec:bar}
\end{document}
答案4
您遇到的问题是不是与您使用该包有关。相反,问题是babel
由于以下原因引起的。在scrreport
文档类中,计数器的默认值为,这意味着只有节级和子节级标题被编号,而子子节级标题则没有。您可以通过查看 MWE 的输出来验证这一说法:标题“Bar”根本没有编号。由于它没有编号,因此标签不指向该标题。secnumdepth
2
{sssec:bar}
secnumdepth
补救办法是增加via 的值\setcounter{secnumdepth}{3}
。
附录:关于小节和小子节的“标签”:我不会摆弄等。而是在之后使用选项\def\subsectionautorefname
加载包。这样,生成的交叉引用将自动看起来像生成的交叉引用。cleveref
hyperref
nameinlink
\cref
\autoref
\documentclass[11pt,numbers=noenddot,twoside]{scrreprt}
\setcounter{secnumdepth}{3} % new
\usepackage[english]{babel}
\usepackage{hyperref}
\usepackage[nameinlink]{cleveref}
\begin{document}
\chapter{Chapter}
\section{Section} \label{sec}
\subsection{Foo} \label{ssec:foo}
\subsubsection{Bar} \label{sssec:bar}
\cref{sec}, \cref{ssec:foo}, \cref{sssec:bar}
\end{document}