在我的文档中,我强调了提到的名字,现在我想在附录中提供有关它们的一些附加信息。目前我做了类似的事情:
\documentclass{scrartcl}
\usepackage{fontspec}
\setmainfont[Ligatures=TeX]{STIXGeneral}
\def\name#1{{\texorpdfstring{\smaller\MakeUppercase{#1}}{#1}}}
\begin{document}
Look at the works of \name{Alexandrov} and \name{Atkinson}.
\clearpage
\begin{section}*{Index of People}
\begin{itemize}
\item \name{Alexandrov}: Па́вел Серге́евич Алекса́ндров (Pavel Sergeyevich Alexandrov), \mbox{1896-05-07} – \mbox{1982-11-16}
\item \name{Atkinson}: Frederick Valentine Atkinson, \mbox{1916-01-25} – \mbox{2002-11-13}
\end{itemize}
\end{section}
\end{document}
是否可以将有关人员的信息保存在某些数据库文件中,就像对书目所做的那样,并自动格式化?是否有可用的工具或可以使用bibtex
?
JLDiaz 的回答似乎是一个很好的起点。更具体地说,数据文件应该如下所示:
@person{alexandrov,
name = {Па́вел Серге́евич Алекса́ндров},
latin = {Pavel Sergeyevich Alexandrov},
birthdate = {1896-05-07},
deathdate = {1982-11-16}
}
当然,可能会添加更多字段(例如职业、出生和死亡地点、国籍)。因此,无论我使用的是bibtex
还是gloss
包,我都必须定义自己的样式文件。这两种方法有什么区别?
至于定义自定义条目类型,我发现Biblatex 和自定义 bibtex 条目 - 可能吗?,但那里的解释似乎结构不完善/不完整,而且可能过时了。也许有人可以详细说明一下。
答案1
该datatool
软件包就是为此类事情而设计的。.bib
如果您愿意,甚至可以将其与文件一起使用。有关更多详细信息,请参阅(非常详细的)软件包文档。我将提供一个更简单的版本。
假设你有一个namedb.csv
如下文件:
"Name","Latin","Birthdate","Deathdate"
"Па́вел Серге́евич Алекса́ндров","Pavel Sergeyevich Alexandrov","1896--05--07","1982--11--16"
"Па́вел","Pavel","1896--01--01","1982--01--01"
然后你可以做一个 itemize 环境或者(我认为更好)一个(长)表:
\documentclass{article}
\usepackage{libertineotf}% don't have your STIX font
\usepackage[margin=2cm]{geometry}
\usepackage{longtable,datatool}
\usepackage{enumitem}
\usepackage{parskip}
\parindent0pt
% ------------------------------8<------------------------------ %
\begin{document}
\DTLloaddb{namedb}{namedb.csv}%
% --- Itemize version
\begin{itemize}
\DTLforeach{namedb}{%
% "Name","Latin","Birthdate","Deathdate"
\name=Name,%
\latinname=Latin,%
\birthdate=Birthdate,%
\deathdate=Deathdate% pay attention to spacing in this command
}%
{%
\item \name: \latinname, \birthdate\,---\,\deathdate
}
\end{itemize}
% --- Longtable version (for tables longer than one page)
\DTLdisplaylongdb[%
% caption={Index of People},%
label={peopleindex},%
contcaption={Index of People (continued)},% <-- if more than one page
foot={\em Continued on next page},%
lastfoot={},%
]{namedb}
\end{document}
事实上,还有很多事情可以做。但由于我不知道您的确切需求,所以我将尽量简单。
答案2
您可能希望将 biblatex 2.0 与 biber 1.0 一起用作 bibtex 替换后端。新\DeclareDatamodel
功能将允许您在 .bib 文件中定义此类条目,只要您编写一些样式代码来格式化它们,然后就可以使用过滤器打印此类列表\printbibliography
。这是一个可行的粗略示例 - 我没有微调字体切换等。
\begin{filecontents}{test.bib}
@PERSON{alexandrov,
NAME = {Па́вел Серге́евич Алекса́ндров},
LATINNAME = {Pavel Sergeyevich Alexandrov},
DATE = {1896-05-07/1982-11-16},
}
\end{filecontents}
\begin{filecontents}{person.dbx}
\DeclareDatamodelEntrytypes{person}
\DeclareDatamodelFields[type=list, datatype=name]{name, latinname}
\DeclareDatamodelEntryfields[person]{
name,
latinname,
day,
endday,
month,
endmonth,
year,
endyear}
\end{filecontents}
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage[T2A]{fontenc}
\usepackage[english,russian]{babel}
\usepackage[datamodel=person,style=authoryear]{biblatex}
\DeclareLabelname{shortauthor,author,shorteditor,editor,translator,name,latinname}
\newbibmacro*{personname}{%
\printnames{name}%
\ifnameundef{latinname}
{}
{\addspace\mkbibparens{\printnames{latinname}}}}
\DeclareBibliographyDriver{person}{%
\usebibmacro{bibindex}%
\usebibmacro{begentry}%
\usebibmacro{personname}%
\setunit{\labelnamepunct}\newblock
\printdate
\usebibmacro{finentry}}
\addbibresource{test.bib}
\begin{document}
\cite{alexandrov}
\printbibliography[title=People,type=person]
\end{document}
答案3
从技术上讲,你要求的是一对列表名称定义,因此可以使用任何工具来管理词汇表。
但既然你提到了使用bibtex
,我想你可能对包感兴趣光泽,存储对名称定义在.bib
文件中并用于bibtex
提取乳胶文档中引用的名称列表。