我想将作者姓氏放在页眉中。这是我目前所做的:
\documentclass{article}
\author{Foo Bar, Baz Bah}
\usepackage{fancyhdr}
\pagestyle{fancy}
\fancyhf{}
\lhead{Bar, Bah}
\begin{document}
\thispagestyle{empty}
\maketitle
\clearpage
\chapter{Introduction}
\clearpage
\chapter{Conclusion}
\end{document}
但是,根据 DRY 原则,我想避免在多个地方定义名称。相反,我想从\author
以前使用过的命令中提取此信息。这可能吗?
答案1
手动方法可能更容易。bib{tex,latex}
为此有很多代码,并且它始终基于在数据库中手动划分它们的事实。
例如(假名),我是 John Francis Smith --- 我的姓氏是“Smith”。但我隔壁的同事是 Pablo Rojas Verde,他的姓氏是“Rojas Verdes”。参见https://shinesolutions.com/2018/01/08/falsehoods-programmers-believe-about-names-with-examples/甚至更好的例子(请特别注意第30点)。
我会采取相反的方法(很多期刊都这样做):
% keep together in the source
\newcommand{\fullnames}{John Francis Smith, Pablo Rojas Verde}
\newcommand{\runningnames}{Smith, Rojas Verdes}
...
\authors{\fullnames}
...
\lhead{\runningnames}
...并在需要时使用宏。您只有一个点可以进行更改,但姓名和姓氏的区分必须基本手动完成。
答案2
自动化解决方案的实用性取决于需要管理的信息量。
但是,正如另一个答案中提到的那样,标记数据仍然必须由人类/人工智能完成。(例如,当混合使用姓氏优先和名字优先的排版时。例如,多词名称。例如,等级、头衔、职位、描述符:Dumas fils
,,Thurston-Howell III
。Doctor Zhivago
)
给定一些规则,字符串解析或正则表达式可以作为解决方案。(请注意,该\author
命令应扩展为进一步的命令和要排版的材料的混合,因此 expl3 的正则表达式是最好的:它可以区分两者。)
在这里,为了说明所需的复杂程度(即使只有一个名字),我展示了两种结构化信息存储和检索方法:原子手动和自动化;后者使用现有的书目机制。
(一)使用手册
使用宏,从简单组件构建复合组件。基本上,命名所有数据元素,然后组装它们。
平均能量损失
\documentclass{book}
\newcommand\authorgivennamea{Foo}
\newcommand\authorfamilynamea{BarFamily}
\newcommand\authorgivennameb{Bar}
\newcommand\authorfamilynameb{BahFamily}
\newcommand\aspace{\ }
\newcommand\acomma{,}
\newcommand\authornamedelimiter{\aspace}
\newcommand\authornamesdelimiter{\acomma\aspace}
\newcommand\authora{\authorfamilynamea\authornamedelimiter\authorgivennamea}
\newcommand\authorb{\authorfamilynameb\authornamedelimiter\authorgivennameb}
\newcommand\authorhead{\authorfamilynamea\authornamesdelimiter\authorfamilynameb}
\title{Some Title}
\author{\authora\authornamesdelimiter\authorb}
\usepackage{fancyhdr}
\pagestyle{fancy}
\fancyhf{}
\lhead{\authorhead}
\begin{document}
\thispagestyle{empty}
\maketitle
\clearpage
\chapter{Introduction}
\clearpage
\chapter{Conclusion}
\end{document}
二、书目
结构化信息意味着数据库;书目信息是数据库的;所以,让我们使用biblatex
一个.bib
文件。
使用如下 bib 条目:
@book{currentauthors,
author={Foo Barfamily and Bar Bahfamily},
}
并使用作者年份样式
\usepackage[style=authoryear]{biblatex}
并使用\citeauthor
引用命令作为标题
\lhead{\citeauthor{currentauthors}}
我们得到了这个
开箱即用,因为biblatex
/biber
已经知道作者姓名列表以及如何解析和处理它们。
如果需要,可以定制引用命令(例如,输出,
为分隔符而不是and
(两个名称)),
平均能量损失
\begin{filecontents*}[overwrite]{\jobname.bib}
@book{currentauthors,
author={Foo Barfamily and Bar Bahfamily},
}
\end{filecontents*}
\documentclass{book}
\usepackage[style=authoryear]{biblatex}
\addbibresource{\jobname.bib}
\title{Some Title}
\author{\citeauthor{currentauthors}}
\usepackage{fancyhdr}
\pagestyle{fancy}
\fancyhf{}
\lhead{\citeauthor{currentauthors}}
\begin{document}
\thispagestyle{empty}
\maketitle
\clearpage
\chapter{Introduction}
\clearpage
\chapter{Conclusion}
\end{document}
最终,这个问题转化为一项优化练习。