我正在写论文,需要在目录 (TOC)、章节标题和页眉中的编号 (A、B、C、...) 之前添加“附录”。我还想\autoref{}
输出“附录 A”。
我正在使用 scrbook 类并尝试了几种不同的方法来实现这一点,但没有一种方法能给我想要的输出。
我希望标题显示如下,即“附录 A(标题)”。这也是我希望它在目录和标题中显示的方式。
我尝试使用 KOMA 选项appendixprefix=true
,但是这会将附录 A 和更多信息分成不同的行,并且不会在目录中将“附录”放在 A 之前。
我尝试重新定义\thechapter
,以便\renewcommand{\thechapter}{Appendix \Alph{chapter}
在文档的标题和页眉中获得所需的输出,但目录输出在下面,而\autoref{}
的输出是“附录附录 A”。
我也尝试过附录包,但是它不会将附录添加到正文的标题中,只会添加到目录中。
我还尝试了一些其他的技巧,这些技巧在目录和标题中都有效,但在标题中显示前一章。
我使用以下内容设置标题
\usepackage{fancyhdr}
\setlength{\headheight}{15pt}
\pagestyle{fancy}
\renewcommand{\chaptermark}[1]{ \markboth{\thechapter~#1}{} } % Adds chapter number name to right header
\renewcommand{\sectionmark}[1]{ \markright{\thesection~#1}{} } % Adds section name to left header
我真的很感激对此的一些帮助,因为我找不到使用 scrbook 类的适用于我的 3 个主要情况(标题、目录和页眉)的解决方案。
梅威瑟:
\documentclass[12pt,a4paper,oneside,pointlessnumbers]{scrbook}
\usepackage[english]{babel}
\usepackage{blindtext}
\usepackage{fancyhdr}
\usepackage[colorlinks]{hyperref}
\setlength{\headheight}{15pt}
\pagestyle{fancy}
\renewcommand{\chaptermark}[1]{ \markboth{\thechapter~#1}{} }
\renewcommand{\sectionmark}[1]{ \markright{\thesection~#1}{} }
\begin{document}
\frontmatter
\tableofcontents
\mainmatter
\blinddocument
\appendix
\chapter{More Information} \label{app:first}
\section{Another Section}
\autoref{app:first}
\Blindtext
\end{document}
答案1
将以下几行添加到你的序言中:
\makeatletter
\g@addto@macro\appendix{%
\renewcommand*{\chapterformat}{%
{\chapapp\nobreakspace\thechapter\autodot\enskip}%
}
\renewcommand*{\chaptermarkformat}{%
{\chapapp\nobreakspace\thechapter\autodot\enskip}%
}
\let\oldaddcontentsline\addcontentsline
\newcommand\hackedaddcontentsline[3]{\oldaddcontentsline{#1}{#2}{\chapapp\nobreakspace#3}}
\let\oldchapter\chapter
\renewcommand*\chapter[1]{%
\let\addcontentsline\hackedaddcontentsline%
\oldchapter{#1}%
\let\addcontentsline\oldaddcontentsline%
}
}
\makeatother
我们\g@addto@macro
在命令中添加\appendix
以下修改:
- 我们重新定义
\chapterformat
,在章节号前添加“附录”字样。 - 我们重新定义
\chaptermarkformat
,在页眉的章节号前添加“附录”字样。 \addcontentsline
代码的其余部分仅针对命令重新定义了含义\chapter
,因此也在目录中添加了“附录”一词。
该命令\autoref
按预期工作。
梅威瑟:
\documentclass[numbers=noenddot]{scrbook}
\usepackage[colorlinks]{hyperref}
\makeatletter
\g@addto@macro\appendix{%
\renewcommand*{\chapterformat}{%
{\chapapp\nobreakspace\thechapter\autodot\enskip}%
}
\renewcommand*{\chaptermarkformat}{%
{\chapapp\nobreakspace\thechapter\autodot\enskip}%
}
\let\oldaddcontentsline\addcontentsline
\newcommand\hackedaddcontentsline[3]{\oldaddcontentsline{#1}{#2}{\chapapp\nobreakspace#3}}
\let\oldchapter\chapter
\renewcommand*\chapter[1]{%
\let\addcontentsline\hackedaddcontentsline%
\oldchapter{#1}%
\let\addcontentsline\oldaddcontentsline%
}
}
\makeatother
\begin{document}
\tableofcontents
\chapter{1st chapter}
\section{1st section}
\chapter{2nd chapter}
\section{2nd section}
\appendix
\chapter{1st appendix chapter}\label{app:first}
\section{1st appendix section}
\chapter{2nd appendix chapter}
\section{2nd appendix section}
\autoref{app:first}
\end{document}
输出 (ToC)
输出(附录)
答案2
更新使用 LaTeX 版本 2021/06/01 和 KOMA-Script 版本 3.34:
\documentclass[
oneside,
numbers=noenddot
]{scrbook}
\usepackage{blindtext}% dummy text
\usepackage{biblatex}
\usepackage[colorlinks]{hyperref}
\AddToHook{cmd/appendix/after}{%
\AddToHook{cmd/chapterformat/before}{\chapapp\nobreakspace}%
\AddToHook{cmd/chaptermarkformat/before}{\chapapp\nobreakspace}%
\addtocontents{toc}{\appendixtocentry}%
}
\NewDocumentCommand{\appendixtocentry}{}{%
\DeclareTOCStyleEntry[
entrynumberformat=\tocappendixnumber,
dynnumwidth
]{chapter}{chapter}%
}
\NewDocumentCommand{\tocappendixnumber}{m}{%
\appendixname~#1%
}
\addbibresource{biblatex-examples.bib}
\begin{document}
\tableofcontents
\blinddocument
\appendix
\chapter{First chapter in appendix}\label{app:first}
\section{Section in appendix}
See \autoref{app:first}
\Blindtext[10]
\blinddocument
\nocite{*}
\printbibliography[heading=bibintoc]
\end{document}
运行三次即可获得
更新使用(最终版本)TL2018 或更新版本:
\documentclass[
oneside,
numbers=noenddot,
appendixprefix
]{scrbook}
\usepackage{blindtext}% dummy text
\usepackage{xpatch}
\xapptocmd{\appendix}{%
\renewcommand*{\chapterformat}{\chapapp\nobreakspace\thechapter\autodot\enskip}%
\renewcommand*{\chaptermarkformat}{\chapapp\nobreakspace\thechapter\autodot\enskip}%
\addtocontents{toc}{%
\RedeclareSectionCommand[
tocdynnumwidth,
tocentrynumberformat=\tocappendixnumber
]{chapter}%
}%
}{}{\PatchFailed}
\newcommand\tocappendixnumber[1]{\chapapp~#1}
\usepackage{biblatex}
\addbibresource{biblatex-examples.bib}
\usepackage[colorlinks]{hyperref}
\begin{document}
\tableofcontents
\blinddocument
\appendix
\chapter{First chapter in appendix}\label{app:first}
\section{Section in appendix}
See \autoref{app:first}
\Blindtext[10]
\blinddocument
\nocite{*}
\printbibliography[heading=bibintoc]
\end{document}
运行三次即可获得
原始答案
以下是需要 KOMA-Script 版本 3.20 或更新版本的建议:
\documentclass[
oneside,
numbers=noenddot,
appendixprefix
]{scrbook}[2016/05/10]% needs version 3.20 or newer
\usepackage{blindtext}% dummy text
\usepackage{xpatch}
\xapptocmd{\appendix}{%
\addtocontents{toc}{%
\RedeclareSectionCommand[
tocdynnumwidth,
tocentrynumberformat=\tocappendixnumber
]{chapter}%
}%
}{}{\PatchFailed}
\newcommand\tocappendixnumber[1]{\chapapp~#1}
\usepackage{hyperref}
\begin{document}
\tableofcontents
\blinddocument
\appendix
\chapter{First chapter in appendix}\label{app:first}
\section{Section in appendix}
See \autoref{app:first}
\Blindtext[10]
\blinddocument
\end{document}
运行三次得到:
答案3
对于表单中的标题Appendix A (title)
和中的条目的格式TOC
,有一个“快速而肮脏”的解决方案,通过重新定义命令section
,但这不是\autoref
问题。
\documentclass{scrbook}
\usepackage[manualmark]{scrpage2}
\usepackage{blindtext} % Not really needed
\usepackage{hyperref}
\newcommand*{\CurrentSectionTitle}[1]{#1}%
\begin{document}
\tableofcontents
\chapter{Some Content}
\section{Hello}
In \autoref{Section::NumberTwo} it is shown that \[ E = m c^2 \]
\section{Hello Again}
\label{Section::NumberTwo}%
In \autoref{Appendix::B} it is shown again that \[ E = m c^2 \]
holds.
\cleardoublepage
%%%% Now appendix stuff
% Set counter format to letters
\renewcommand{\thesection}{\Alph{section}}
\let\LaTeXStandardSection\section
% Quick and dirty version of a `section wrapper`
\renewcommand*{\section}[1]{% Does not work if optional argument is desired!
\renewcommand*{\CurrentSectionTitle}{#1}%
\refstepcounter{section}% Needed, since starred version of section command (see below)
\addcontentsline{toc}{chapter}{\protect{\appendixname~\thesection~\CurrentSectionTitle}} % Change if not appropiate format
%Prevent entry with number in TOC, since starred version of standard section command
\LaTeXStandardSection*{\appendixname~\thesection~\CurrentSectionTitle}%
}%
\pagestyle{scrheadings}
\appendix
\section{Number One}
\blindtext[5] % Some dummy text
\section{Number Two}
\label{Appendix::B}
\blindtext
\section{Number Three}
\blindtext
\end{document}
如上所述,这是一个快速而肮脏的解决方案,也许有比重新定义部分命令更好的方法(在我的情况下没有完全完成,因为它不允许使用TOC
短标题)
关于\autoref
,有一个\sectionautorefname
命令可以重新定义为
\renewcommand*{\sectionautorefname}{\appendixname}
但是,之后每次出现节自动引用时都会用到它。到目前为止,我还没有找到绕过这个问题的解决方案。