细菌分类学中的自动缩写-一个属的多个物种

细菌分类学中的自动缩写-一个属的多个物种

在微生物学中,第一次使用物种名称时,应完整写出属和种(大肠杆菌)。对于所有其他情况,应缩写属(大肠杆菌)。

我设法通过使用词汇表包来做到这一点。

然而,当引用另一个物种时,例如埃希氏菌 (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也会打印 - 如果是这种情况,请告知我们,以便我们进行修改。如果您不打算打印您的词汇表,那么希望这会有所帮助。

相关内容