使用 fancyhdr 和 biblatex 在标题扩展中使用 nth 时无法访问?

使用 fancyhdr 和 biblatex 在标题扩展中使用 nth 时无法访问?

我真的很讨厌每次遇到 Latex 问题时都要问问题,而不是自己解决。但你看 - MWE 是test.tex

\documentclass[a4paper,12pt]{article}

\usepackage{filecontents}
\usepackage[utf8]{inputenx}
\usepackage{csquotes}
\usepackage[sorting=none,defernumbers=true]{biblatex}
\bibliography{\jobname}

\usepackage{hyperref}

\usepackage[super]{nth} % ordinals
\usepackage[level]{datetime}

\usepackage{lastpage}
\usepackage{fancyhdr}
\pagestyle{fancy}
\fancyhf{}% clear all fields

\begin{document}

\title{Oh, Latex \nth{1}...}
\author{Bob Whoever}
\newcommand{\mydate}{\formatdate{14}{02}{2017}}
\date{\mydate}%{\today}%
\makeatletter
\edef\tmptitle{\@title}% must edef here, then it is present in \fancyhead
\fancyhead[L]{\small \tmptitle}
\makeatother
\maketitle

What to do when Latex croaks with the "inaccessible"? Some people have said:

\blockquote[{\cite{mps01}}]{
Well, one can just look at error log - unfortunately, it is all too cryptic there...
}

\clearpage

\printbibliography %biblatex only

\begin{filecontents*}{\jobname.bib}
@misc{mps01,
  title={Looking into (error) logs of [the] Latex},
  url={http://www.example.com/just_example},
  author={Someone Else}
}
\end{filecontents*}

\end{document}

当您pdflatex test.tex第一次运行时,它就通过了。

然后,当你跑步时biber test,它就过去了。

然后,当您pdflatex test.tex第二次运行时,它会崩溃:

AED: lastpage setting LastPage
! Missing control sequence inserted.
<inserted text> 
                \inaccessible 
l.49 \end{document}

? X

哇,谢谢你提供的这个最没用的错误信息!

我现在可以告诉你 - 问题是我使用\nthAND\title使用\edef\tmptitle...AND 使用 biblatex 书目;如果其中任何一个不存在,那么就不会发生该死的错误。

那么,我该如何使用\nthin \title,以便在使用参考书目时可以使用\@titlein ?这里最终“无法访问”的原因是什么?\fancyheadbiblatex

答案1

简短回答

使用

 \let\tmptitle\@title

分析

你的问题是

\edef\tmptitle{\@title}

不可\nth扩展也不健壮。在大多数情况下,不应该使用\edef“通用”文本,而应该使用\protected@edef

\protected@edef\tmptitle{\@title}

虽然文本\tmptitle并不像人们所期望的那样,但这可以解决问题:

> \tmptitle=macro:
->Oh, Latex 1\relax \protect \textsuperscript  {st}....

可以让\nth引擎更强大

\usepackage{etoolbox}
\robustify\nth

因为您可以安全地使用它,\edef并且会得到

> \tmptitle=macro:
->Oh, Latex \nth {1}....

但是,您实际上只想复制\@title这里,可以使用\let

\let\tmptitle\@title

并且无需其他“摆弄”即可工作。

答案2

您的问题在于\edef\tmptitle{\@title}

您可以通过让 LaTeX\@title在完成后不会忘记来更普遍地解决此问题\maketitle

\documentclass[a4paper,12pt]{article}
\usepackage[super]{nth} % ordinals
\usepackage{fancyhdr}
\usepackage{etoolbox}

\makeatletter
\patchcmd{\maketitle}{\global\let\@title\@empty}{}{}{}
\patchcmd{\maketitle}{\global\let\@author\@empty}{}{}{}
\makeatother

\pagestyle{fancy}
\fancyhf{}% clear all fields
\makeatletter
\fancyhead[L]{\small\@title}
\makeatother
\setlength{\headheight}{13.6pt}

\begin{document}

\title{Oh, Latex \nth{1}...}
\author{Bob Whoever}
\maketitle

\clearpage
\mbox{} % let's produce a new page

\end{document}

间接策略可能更简单:

\documentclass[a4paper,12pt]{article}
\usepackage[super]{nth} % ordinals
\usepackage{fancyhdr}

\pagestyle{fancy}
\fancyhf{}% clear all fields
\fancyhead[L]{\small\papertitle}
\setlength{\headheight}{13.6pt}

\newcommand{\papertitle}{Oh, Latex \nth{1}...}

\begin{document}

\title{\papertitle}
\author{Bob Whoever}
\maketitle

\clearpage
\mbox{} % let's produce a new page

\end{document}

相关内容