我使用以下代码在“书籍”文档中概括按章节列出的参考书目,但这会将“章节编号:”附加到所有章节,包括未编号的章节。我如何修改代码以仅将其附加到编号的章节?
梅威瑟:
\documentclass{book}
\usepackage{lipsum}
\usepackage[backend=biber,
natbib=true,
style=authoryear]{biblatex}
\usepackage{nameref} % For ref. by segment
\addbibresource{biblatex-examples.bib}
\defbibheading{bibintoc}{%
\section*{Chapter \ref{refsegment:\therefsection\therefsegment}:
\nameref{refsegment:\therefsection\therefsegment}}
}
\begin{document}
\chapter{Numbered chapter}
\setcounter{chapter}{1}
\begin{refsegment}
\lipsum[1]
\cite{glashow,weinberg}
\end{refsegment}
\chapter*{Unnumbered}
\begin{refsegment}
\lipsum[2]
\cite{reese}
\end{refsegment}
\printbibheading
\bibbysegment[heading=bibintoc]
\end{document}
答案1
如果您加载该hyperref
包,则有关标签是用于编号章节还是未编号章节的信息将写入.aux
文件中。然后您可以通过结果的第四个元素访问此信息\real@setref
并提供适当的文本。
对于编号章节,第四个元素代表chapter.7
第 7 章;对于未编号章节,其形式为chapter*.1
。您可以使用xstring
包来检查子字符串是否存在*.
这是一个宏\mychref
,它根据章节是否编号来打印您想要的标题文本类型。
\makeatletter
\newcommand*{\mychref}[1]{\IfSubStr{%
\expandafter\real@setref\csname r@#1\endcsname\@fourthoffive{#1}%
}{*.}{}{Chapter \ref{#1}: }\nameref{#1}}
\makeatother
\documentclass{book}
\usepackage{lipsum}
\usepackage[backend=biber,
natbib=true,
style=authoryear]{biblatex}
\usepackage{xstring,nameref,hyperref}
\makeatletter
\newcommand*{\mychref}[1]{\IfSubStr{%
\expandafter\real@setref\csname r@#1\endcsname\@fourthoffive{#1}%
}{*.}{}{Chapter \ref{#1}: }\nameref{#1}}
\makeatother
\addbibresource{biblatex-examples.bib}
\defbibheading{bibintoc}{%
\section*{\mychref{refsegment:\therefsection\therefsegment}}
}
\begin{document}
\chapter{Numbered chapter}
\setcounter{chapter}{1}
\begin{refsegment}
\lipsum[1]
\cite{glashow,weinberg}
\end{refsegment}
\chapter*{Unnumbered}
\begin{refsegment}
\lipsum[2]
\cite{reese}
\end{refsegment}
\printbibheading
\bibbysegment[heading=bibintoc]
\end{document}