![使用 fancyhdr 和 biblatex 在标题扩展中使用 nth 时无法访问?](https://linux22.com/image/349491/%E4%BD%BF%E7%94%A8%20fancyhdr%20%E5%92%8C%20biblatex%20%E5%9C%A8%E6%A0%87%E9%A2%98%E6%89%A9%E5%B1%95%E4%B8%AD%E4%BD%BF%E7%94%A8%20nth%20%E6%97%B6%E6%97%A0%E6%B3%95%E8%AE%BF%E9%97%AE%EF%BC%9F.png)
我真的很讨厌每次遇到 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
哇,谢谢你提供的这个最没用的错误信息!
我现在可以告诉你 - 问题是我使用\nth
AND\title
使用\edef\tmptitle...
AND 使用 biblatex 书目;如果其中任何一个不存在,那么就不会发生该死的错误。
那么,我该如何使用\nth
in \title
,以便在使用参考书目时可以使用\@title
in ?这里最终“无法访问”的原因是什么?\fancyhead
biblatex
答案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}