使用快捷方式归属作者(但不适用于 bib 项目)

使用快捷方式归属作者(但不适用于 bib 项目)

感谢这个伟大的社区和网站!这里有很多知识,我希望你能提出解决方案或为我指明正确的方向。我曾尝试搜索类似的查询,但尚未找到能帮助我找到答案的东西。

这就是问题所在。

我正在写一本关于名言的书,你可以想象,有些人名言多次出现,我想确保那些在整本书中多次被引用的人的归属一致。在最好的情况下,我希望有一个快捷方式可以调用,其中包含许多字符串。我尝试过的一些尝试如下:

\def\ReplaceStr#1{VladimirNabokov}[0]{

    {Vladimir Nabokov}
    {1899-1977}
    {Novelist, poet, translator, and professor in entomology}
    {Russia, USA, and Switzerland}
}

\newcommand{\authorVladimirNabokov}[0]{

    {Vladimir Nabokov}
    {1899-1977}
    {Novelist, poet, translator, and professor in entomology}
    {Russia, USA, and Switzerland}
}

以上是归因中包含的一般信息。除了特定的引言外,我还想添加有关首次引用引言的具体信息(在这种情况下,不使用bib项目)。

理想情况下,我希望采取快捷方式并将其作为参数/字符串集发送到我的命令,myattrib该命令负责处理不同参数的字体格式等

例如,下面将有两种类型的归因,一种是一般性的,没有任何具体的参考,第二种是一般信息 + 引用出现的具体信息。

\myattrib{\authorVladimirNabokov}

\myattriblong{\authVladimirNabokov{In}{the book "The Eye}}

正如您所见,我徒劳地尝试使用 ReplaceStr 作为一种替代方案,并使用新命令作为第二种替代方案,但效果并不好……它显示了所有信息,但都无法将字符串集合视为一组字符串;相反,所有内容在处理过程中都变成了一个单一的字符串。

提前感谢你的帮助!敬请,Jorgen


以下是根据请求提供的一些附加信息: 以下是我希望在文中引用的示例:

“我非常期待回到剑桥,能够直言不讳,而不是随心所欲:这两件事在家里是不可能的。剑桥是为数不多的几个地方之一,在这里你可以无限制地胡言乱语,而第二天当你说出完全相反的话时,没有人会反驳你或反驳你。”
伯特兰·罗素(1872-1970)
诺贝尔奖获得者、英国哲学家、逻辑学家等
“致艾丽丝·皮尔斯尔·史密斯的信(1893 年);发表于《伯特兰·罗素书信选集》第 1 卷:私人岁月(1884-1914 年),由尼古拉斯·格里芬编辑”

我之所以认为 bib 项不可行,仅仅是因为我理解 bib 项用于在集合的最后生成参考书目,而在这里我想将所有数据包含在引文旁边。bib 项的另一个问题是,例如,假设我有 20 条作者 X 的引文,我只希望在一个地方提供有关作者的一般信息,而不是在 20 个不同的 bib 项中 - 这是为了简化作者 X 可能进行的任何更新(例如在出版过程中的修订中)。

确实,也许有一种我不知道的可行的方法可以处理 bib 项目。多年来,我主要使用 latex 来撰写科学文章,因此我对 latex 的修改和对它的了解都围绕着科学出版的典型情况,即你可能会多次引用一篇文章。在引文集中,你只引用一次引文,但同一个作者却被多次引用。

希望这能阐明我希望实现的目标。

再次感谢。

答案1

我认为在这项任务中.bib文件非常有用。当然,提供引文来源正是.bib制作文件的目的。

作为使用 biblatex 创建人员登记册证明了它可以用于biblatex人员索引。Ulrike Fischer 在她的 TUGboat 文章中也展示了类似的情况(https://tug.org/TUGboat/tb35-3/tb111fischer.pdf)biblatex可用作地址数据库。使用biblatex\fullcite命令,最后无需完整的参考书目。

这是一个不太复杂的概念证明,灵感来自 Guido 的回答使用 biblatex 创建人员登记册

\documentclass[british]{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{babel}
\usepackage{csquotes}

\usepackage{filecontents}
\begin{filecontents}{person.dbx}
\DeclareDatamodelEntrytypes{person}
\DeclareDatamodelFields[type=list,datatype=name]{name}
\DeclareDatamodelFields[type=list,datatype=literal]{profession,country}
\DeclareDatamodelEntryfields[person]{name,date,profession,country}
\end{filecontents}

\begin{filecontents}{\jobname.bib}
@person{vladnab,
  name       = {Vladimir Nabokov},
  date       = {1899/1977},
  profession = {Novelist and poet and translator and professor in entomology},
  country    = {Russia and USA and Switzerland},
}
@person{russell,
  name       = {Bertrand Russell},
  date       = {1872/1970},
  profession = {Noble prize laureate and philosopher and logician},
  country    = {United Kingdom},
}
@inbook{alys,
  title     = {Letter to Alys Pearsall Smith (1893)},
  maintitle = {The Selected Letters of Bertrand Russell},
  volume    = {1},
  booktitle = {The Private Years (1884–1914)},
  editor    = {Nicholas Griffin},
}
\end{filecontents}

\usepackage[datamodel=person,backend=biber,style=authortitle,maxitems=999]{biblatex} 
\usepackage{hyperref}

\DeclareBibliographyDriver{person}{%
  \usebibmacro{bibindex}%
  \usebibmacro{begentry}%
  \printnames{name}%
  \newunit
  \printdate
  \newunit
  \printlist{profession}%
  \newunit
  \printlist{country}%
  \setunit{\bibpagerefpunct}\newblock
  \usebibmacro{pageref}%
  \newunit\newblock
  \iftoggle{bbx:related}
    {\usebibmacro{related:init}%
     \usebibmacro{related}}
    {}%
  \usebibmacro{finentry}}

\DeclareCiteCommand{\fullciteperson}
  {\usebibmacro{prenote}}
  {\usebibmacro{citeindex}%
   \usedriver{}{\thefield{entrytype}}}
  {\multicitedelim}
  {\usebibmacro{postnote}}

\addbibresource{\jobname.bib}

\makeatletter
\newenvironment{jorgenquote}[2]
{%
  \def\jorgenquote@temp@nameid{#1}%
  \def\jorgenquote@temp@citekey{#2}%
  \begingroup
  \quote
}
{%
  \endquote
  \endgroup
  \par
  \expandafter\fullciteperson\expandafter{\jorgenquote@temp@nameid}%
  \par
  \expandafter\fullcite\expandafter{\jorgenquote@temp@citekey}%
}
\makeatother

\begin{document}
\fullciteperson{vladnab}

\begin{jorgenquote}{russell}{alys}
I am looking forward very much to getting back to Cambridge, and being able to say what I think and not to mean what I say: two things which at home are impossible. Cambridge is one of the few places where one can talk unlimited nonsense and generalities without anyone pulling one up or confronting one with them when one says just the opposite the next day.
\end{jorgenquote}
\end{document}

无论如何,这是一个具有 的人员数据库的简单而天真的实现etoolbox

您可以使用 定义一个新的人\NewPerson{<id>}{<name>}{<date>}{<profession>}{<countries>}<id>用作人的内部标签/标识符,它应该是唯一的,并且应该只包含可以安全用作命令名称的字符(如果您只使用小写 ASCII 而不使用 TeX 的特殊字符,则应该没问题)。 人的所有属性都保存在内部宏 中jorgpd@<id>@<property>,可以使用 检索这些宏的内容\csuse

\documentclass[british]{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{babel}
\usepackage{etoolbox}

\newcommand*{\NewPerson}[5]{%
  \csdef{jorgpd@#1@name}{#2}%
  \csdef{jorgpd@#1@date}{#3}%
  \csdef{jorgpd@#1@professsion}{#4}%
  \csdef{jorgpd@#1@countries}{#5}%
}

\newcommand*{\AttributePerson}[1]{%
  \csuse{jorgpd@#1@name}%
  \space
  (\csuse{jorgpd@#1@date})%
  \space was a\space
  \csuse{jorgpd@#1@professsion}%
  \space from\space
  \csuse{jorgpd@#1@countries}.
}

\begin{document}
\NewPerson{vladnab}
  {Vladimir Nabokov}
  {1899-1977}
  {Novelist, poet, translator, and professor in entomology}
  {Russia, USA, and Switzerland}

\AttributePerson{vladnab}
\end{document}

对于这样的示例,有些人可能更喜欢键值接口,所以我复制了埃格尔回答xparse 和键值参数它实现了与 LaTeX3 的键值接口xparse

这次的\NewPerson语法是\NewPerson{<id>}{<prop_1>=<val_1>,...,<prop_n>=<val_n>},其中<prop_i>namedateprofession之一country。一个人的数据存储在所谓的属性列表中。

\documentclass[british]{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{babel}

\usepackage{expl3}
\usepackage{xparse}
\ExplSyntaxOn
% keys
\keys_define:nn { jorgen/person }
{
  name       .tl_set:N = \l_jorgen_person_name_tl,
  date       .tl_set:N = \l_jorgen_person_date_tl,
  profession .tl_set:N = \l_jorgen_person_profession_tl,
  countries  .tl_set:N = \l_jorgen_person_countries_tl,
}

% user level commands
\NewDocumentCommand{\NewPerson}{m m}
{
  \jorgen_newperson:nn { #1 } { #2 }
}

\NewDocumentCommand{\AttributePerson}{m}
{
  \jorgen_attributeperson:n { #1 }
}

% internal functions
\cs_new_protected:Npn \jorgen_newperson:nn #1 #2
{
  \group_begin:
  \prop_new:c { g_jorgen_person_#1_prop }
  \keys_set:nn { jorgen/person } { #2 }
  \prop_gput:cnV { g_jorgen_person_#1_prop } { name }       \l_jorgen_person_name_tl
  \prop_gput:cnV { g_jorgen_person_#1_prop } { date }       \l_jorgen_person_date_tl
  \prop_gput:cnV { g_jorgen_person_#1_prop } { profession } \l_jorgen_person_profession_tl
  \prop_gput:cnV { g_jorgen_person_#1_prop } { countries }  \l_jorgen_person_countries_tl
  \group_end:
}

\cs_new:Npn \jorgen_person_getvalue:nn #1 #2
{
  \prop_item:cn { g_jorgen_person_#1_prop } { #2 }
}
\cs_new_protected:Npn \jorgen_attributeperson:n #1
{
  \jorgen_person_getvalue:nn { #1 } { name }~
  (\jorgen_person_getvalue:nn { #1 } { date })~
  was~a~
  \jorgen_person_getvalue:nn { #1 } { profession }~
  from~
  \jorgen_person_getvalue:nn { #1 } { countries }.
}
\ExplSyntaxOff

\begin{document}
\NewPerson{vladnab}{
  name       = {Vladimir Nabokov},
  date       = {1899-1977},
  profession = {Novelist, poet, translator, and professor in entomology},
  countries  = {Russia, USA, and Switzerland},
}

\AttributePerson{vladnab}
\end{document}

两个示例的输出相同

弗拉基米尔·纳博科夫(1899-1977)是俄罗斯、美国和瑞士的小说家、诗人、翻译家和昆虫学教授。

相关内容