在微生物学中,第一次使用物种名称时,应完整写出属和种(大肠杆菌)。对于所有其他情况,应缩写属(大肠杆菌)。
我设法通过使用词汇表包来做到这一点。
然而,当引用另一个物种时,例如埃希氏菌 (Escherichia fergusonii),如果已经引用了大肠杆菌 (E. coli),则应直接缩写为 E. fergusonii,以避免重复。
我目前使用的方法自动缩写属名:
\documentclass[french]{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{lmodern}
\usepackage[a4paper]{geometry}
\usepackage{babel}
\usepackage[xindy]{glossaries}
\makeglossaries
\newglossaryentry{coli}{%
name = {\emph{Escherichia coli}},
description = {},
text = {\emph{E.~coli}},
first = {\glsname{coli}}
}
\newglossaryentry{fergusonni}{%
name = {\emph{Escherichia fergusonii}},
description = {},
text = {\emph{E.~fergusonii}},
first = {\glsname{fergusonni}}
}
\begin{document}
A list of bacteria: \gls{coli}, \gls{fergusonni}
\end{document}
- 当前输出:细菌列表:大肠杆菌、埃希氏杆菌
- 期望输出:细菌列表:大肠杆菌、E. fergusonii
我希望 Latex 能够自动检测该属是否已被引用,而不是在词汇表命令中手动强制使用缩写形式。
答案1
如果您不需要打印词汇表,那么您可以不用那么大的包裹。
\documentclass{article}
\ExplSyntaxOn
\NewDocumentCommand{\newspecies}{mmm}
{
\sabine_new_species:nnn { #1 } { #2 } { #3 }
}
\NewDocumentCommand{\species}{sm}
{
\textit
{
\IfBooleanTF { #1 }
{
\sabine_print_species_full:n { #2 }
}
{
\sabine_print_species:n { #2 }
}
}
}
\cs_generate_variant:Nn \tl_head:n { e }
\prop_new:N \g_sabine_genus_prop
\prop_new:N \g_sabine_species_prop
\seq_new:N \g_sabine_genus_used_seq
\cs_new_protected:Nn \sabine_new_species:nnn
{
\prop_gput:Nnn \g_sabine_genus_prop { #1 } { #2 }
\prop_gput:Nnn \g_sabine_species_prop { #1 } { #3 }
}
\cs_new_protected:Nn \sabine_print_species:n
{
\seq_if_in:NxTF \g_sabine_genus_used_seq { \prop_item:Nn \g_sabine_genus_prop { #1 } }
{% the genus has already been used
\tl_head:e { \prop_item:Nn \g_sabine_genus_prop { #1 } } . \nobreakspace
}
{% print the full genus
\prop_item:Nn \g_sabine_genus_prop { #1 }
% mark it as used
\seq_gput_right:Nx \g_sabine_genus_used_seq { \prop_item:Nn \g_sabine_genus_prop { #1 } }
\space
}
% print the species name
\prop_item:Nn \g_sabine_species_prop { #1 }
}
\cs_new_protected:Nn \sabine_print_species_full:n
{% bypass the check
\prop_item:Nn \g_sabine_genus_prop { #1 }
% mark it as used
\seq_if_in:NxF \g_sabine_genus_used_seq { \prop_item:Nn \g_sabine_genus_prop { #1 } }
{
\seq_gput_right:Nx \g_sabine_genus_used_seq { \prop_item:Nn \g_sabine_genus_prop { #1 } }
}
\space
% print the species name
\prop_item:Nn \g_sabine_species_prop { #1 }
}
\ExplSyntaxOff
\newspecies{coli}{Escherichia}{Coli}
\newspecies{fergus}{Escherichia}{Fergusonii}
\begin{document}
A list of bacteria: \species{coli}, \species{fergus}.
Here a full name: \species*{fergus}.
\end{document}
我为属和种设置了属性列表。当\species
找到时,将检查简称(示例中为coli
和)。如果该属已被使用,则只使用首字母(后跟句点和),否则将使用完整的属名。然后是物种名称,所有内容都用斜体表示。fergus
\nobreakspace
我还提供了\species*
打印完整属名(并将其标记为已使用)的功能。
答案2
一个解决方案是移至Escherichia
其自己的词汇表条目,如下所示:
\documentclass{article}
\usepackage{glossaries}
\makeglossaries
\newglossaryentry{esch}{%
name = {Escherichia},
description = {},
first = {\emph{Escherichia }},
text = {\emph{E.~}}, %define spaces here to use non breaking space only in abbreviated form
}
\newglossaryentry{coli}{%
name = {\emph{Escherichia coli}},
description = {},
text = {\gls{esch}\emph{coli}},
}
\newglossaryentry{fergusonni}{%
name = {\emph{Escherichia fergusonii}},
description = {},
text = {\gls{esch}\emph{fergusonii}},
}
\begin{document}
A list of bacteria: \gls{coli}, \gls{fergusonni}
\end{document}
一个可能的问题是,如果您打算将其用作\printglossary
条目,Escherichia
也会打印 - 如果是这种情况,请告知我们,以便我们进行修改。如果您不打算打印您的词汇表,那么希望这会有所帮助。