通过 \author 命令获取姓氏

通过 \author 命令获取姓氏

我想将作者姓氏放在页眉中。这是我目前所做的:

\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 IIIDoctor 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}

最终,这个问题转化为一项优化练习。

相关内容